贪心题(好久不做了)

题解

考虑最一般的,判断合法性?

经典贪心问题:左端点升序,左端点相同,右端点降序,c[i]升序

优先队列,每次选择覆盖x的右端点最小的区间。

称此方法为“区间匹配贪心”

最小的k使得任意选k个都能存在“完美匹配”?(虽然这里不用Hall定理)

对于覆盖了ci的区间设有ti个,那么ans至少是n-ti+1

一个naive的想法是,ans就是max(n-ti+1)??

但是可能不止这样,因为存在共用区间的问题

所以边找ti,边进行之前的贪心匹配。

这样,到了i,用n-q.size()+1进行更新ans,然后q.pop(),表示用右端点最小的区间匹配上c[i]

当queue是空的,显然impossible

考虑有解情况,合法性:

证明两点:

1.这样的ans是下界。首先“区间匹配贪心”这样分配是最优的。枚举x相当于最后满足的是哪个,剩下的都选择上。即使有一个可能覆盖了c[i],但是钦定匹配给了别人,

由于“区间匹配贪心”正确,所以换到c[i]一定不优。这一定是下界。

2.只要证明存在合法的分配方式,就可以证明ans也是上界。对于一个c[i],虽然可能给了一个ti的区间可能被钦定给了c[i+j]的,但是这样会在c[i+j]的位置统计到。

由于是取max,所以一定会考虑到!!

否则显然存在构造方法。

所以ans也是下界。

证毕。

  1. #include<bits/stdc++.h>
  2. #define reg register int
  3. #define il inline
  4. #define fi first
  5. #define se second
  6. #define mk(a,b) make_pair(a,b)
  7. #define numb (ch^'0')
  8. #define pb push_back
  9. #define solid const auto &
  10. #define enter cout<<endl
  11. #define pii pair<int,int>
  12. using namespace std;
  13. typedef long long ll;
  14. template<class T>il void rd(T &x){
  15. char ch;x=;bool fl=false;while(!isdigit(ch=getchar()))(ch=='-')&&(fl=true);
  16. for(x=numb;isdigit(ch=getchar());x=x*+numb);(fl==true)&&(x=-x);}
  17. template<class T>il void output(T x){if(x/)output(x/);putchar(x%+'');}
  18. template<class T>il void ot(T x){if(x<) putchar('-'),x=-x;output(x);putchar(' ');}
  19. template<class T>il void prt(T a[],int st,int nd){for(reg i=st;i<=nd;++i) ot(a[i]);putchar('\n');}
  20. namespace Modulo{
  21. const int mod=;
  22. int ad(int x,int y){return (x+y)>=mod?x+y-mod:x+y;}
  23. void inc(int &x,int y){x=ad(x,y);}
  24. int mul(int x,int y){return (ll)x*y%mod;}
  25. void inc2(int &x,int y){x=mul(x,y);}
  26. int qm(int x,int y=mod-){int ret=;while(y){if(y&) ret=mul(x,ret);x=mul(x,x);y>>=;}return ret;}
  27. template<class ...Args>il int ad(const int a,const int b,const Args &...args) {return ad(ad(a,b),args...);}
  28. template<class ...Args>il int mul(const int a,const int b,const Args &...args) {return mul(mul(a,b),args...);}
  29. }
  30. // using namespace Modulo;
  31. namespace Miracle{
  32. const int N=1e5+;
  33. int n,m;
  34. int ans;
  35. int c[N];
  36. priority_queue<int,vector<int>,greater<int> >q;
  37. struct seg{
  38. int l,r;
  39. bool friend operator <(seg a,seg b){
  40. if(a.l==b.l) return a.r>b.r;
  41. return a.l<b.l;
  42. }
  43. }s[N];
  44. void clear(){
  45. while(!q.empty()) q.pop();
  46. }
  47. int main(){
  48. int t;rd(t);
  49. for(reg o=;o<=t;++o){
  50. clear();
  51. rd(n);rd(m);
  52. for(reg i=;i<=n;++i){
  53. rd(s[i].l);rd(s[i].r);
  54. }
  55. sort(s+,s+n+);
  56. for(reg i=;i<=m;++i){
  57. rd(c[i]);
  58. }
  59. sort(c+,c+m+);
  60. int ptr=;
  61. int ans=;
  62. for(reg i=;i<=m;++i){
  63. while(ptr<n&&s[ptr+].l<=c[i]){
  64. if(s[ptr+].r>=c[i]) q.push(s[ptr+].r);
  65. ++ptr;
  66. }
  67. while(!q.empty()&&q.top()<c[i]) q.pop();
  68. if(q.empty()) {
  69. ans=-;break;
  70. }
  71. ans=max(ans,n-(int)q.size()+);
  72. q.pop();
  73. }
  74. if(ans>=) printf("Case #%d: %d\n",o,ans);
  75. else printf("Case #%d: IMPOSSIBLE!\n",o);
  76. }
  77. return ;
  78. }
  79.  
  80. }
  81. signed main(){
  82. Miracle::main();
  83. return ;
  84. }
  85.  
  86. /*
  87. Author: *Miracle*
  88. */

鸽巢原理,但是可能不存在合法方案,就现场匹配。

为了保证最优性,利用“区间匹配贪心”

HDU 6003 Problem Buyer的更多相关文章

  1. HDU 6003 Problem Buyer【小根堆】

    任意k个都可以,也可以看做把不行的都选了,再随便选一个可以的要选的数量 把区间和m个值都排序,区间按l一序r二序排,枚举m个值,小根堆维护能帮韩当前枚举值的区间的右端点,这样方便删除区间,然后剩下的就 ...

  2. hdu6003 Problem Buyer 贪心 给定n个区间,以及m个数,求从n个区间中任意选k个区间,满足m个数都能在k个区间中找到一个包含它的区间,如果一个区间包含了x,那么 该区间不能再去包含另一个数,即k>=m。求最小的k。如果不存在这样的k,输出“IMPOSSIBLE!”。

    /** 题目:hdu6003 Problem Buyer 链接:http://acm.hdu.edu.cn/showproblem.php?pid=6003 题意:给定n个区间,以及m个数,求从n个区 ...

  3. HDU 6343.Problem L. Graph Theory Homework-数学 (2018 Multi-University Training Contest 4 1012)

    6343.Problem L. Graph Theory Homework 官方题解: 一篇写的很好的博客: HDU 6343 - Problem L. Graph Theory Homework - ...

  4. hdu String Problem(最小表示法入门题)

    hdu 3374 String Problem 最小表示法 view code#include <iostream> #include <cstdio> #include &l ...

  5. HDU 6343 - Problem L. Graph Theory Homework - [(伪装成图论题的)简单数学题]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6343 Time Limit: 2000/1000 MS (Java/Others) Memory Li ...

  6. HDU 5687 Problem C 【字典树删除】

    传..传送:http://acm.hdu.edu.cn/showproblem.php?pid=5687 Problem C Time Limit: 2000/1000 MS (Java/Others ...

  7. HDU 6342.Problem K. Expression in Memories-模拟-巴科斯范式填充 (2018 Multi-University Training Contest 4 1011)

    6342.Problem K. Expression in Memories 这个题就是把?变成其他的使得多项式成立并且没有前导零 官方题解: 没意思,好想咸鱼,直接贴一篇别人的博客,写的很好,比我的 ...

  8. HDU 6336.Problem E. Matrix from Arrays-子矩阵求和+规律+二维前缀和 (2018 Multi-University Training Contest 4 1005)

    6336.Problem E. Matrix from Arrays 不想解释了,直接官方题解: 队友写了博客,我是水的他的代码 ------>HDU 6336 子矩阵求和 至于为什么是4倍的, ...

  9. HDU 5687 Problem C(Trie+坑)

    Problem C Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others) Tota ...

随机推荐

  1. 异或+桶——cf768C

    有个结论是到最后肯定出现循环节..感觉这种做法有点歪 正解当然是题解啦 虽然到了1e8,但是cf上还是能过的 #include<bits/stdc++.h> #define rep(i,s ...

  2. eclipse+terminal

    eclipse 怎么安装terminal插件   1 首先打开eclipse,找到help菜单,点击Eclipse Marketplace. 2 在search框里输入Terminal,点击Go查找. ...

  3. 依赖注入(DI)

    Spring依赖注入(DI)的三种方式,分别为: 1.  接口注入 2.  Setter 方法注入 3.  构造方法注入 依赖注入是一种思想,或者说是一种设计模式,在java中是通过反射机制实现,与具 ...

  4. 图解 5 种 Join 连接及实战案例!(inner/ left/ right/ full/ cross)

    Join 连接在日常开发用得比较多,但大家都搞清楚了它们的使用区别吗??一文带你上车~~ 内连接 inner join 内连接是基于连接谓词将俩张表(如A和B)的列组合到一起产生新的结果表,在表中存在 ...

  5. Git初次使用,记录自己看

    Git官网下载:https://git-scm.com/downloads 官网如果太慢,可以去这下载:http://www.wmzhe.com/soft-38801.html,注意选择如下图地址下载 ...

  6. 2019-5-15-影子系统让-C++-程序无法运行

    title author date CreateTime categories 影子系统让 C++ 程序无法运行 lindexi 2019-05-15 15:24:35 +0800 2019-05-1 ...

  7. 【笔记篇】C#笔记2

    返回目录:目录请戳这里~ C#数组 基本概念不提.. int[] a; bool[] b = new bool[10]; float[] c = {0.5, 57.0, 233.3, 12345.67 ...

  8. Luogu P2717 寒假作业(平衡树)

    P2717 寒假作业 题意 题目背景 \(zzs\)和\(zzy\)正在被寒假作业折磨,然而他们有答案可以抄啊. 题目描述 他们共有\(n\)项寒假作业.\(zzy\)给每项寒假作业都定义了一个疲劳值 ...

  9. nodejs vue-cli 微信公众号开发(一) 申请域名搭建服务器

    一.搭建本地服务器 1.首先保存本地的80端口被node监听,利用内网穿透工具把80端口映射出去.(ngrok工具可以穿透内网使本地ip作为外网使用) 2.打开https://natapp.cn/tu ...

  10. KMP算法简明法则

    KMP算法也算是相当经典,但是对于初学者来说确实有点绕,大学时候弄明白过后来几年不看又忘记了,然后再弄明白过了两年又忘记了,好在之前理解到了关键点,看了一遍马上又能理解上来.关于这个算法的详解网上文章 ...