hdu-6301 Distinct Values(模拟思维)

题目:构造一个字典序最小的序列,满足给的m个条件,每个条件一个区间(l , r)内没有重复出现的数字。

比赛时我想的是set维护下,排个序然后往后扫,不过没有写,队友写的优先队列的。刚刚写了一下,运行时间比优先队列的要长。

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e5+10;
struct node{
    int l,r;
}s[maxn];
bool cmp(const node &a,const node&b)
{
    if(a.l==b.l) return a.r>b.r;
    return a.l<b.l;
}
int a[maxn],n,m,t;
set<int>se;
int main()
{
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&n,&m);
        memset(a,0,sizeof a);
        for(int i=1;i<=m;i++)
            scanf("%d%d",&s[i].l,&s[i].r);
        sort(s+1,s+m+1,cmp);
        se.clear();
        for(int i=1;i<=n;i++)
            se.insert(i);
        int l=1,r=0;
        for(int i=1;i<=m;i++)
        {
            while(l<s[i].l)
            {
                if(a[l]!=0)
                se.insert(a[l]);
                else a[l]=1;
                l++;
            }
            while(r<s[i].r)
            {
                r++;
                if(!a[r])
                {
                    a[r]=*se.begin();
                    se.erase(a[r]);
                }
            }
        }
        while(r<n) a[++r]=1;
        printf("%d",a[1]);
        for(int i=2;i<=n;i++)
            printf(" %d",a[i]);
        puts("");
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/dllpxfire/article/details/81175718