2018 Multi-University Training Contest 1 1004 Distinct Values【模拟】

Distinct Values
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 3336 Accepted Submission(s): 523

Problem Description

Chiaki has an array of n positive integers. You are told some facts about the array: for every two elements ai and aj in the subarray al..r (l≤i

#include<bits/stdc++.h>
using namespace std;
#define ll long long int
const int maxn=1e5+10;

priority_queue<int,vector<int>,greater<int> > q;
struct node
{
    int l,r;
}e[maxn];
int cmp(node a,node b)
{
    if(a.l==b.l) return a.r>b.r;
    return a.l<b.l;
}
int a[maxn];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        for(int i=1;i<=m;i++){
            scanf("%d%d",&e[i].l,&e[i].r);
        }
        sort(e+1,e+1+m,cmp);
        while(!q.empty()) q.pop();
        for(int i=1;i<=n;i++){
            a[i]=0;
            q.push(i);
        }
        int cs=1;
        int pre=1;
        int flag=1;
        for(int i=1;i<=m;i++){
            if(e[i-1].l==e[i].l) continue;
            while(pre<e[i].l){
                if(a[pre]==1&&flag==0){
                    q.push(a[pre]);
                    flag=1;
                }else if(a[pre]!=0){
                    q.push(a[pre]);
                }
                else a[pre]=1;
                pre++;
            }
            cs=max(pre,cs);
            for(int j=cs;j<=e[i].r;j++){
                if(a[j]==0){
                    a[j]=q.top();
                    if(a[j]==1){
                        flag=0;
                    }
                    q.pop();
                }
            }
            cs=max(cs,e[i].r+1);
        }
        cs=max(cs,e[m].r+1);
        for(int i=cs;i<=n;i++)
            a[i]=1;
        for(int i=1;i<=n;i++){
            printf("%d%c",a[i],i==n?'\n':' ');
        }
    }



    return 0;
}

猜你喜欢

转载自blog.csdn.net/irish_moonshine/article/details/81190703