hdu6301- Distinct Values

给定n段区间,要求每段区间内没有重复的数字; 构造这样一个序列,使得序列的字典序最小 

每次使用数字,从set里提取出来再删掉就行了

题目地址http://acm.hdu.edu.cn/showproblem.php?pid=6301

#include<stdio.h>
#include<string>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
#include<set>
#include<math.h>
using namespace std;
const int maxn=1e5+10;
int last[maxn],col[maxn];//last记录区间的的结尾,col最后的数组
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,m;
        int b,c;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=n;i++){//初始化i对应结尾为自己
            last[i]=i;}
        for(int i=1;i<=m;i++)
        {

            scanf("%d%d",&b,&c);
            last[b]=max(c,last[b]);//出现更大区间的范围
        }
        int l=1,r=0;
        set<int> s;
        for(int i=1;i<=n;i++)
            s.insert(i);
        for(int i=1;i<=n;i++)
        {
            if(r>=last[i])  //区间已经被更新
            continue;
            while(l<i)   //之前用过的数字更新恢复
            {
                s.insert(col[l++]);
            }
            while(r<last[i]) ////更新当前区间
            {
                col[++r]=*s.begin();
                s.erase(col[r]);
            }
        }
        for(int i=1;i<=n;i++){
            if(i==1)printf("%d",col[i]);
            else printf(" %d",col[i]);
    }
    cout<<endl;
}
}












猜你喜欢

转载自blog.csdn.net/qq_41568836/article/details/81225117