• [cf1552E]Colors and Intervals


    记$pos_{i,j}$表示第$i$种颜色的第$j$个点,考虑如下构造——

    将所有颜色$pos_{i,2}$从小到大排序,并对前$\lceil\frac{n}{k-1}\rceil$种颜色选$[pos_{i,1},pos_{i,2}]$作为其区间

    将剩下的颜色按$pos_{i,3}$从小到大排序,并对前$\lceil\frac{n}{k-1}\rceil$种颜色选$[pos_{i,2},pos_{i,3}]$作为其区间

    ……

    重复此过程,注意到会选$k-1$次,也即会确定所有区间(若颜色不足就全选并结束)

    另一方面,考虑任意两组的区间,不难发现两两不交,进而即每一个位置至多被覆盖$\lceil\frac{n}{k-1}\rceil$次

    时间复杂度为$o(nk\log n)$,可以通过

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 #define N 105
     4 vector<int>v[N];
     5 int n,m,x,tmp,id[N],a[N],b[N],vis[N];
     6 bool cmp(int x,int y){
     7     return v[x][tmp]<v[y][tmp];
     8 }
     9 int main(){
    10     scanf("%d%d",&n,&m);
    11     for(int i=1;i<=n*m;i++){
    12         scanf("%d",&x);
    13         v[x].push_back(i);
    14     }
    15     for(int i=1;i<=n;i++)id[i]=i;
    16     for(int i=1;i<m;i++){
    17         tmp=i,sort(id+1,id+n+1,cmp);
    18         int cnt=(n-1)/(m-1)+1;
    19         for(int j=1;j<=n;j++)
    20             if (!vis[id[j]]){
    21                 x=id[j],vis[x]=1;
    22                 a[x]=v[x][i-1],b[x]=v[x][i];
    23                 if (--cnt==0)break;
    24             }
    25     }
    26     for(int i=1;i<=n;i++)printf("%d %d\n",a[i],b[i]);
    27     return 0;
    28 }
    View Code
  • 相关阅读:
    linux下svn命令大全
    php常用函数
    在centos上设置计划任务
    sphinx使用心得
    sphinx2.8.8的配置文件
    Mac使用
    sftp
    uwp应用在debug模式下运行正常,编译为release版本的时候抛出异常
    win10 uwp 读取resw资源文件
    dll被设置为用记事本打开的解决方法
  • 原文地址:https://www.cnblogs.com/PYWBKTDA/p/15602529.html
Copyright © 2020-2023  润新知