HDU 6301.Distinct Values-贪心、构造字典序最小的数列 (2018 Multi-University Training Contest 1 1004)
2024-09-02 22:43:15
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 ;
}
最新文章
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
- C/C++ 一些常用的运算符
- ng-repeat指令使用详解
- vwampserver2.5-apache2.4.9允许外部访问的配置
- MySQL(三) —— 约束以及修改数据表
- linux命令ps aux|grep xxx详解
- linux命令chown修改文件所有权
- 使用python程序监控云服务器的带宽
- werkzeug中reloader的实现
- mytop
- CSS3实现DIV垂直居中+水平居中的四种方法
- Promise实现多图预加载
- 18 Loader 总结
- ORACLE11g 重装系统后根据dbf恢复数据库
- 【新特性】JDK11
- CSRF与JSON
- UVa-1025城市里的间谍 A Spy in the Metro
- [转]js刷新父窗体
- [基础知识]PeopleSoft应用服务器上的进程含义
- linux命令学习——tar