[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 }