/upload/file/20180723/20180723180716_87193.pdf
[题意]
n 个数, m 个区间[l,r] 内 保证 不能重复, 但 相交区域外的可以重复, 问 最小字典序的 这样一个序列
[思路]
采用 Set 维护, Set 中 存放 1-n , 每次 在 [L,R] 中 从set 取一个,删除一个,
然后 将L 之前的 在存入set 中.
一直维护set, 用 两个下标 left 和 now 标记,
注意 在 Set 删数时, 指针要先自加, 在删除, 不然会内存访问错误.
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e6 + 10;
int t, n, m, ans[maxn];
struct node
{
int l, r, flag;
};
node a[maxn];
int cmp(node a, node b)
{
if (a.l == b.l)
return a.r < b.r;
return a.l < b.l;
}
int main()
{
scanf("%d", &t);
while(t--)
{
scanf("%d%d", &n, &m);
for (int i = 0 ; i < m ; i++)
{
scanf("%d%d", &a[i].l, &a[i].r);
a[i].flag = 0;
}
sort(a, a + m, cmp);
set<int>st;
for (int i = 1 ; i <= n ; i++)
{
st.insert(i);
ans[i] = 1;
}
for (int i = a[0].l ; i <= a[0].r ; i++)
{
ans[i] = *st.begin();
st.erase(st.begin());
}
int L = a[0].l, R = a[0].r;
for (int i = 1 ; i < m ; i++)
{
while(L < a[i].l)
{
st.insert(ans[L]);
L++;
}
while(R < a[i].r)
{
if (R < a[i].l-1) R++;
else
{
R++;
ans[R] = *st.begin();
st.erase(st.begin());
}
}
}
for (int i = 1 ; i <= n ; i++)
{
if (i != n)
printf("%d ", ans[i]);
else
printf("%d\n", ans[i]);
}
}
return 0;
}