2018HDU多校賽 Distinct Values
阿新 • • 發佈:2019-02-13
#include <iostream>
#include<bits/stdc++.h>
using namespace std;
struct node
{
int l,r;
}op[100002];
int a[100002];
int cmp(node a,node b)
{
if(a.l!=b.l)
return a.l<b.l;
else return a.r>b.r;
}
int main()
{
int T;
cin>>T;
while(T--)
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
scanf("%d%d",&op[i].l,&op[i].r);
}
sort(op+1,op+1+m,cmp);
int j = 1;
int book[100005];
//記錄要填的每一個數出現的最後位置
memset(book,0,sizeof book);
int p = 1;
for (int i=1;i<=n;i++)
{
while( op[j].r<i)
//當前要填的數跳過了當前區間的右端點
//說明當前區間已經填過了
{
p = 1;
j++;
}
if(j>m||op[j].l>i)
//當前要填的數要填到當前區間的右邊
//否則說明要填的位置無限制
{
a[i] = 1 ;
book[1] = i;
}
else
{
while(book[p]>=op[j].l&&book[p]<=op[j].r)
{
p++;
}
a[i] = p;
book[p] = i;
}
}
int top = 1;
for(int i=1;i<=n;i++)
{
if(top) top=0;
else printf(" ");
printf("%d",a[i]);
}
cout<<endl;
}
return 0;
}