1. 程式人生 > >2018HDU多校賽 Distinct Values

2018HDU多校賽 Distinct Values

題目連結

#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; }