题解:CF2157C Meximum Array 2
Hog_Dawa_IOI · · 题解
题意
给你三个正整数
一个数组
- 如果
c_i=1 ,那么\min(a_l,a_{l+1},\dots a_r)=k ; - 否则
\operatorname{MEX}(a_l,a_{l+1},\dots a_r)=k 。
注意
请你找出一个长度为
解法
尝试挖掘
- 如果一个数组的
\min=k ,那么该区间内0\sim k-1 的数不能出现,且k 至少出现一次。>k 的随便。 - 如果一个数组的
\operatorname{MEX}=k ,那么该区间内0\sim k-1 的数都必须出现至少一次,且k 不出现。>k 的随便。
我们惊讶地发现:
所以对于同时被
没有被任何限制包括的位置也随便了。
然后只被
最后是只被
#include<stdio.h>
int t,n,k,q,typ[105],ans[105];
int op[105],l[105],r[105];
int main()
{
scanf("%d",&t);while(t--)
{
scanf("%d%d%d",&n,&k,&q);
for(int i=1;i<=n;i++) typ[i]=0,ans[i]=-1;
for(int i=1;i<=q;i++)
{
scanf("%d%d%d",&op[i],&l[i],&r[i]);
for(int j=l[i];j<=r[i];j++)
typ[j]|=op[i];
}
for(int i=1;i<=n;i++)
{
if(typ[i]==3||typ[i]==0) ans[i]=k+1;
else if(typ[i]==1) ans[i]=k;
}
for(int i=1,wh=0;i<=n;i++)
if(ans[i]==-1) ans[i]=wh,wh=(wh+1)%k;
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
putchar('\n');
}
}