题目链接:哆啦A梦传送门
题意:给出一个n,m,让你找出长为n的一串最小字典序,然后给m个区间,满足区间内的任意两个数都不一样。
题解:模拟。
代码:
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int maxn=100010;
struct node{
int l,r;
bool operator < (const node &a)const{
return l<a.l;
}
}ans[maxn];
int num[maxn];
int vis[maxn];///记录i数字的位置
int main()
{
int ncase,n,m;
scanf("%d",&ncase);
while(ncase--)
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
scanf("%d%d",&ans[i].l,&ans[i].r);
sort(ans+1,ans+1+m);
int tot=0;
memset(num,0,sizeof(num));
memset(vis,0,sizeof(vis));
int pre=0;///记录上一次的最后出现的位置
for(int i=1;i<=m;i++)
{
tot=0;
for(int j=max(pre,ans[i].l);j<=ans[i].r;j++)
{
while(1){
tot++;
bool flag=1;
///假设tot在区间内,说明不可取
if(vis[tot]>=ans[i].l&&vis[tot]<=ans[i].r)
flag=0;
if(flag) break;
}
num[j]=tot;///存储信息
vis[tot]=j;///标记tot数字出现的位置
}
pre=max(pre,ans[i].r+1);
}
for(int i=1;i<n;i++){
printf("%d ",num[i]==0?1:num[i]);
}
printf("%d\n",num[n]==0?1:num[n]);
}
return 0;
}