[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

 

posted @ 2021-11-25 14:24  PYWBKTDA  阅读(72)  评论(0编辑  收藏  举报