2018 Multi-University Training Contest 1 ------ 1004 hdu6301 Distinct Values【贪心+优先队列】

题意:

给出一个数组大小,这个数组里面所有的数范围从 1到100000,这个数组有这样一个规则,某个子区间内的所有数必须不相同,求按字典序最小输出这个数组。

解法:

贪心+优先队列

先把所有区间按前端进行排序,再按后端进行排序,进行遍历,每次把前面区间用过的数字但现在遍历的区间没覆盖的数存进优先队列中,然后再取出来用。

本人AC代码:

#include<bits/stdc++.h>
#include<queue>
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
using namespace std;
struct node {
	int l;
	int r;
}edge[100005];
int cmp(node aa,node bb){
	if(aa.l == bb.l){
		return aa.r < bb.r;
	}else {
		return aa.l < bb.l;
	}
}
int main() {
	int t;
	int ans[100005];
	for(scanf("%d",&t); t; t--){
		priority_queue<int, vector<int>, greater<int> > q;
		int n,m;
		scanf("%d%d", &n, &m);
		rep(i,1,m){
			scanf("%d%d",&edge[i].l, &edge[i].r);
		}
		 sort(edge+1, edge+1+m, cmp);
		 rep(i,1,n){
		 	q.push(i);
		 	ans[i] = -1;
		}
		int ml = 1, mr = 1;
		rep(i,1,m){
		 	if(edge[i].l != edge[i+1].l || i == m){
		 		rep(j,ml,edge[i].l-1){
		 			if(ans[j] == -1){
		 				ans[j] = 1;
					}else{
					 	q.push(ans[j]);
					}
				}
				rep(j,mr,edge[i].r){
					if(ans[j] == -1){
						ans[j] = q.top();
						q.pop();
					}
				}
				ml = edge[i].l;
				mr = max(mr, edge[i].r);
			}
		}
		if(ans[1] == -1){
			ans[1] = 1;
		}
		printf("%d",ans[1]);
		rep(i,2,n){
			if(ans[i] == -1){
				ans[i] = 1; 
			}
			printf(" %d",ans[i]);
		}
		printf("\n");
	}
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值