题意:长为n的串,给你m个区间,这些区间内元素不重复,问这样的串字典序最小为?

思路:用set保存当前能插入的元素,这样就能直接插入最小元素了。对操作按l排序,因为排过的不用排,所以两个指针L,R是一直右移的。L右移肯定是增加set中元素,R右移有两种可能:一是L在R右边,R只是负责赶路赶到操作区间;二是L在R左边,那么R右移是在扩大区间,并且对数组中元素进行插入。

代码:

  1. #include<cstdio>
  2. #include<vector>
  3. #include<set>
  4. #include<queue>
  5. #include<cstring>
  6. #include<string>
  7. #include<cmath>
  8. #include<cstdlib>
  9. #include<algorithm>
  10. #define ll long long
  11. const int maxn = 100000+5;
  12. const int maxm = 100000+5;
  13. const int MOD = 1e7;
  14. const int INF = 0x3f3f3f3f;
  15. using namespace std;
  16. struct node{
  17. int l,r;
  18. }q[maxn];
  19. bool cmp(node a,node b){
  20. return a.l == b.l? a.r < b.r : a.l < b.l;
  21. }
  22. int ans[maxn];
  23. int main(){
  24. int T;
  25. int n,m;
  26. scanf("%d",&T);
  27. while(T--){
  28. memset(ans,0,sizeof(ans));
  29. scanf("%d%d",&n,&m);
  30. set<int> s;
  31. for(int i = 1;i <= n;i++){
  32. s.insert(i);
  33. }
  34. for(int i = 0;i < m;i++)
  35. scanf("%d%d",&q[i].l,&q[i].r);
  36. sort(q,q+m,cmp);
  37. for(int i = q[0].l;i <= q[0].r;i++){
  38. ans[i] = *s.begin();
  39. s.erase(ans[i]);
  40. }
  41. int L = q[0].l,R = q[0].r;
  42. for(int i = 1;i < m;i++){
  43. while(L < q[i].l){
  44. if(ans[L] != 0) s.insert(ans[L]);
  45. L++;
  46. }
  47. while(R < q[i].r){
  48. if(L > R){
  49. if(ans[R] != 0) s.insert(ans[R]);
  50. R++;
  51. }
  52. else{
  53. if(L == R){
  54. if(ans[R] == 0){
  55. ans[R] = *s.begin();
  56. s.erase(ans[R]);
  57. }
  58. else s.erase(ans[R]);
  59. R++;
  60. if(ans[R] == 0){
  61. ans[R] = *s.begin();
  62. s.erase(ans[R]);
  63. }
  64. else s.erase(ans[R]);
  65. }
  66. else{
  67. R++;
  68. if(ans[R] == 0){
  69. ans[R] = *s.begin();
  70. s.erase(ans[R]);
  71. }
  72. }
  73. }
  74. }
  75. }
  76. for(int i = 1;i <= n;i++){
  77. if(i != 1) printf(" ");
  78. if(ans[i] == 0) printf("1");
  79. else printf("%d",ans[i]);
  80. }
  81. printf("\n");
  82. }
  83. return 0;
  84. }

hdu 6301 Distinct Values(贪心)题解的更多相关文章

  1. hdu 6301 Distinct Values (思维+set)

    hdu 6301 Distinct Values 题目传送门 题意: 给你m个区间,让你求出一个长度为n的区间且满足在这些区间的数不重复, 并且要求字典序最小 思路: 如果我们已经求出这个序列了,你会 ...

  2. hdu 6301 Distinct Values (贪心)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. hdu 6301 Distinct Values (2018 Multi-University Training Contest 1 1004)

    Distinct Values Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  4. HDU 6301 Distinct Values

    题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=6301 多校contest1 题目大意是有一个长度为N的数组,给出M个"事实",每个 ...

  5. hdu 6301 Distinct Values (双指针,水题)

    大意: 给定m个区间, 求构造一个长n且字典序最小的序列, 使得每个区间内的数各不相同 求出每个位置为左端点时向右延伸最大距离, 然后双指针, 每次从set中取最小 #include <iost ...

  6. HDU 6301.Distinct Values-贪心、构造字典序最小的数列 (2018 Multi-University Training Contest 1 1004)

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

  7. Distinct Values(贪心)

    问题 D: Distinct Values 时间限制: 1 Sec  内存限制: 128 MB提交: 13  解决: 5[提交] [状态] [讨论版] [命题人:admin] 题目描述 Chiaki ...

  8. HDU 1051 Wooden Sticks 贪心题解

    本题一看就知道是最长不减序列了,一想就以为是使用dp攻克了. 只是那是个错误的思路. 我就动了半天没动出来.然后看了看别人是能够使用dp的,只是那个比較难证明其正确性,而其速度也不快.故此并非非常好的 ...

  9. 2018 Multi-University Training Contest 1 Distinct Values 【贪心 + set】

    任意门:http://acm.hdu.edu.cn/showproblem.php?pid=6301 Distinct Values Time Limit: 4000/2000 MS (Java/Ot ...

随机推荐

  1. LeetCode——Best Time to Buy and Sell Stock II

    Description: Say you have an array for which the ith element is the price of a given stock on day i. ...

  2. webpack中,require的五种用法

    a.js: module.exports = function(x){ console.log(x); } 一,commonjs同步: var b = require('./a');b('你好')// ...

  3. flex弹性布局属性详解!

    详细看下flex弹性布局具体属性: flex容器属性详解:flex-direction:row/column:(横排/竖排) 决定元素的排列方向:flex-wrap:nowrap/wrap/wrap- ...

  4. OneThink友情链接插件使用!

    OneThink友情链接插件使用: 直接安装插件就好,查看数据库会有:onethink_links 这个表: 写 links 标签,调用友情链接: <?php namespace Common\ ...

  5. oracle数据库实例状态

    1.已启动/不装载(NOMOUNT).启动实例,但不装载数据库. 该模式用于重新创建控制文件,对控制文件进行恢复或重新创建数据库.2.已装载(MOUNT).装载数据库,但不打开数据库. 该模式用于更改 ...

  6. 使用异步消息处理更新UI线程

    1. Android的UI时线程不安全的,如果在子线程中更新UI会出现异常,导致程序崩溃. 为了解决如上这些问题,我们常用的做法就是使用Android的异步消息机制实现即可(创建一个Message对象 ...

  7. MySQL集群简介与配置详解

    1. 先了解一下你是否应该用MySQL集群. 减少数据中心结点压力和大数据量处理,采用把MySQL分布,一个或多个application对应一个MySQL数据库.把几个MySQL数据库公用的数据做出共 ...

  8. 分区实践 A PRIMARY KEY must include all columns in the table's partitioning function

    MySQL :: MySQL 8.0 Reference Manual :: 23 Partitioning https://dev.mysql.com/doc/refman/8.0/en/parti ...

  9. Maven 的聚合(多模块)和 Parent 继承

    2017年06月26日 21:16:57 Maven 的聚合(多模块)和 Parent 继承 - 偶尔记一下 - CSDN博客 https://blog.csdn.net/isea533/articl ...

  10. Intellij idea的Dependencies波浪线

    昨天在家做项目不知道搞了什么出现了大量波浪线.搞了大半天解决了下面的问题. 1.pom.xml出现波浪线.看右边 maven project-->Profiles 勾选dev 2.上面已勾选还有 ...