hdu6301 构造

题目传送门

题意:

让你构造一个n个正整数的序列,使这个序列的字典序最小。

给你m个区间,构造的序列需要使这些区间内的数两两不同。

数据范围:\dpi{150}1\leqslant n \leqslant 10^6 , \dpi{150}1\leqslant m \leqslant 10^6 。

题解:

现在有两个set,分别是s和t。

s初始为1~n共n个数,t初始为空。

这些区间按左右端点从小到大排序。

对于每个区间,没有填的数,去填写s的最小值,然后s中去除这个数,t中加入这个数。

s需要先加上上个区间去掉的数,t需要先除去上个区间去掉的数。

注意优化,不然会退化为n^2。具有包含关系的区间,需要看成一个区间。

感受:

想了一会就会写了,少考虑了一些细节debug半天。

最后构造一个随机大测例才找到bug。

毫无游戏体验。菜的无语。。。

代码:

#include<bits/stdc++.h>
using namespace std ;
typedef long long ll ;
const int maxn = 1e6 + 5 ;
int n , m ;
int a[maxn] ;
struct node
{
    int l , r ;
    bool operator <(const node &s) const
    {
        if(l != s.l)  return l < s.l ;
        else  return r < s.r ;
    }
} b[maxn] ;
void solve()
{
    int last = 0 ;
    set<int> s , t ;
    for(int i = 1 ; i <= n ; i ++)  s.insert(i) ;
    for(int i = 1 ; i <= m ; i ++)
    {
        int pl = b[last].l , pr = b[last].r ; 
        int l = b[i].l , r = b[i].r ;
        if(r <= pr)  continue ;
        int p = max(pl , 1) , q = min(pr , l - 1) ;
        int cnt = 0 ;
        for(int j = p ; j <= q ; j ++)
        {
            int x = a[j] ;
            t.erase(x) ;
            s.insert(x) ;
        }
        for(int j = max(pr + 1 , l) ; j <= r ; j ++)
        {
            a[j] = *(s.begin()) ;
            s.erase(a[j]) ;
            t.insert(a[j]) ;
        }
        last = i ;
    }
}
int main()
{
    int t ;
    scanf("%d" , &t) ;
    while(t --)
    {
        scanf("%d%d" , &n , &m) ;
        for(int i = 1 ; i <= m ; i ++)  scanf("%d%d" , &b[i].l , &b[i].r) ;
        /*for(int i = 1 ; i <= m ; i ++)
        {
            b[i].l = max(1 , rand() % n) ;
            b[i].r = max(1 , rand() % n) ;
            if(b[i].l > b[i].r)  swap(b[i].l , b[i].r) ;
        }*/
        sort(b + 1 , b + m + 1) ;
        for(int i = 1 ; i <= n ; i ++)  a[i] = 0 ;
        solve() ;
        for(int i = 1 ; i < n ; i ++)  printf("%d " , max(1 , a[i])) ;
        printf("%d\n" , max(1 , a[n])) ;
    }
    return 0 ;
}
发布了215 篇原创文章 · 获赞 12 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/Irving0323/article/details/104257227
今日推荐