HDU6301.Distinct Values

这个题就是给你区间要求区间内的数都不相同,然后要求是字典序最小,直接贪心走一遍,但是自己写的时候,思路没有错,初始化写挫了。。。

将区间按左端点小的排序,如果相同就按右端点大的排序,因为右端点大的肯定满足右端点小的。然后直接标记数组记录当前区间已有的数,然后将没有的数字填到里面。注意初始化就可以了。

代码:

 //1004-6301-字典序最小的序列,贪心策略,标记当前段出现过的
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<cassert>
using namespace std;
typedef long long ll;
const int maxn=1e5+; struct node{
int l,r;
bool operator< (const node &a) const {
if(l==a.l) return r>a.r;
else return l<a.l;
} }a[maxn]; int cnt[maxn],ans[maxn];
int main()
{
int t;
scanf("%d",&t);
while(t--){
int n,m;scanf("%d%d",&n,&m);
memset(cnt,,sizeof(cnt));
memset(ans,,sizeof(ans));
for(int i=;i<m;i++)
scanf("%d%d",&a[i].l,&a[i].r);
sort(a,a+m);
for(int i=a[].l;i<=a[].r;i++)
ans[i]=i-a[].l+;
int num,L=a[].l,R=a[].r;
for(int i=;i<m;i++){
if(a[i].r<=R) continue;
num=;
if(a[i].l<=R){
for(int j=a[i].l;j<=R;j++)
cnt[ans[j]]=i;
for(int j=R+;j<=a[i].r;j++){
while(cnt[num]==i)++num;
ans[j]=num++;
}
L=a[i].l,R=a[i].r;
}
else{
for(int j=a[i].l;j<=a[i].r;j++)
ans[j]=num++;
L=a[i].l,R=a[i].r;
}
}
for(int i=;i<n;i++){
if(ans[i])printf("%d ",ans[i]);
else printf("1 ");
}
if(ans[n])printf("%d\n",ans[n]);
else printf("1\n");
}
return ;
}

最新文章

  1. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
  2. C/C++ 一些常用的运算符
  3. ng-repeat指令使用详解
  4. vwampserver2.5-apache2.4.9允许外部访问的配置
  5. MySQL(三) —— 约束以及修改数据表
  6. linux命令ps aux|grep xxx详解
  7. linux命令chown修改文件所有权
  8. 使用python程序监控云服务器的带宽
  9. werkzeug中reloader的实现
  10. mytop
  11. CSS3实现DIV垂直居中+水平居中的四种方法
  12. Promise实现多图预加载
  13. 18 Loader 总结
  14. ORACLE11g 重装系统后根据dbf恢复数据库
  15. 【新特性】JDK11
  16. CSRF与JSON
  17. UVa-1025城市里的间谍 A Spy in the Metro
  18. [转]js刷新父窗体
  19. [基础知识]PeopleSoft应用服务器上的进程含义
  20. linux命令学习——tar

热门文章

  1. android 管理Touch事件
  2. Nuget.config格式错误,请检查nuget.config配置文件
  3. cookie不能删除
  4. mac虚拟机上(centos系统)设置联网第二种方式
  5. Opencv3.1.0安装包
  6. Spring 笔记(四)AOP
  7. JavaScript里面的条件、循环语句以及异常处理
  8. URAL 1732. Ministry of Truth ( KMP 多模式串匹配 )
  9. HDU 4681 String 胡搞
  10. Ddos攻击防护