zoukankan      html  css  js  c++  java
  • 2018HDU多校训练一 D Distinct Values

    hiaki has an array of nn positive integers. You are told some facts about the array: for every two elements aiai and ajaj in the subarray al..ral..r (l≤i<j≤rl≤i<j≤r), ai≠ajai≠aj holds. 
    Chiaki would like to find a lexicographically minimal array which meets the facts. 

    Input

    There are multiple test cases. The first line of input contains an integer TT, indicating the number of test cases. For each test case: 

    The first line contains two integers nn and mm (1≤n,m≤1051≤n,m≤105) -- the length of the array and the number of facts. Each of the next mm lines contains two integers lili and riri (1≤li≤ri≤n1≤li≤ri≤n). 

    It is guaranteed that neither the sum of all nn nor the sum of all mm exceeds 106106. 

    Output

    For each test case, output nn integers denoting the lexicographically minimal array. Integers should be separated by a single space, and no extra spaces are allowed at the end of lines. 

    Sample Input

    3
    2 1
    1 2
    4 2
    1 2
    3 4
    5 2
    1 3
    2 4

    Sample Output

    1 2
    1 2 1 2
    1 2 3 1 1

    题意:给你n组数,没每组有L,R两个数,数组a[n],L ~ R区间内的正整数各部相同,让你输出字典序最小的数组;

    题解:先将这些组数据按L1<L2 ,R1>R2 的优先级排序,可以用set<int> 维护还可以用的数字有哪些,开始将1~n全部加入到set中,然后从1  erase去第一个node 的r-1个数字,然后,令ll 为node[1].l rr为node[1].r,对于后面的node分3中情况:

    1.如果node[i].r <= r,说明这个区间已经更新过了,且满足字典序最小,数字不同

    2.如果node[i].l>r,则为一个新的开始,将a[l]~a[r]的数字加入到set里面,就从set.begin()开始 将*set.begin()赋值给a[node[i].l]到a[node[i].r],每赋值一个,set就删除一个,更新l,r的值

    3.如果node[i].l<=r,则和上面2类似,就是区间变为 r~node[i].r;

    参考代码为:

    #include<bits/stdc++.h>
    using namespace std;
    typedef long long LL;
    const LL inf=0x3f3f3f3f3f3f3f3fLL;
    const int INF=0x3f3f3f3f;
    const int maxn=1e5+10;
    int T,n,m,flag[maxn];
    struct Node{
    	int l,r;
    	bool operator < (const Node&b) const 
    	{
    		return l==b.l? r>b.r : l<b.l;
    	}
    } node[maxn];
    set<int> s1;
    int main()
    {
    	scanf("%d",&T);
    	while(T--)
    	{
    		s1.clear();
    		memset(flag,0,sizeof flag);
    		scanf("%d%d",&n,&m);
    		for(int i=1;i<=n;i++) s1.insert(i);
    		for(int i=1;i<=m;i++) scanf("%d%d",&node[i].l,&node[i].r);
    		sort(node+1,node+1+m);
    		for(int i=node[1].l,j=1;i<=node[1].r;i++,j++) s1.erase(j),flag[i]=j;
    		int l=node[1].l,r=node[1].r;
    		for(int i=2;i<=m;i++)
    		{
    			if(node[i].r<=r) continue;
    			if(node[i].l>r)
    			{
    				for(int k=l;k<=r;k++) s1.insert(flag[k]);
    				for(int k=node[i].l;k<=node[i].r;k++) flag[k]=*s1.begin(),s1.erase(flag[k]);
    				l=node[i].l,r=node[i].r;
    			}
    			else
    			{
    				for(int k=l;k<node[i].l;k++) s1.insert(flag[k]);
    				for(int k=r+1;k<=node[i].r;k++) flag[k]=*s1.begin(),s1.erase(flag[k]);
    				l=node[i].l,r=node[i].r;
    			}
    		 } 
    		 for (int i=1;i<=n;++i) printf("%d%c",flag[i]==0? 1 : flag[i],i==n? '
    ':' ');
    	}
    	return 0;
    }
  • 相关阅读:
    Spring Boot Test(转)
    volatile的可见性和有序性是什么(转)
    消息队列漫谈:如何使用消息队列实现分布式事务?(转)
    idea IntelliJ修改代码后自动重启(转)
    Spring Boot自动配置实现原理(转)
    Java注解(Annotation)原理详解(转)
    Spring中@Import注解的作用和使用(转)
    i春秋六周年庆丨欢乐相聚,暖心同行,未来可期!
    王者之战,志在巅峰丨2021互联网安全城市巡回赛•北京站圆满收官!
    2021互联网安全城市巡回赛——风起云涌,再战京城!
  • 原文地址:https://www.cnblogs.com/csushl/p/9386491.html
Copyright © 2011-2022 走看看