题目描述

输入

第1行:两个用空格隔开的整数:N和M * 第2行到N+1行:第i+1行表示一个整数C_i * 第N+2到N+M+1行: 第i+N+1行表示2个整数 A_i和B_i

输出

* 第一行: 一个整数表示最多能够被满足的要求数

样例输入

5 4
1
3
2
1
3
1 3
2 5
2 3
4 5

样例输出

3
 
对于区间覆盖这一类的问题,贪心是一个很好的思路。优先选右端点小的,这个很好证明:选了一段区间后,如果有更优解,也就是这段区间能被其他两段区间代替,那么这两个区间不会有相同部分,但因为这段区间之后的所有区间右端点都大于等于这个区间的右端点,所以假设中的更优解的那两段区间在这段区间上一定有重叠部分,所以假设不成立,没有更优解。所以将所有区间排个序然后依次选,用线段树维护一下区间最小值,如果所要加区间最小值<=0那么就加不了,否则就将区间每个数值都减1。
最后附上代码。
  1. #include<cmath>
  2. #include<cstdio>
  3. #include<cstring>
  4. #include<iostream>
  5. #include<algorithm>
  6. using namespace std;
  7. struct node
  8. {
  9. int l,r;
  10. }s[100010];
  11. int n,m,ans;
  12. int a[100010];
  13. int mi[400010];
  14. int sign[400010];
  15. void updata(int x)
  16. {
  17. mi[x]=min(mi[x<<1],mi[(x<<1)+1]);
  18. }
  19. void pushdown(int x,int l,int r)
  20. {
  21. if(sign[x])
  22. {
  23. mi[x<<1]+=sign[x];
  24. sign[x<<1]+=sign[x];
  25. mi[(x<<1)+1]+=sign[x];
  26. sign[(x<<1)+1]+=sign[x];
  27. sign[x]=0;
  28. }
  29. }
  30. void build(int x,int l,int r)
  31. {
  32. int mid=(l+r)>>1;
  33. if(l==r)
  34. {
  35. mi[x]=a[l];
  36. return ;
  37. }
  38. build(x<<1,l,mid);
  39. build((x<<1)+1,mid+1,r);
  40. updata(x);
  41. }
  42. void change(int x,int l,int r,int L,int R,int v)
  43. {
  44. int mid=(l+r)>>1;
  45. if(L<=l&&R>=r)
  46. {
  47. mi[x]+=v;
  48. sign[x]+=v;
  49. return ;
  50. }
  51. pushdown(x,l,r);
  52. if(L<=mid)
  53. {
  54. change(x<<1,l,mid,L,R,v);
  55. }
  56. if(R>=mid+1)
  57. {
  58. change((x<<1)+1,mid+1,r,L,R,v);
  59. }
  60. updata(x);
  61. }
  62. bool cmp(node x,node y)
  63. {
  64. if(x.r!=y.r)
  65. {
  66. return x.r<y.r;
  67. }
  68. return x.l>y.l;
  69. }
  70. int main()
  71. {
  72. scanf("%d%d",&n,&m);
  73. for(int i=1;i<=n;i++)
  74. {
  75. scanf("%d",&a[i]);
  76. }
  77. build(1,1,n);
  78. for(int i=1;i<=m;i++)
  79. {
  80. scanf("%d%d",&s[i].l,&s[i].r);
  81. }
  82. sort(s+1,s+1+m,cmp);
  83. for(int i=1;i<=m;i++)
  84. {
  85. change(1,1,n,s[i].l,s[i].r,-1);
  86. if(mi[1]<0)
  87. {
  88. change(1,1,n,s[i].l,s[i].r,1);
  89. }
  90. else
  91. {
  92. ans++;
  93. }
  94. }
  95. printf("%d",ans);
  96. }

BZOJ1828[USACO 2010 Mar Gold 2.Barn Allocation]——贪心+线段树的更多相关文章

  1. BZOJ1827[USACO 2010 Mar Gold 1.Great Cow Gathering]——树形DP

    题目描述 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1<=N<=100,000) 个农场 ...

  2. BZOJ1785[USACO 2010 Jan Gold 3.Cow Telephones]——贪心

    题目描述 奶牛们建立了电话网络,这个网络可看作为是一棵无根树连接n(1 n 100,000)个节点,节点编号为1 .. n.每个节点可能是(电话交换机,或者电话机).每条电话线连接两个节点.第i条电话 ...

  3. BZOJ 1828 [Usaco2010 Mar]balloc 农场分配(贪心+线段树)

    [题目链接] http://www.lydsy.com/JudgeOnline/problem.php?id=1828 [题目大意] 现在有一些线段[l,r]的需求需要满足,i位置最多允许a[i]条线 ...

  4. bzoj 1828: [Usaco2010 Mar]balloc 农场分配【贪心+线段树】

    长得挺唬人的贪心,按照右端点排序,用最小值线段树的询问判断当前牛是否能放进去,能的话更新线段树,ans++ 来自https://www.cnblogs.com/rausen/p/4529245.htm ...

  5. poj 2010 Moo University - Financial Aid (贪心+线段树)

    转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 骗一下访问量.... 题意大概是:从c个中选出n个 ...

  6. [USACO 2012 Mar Gold] Large Banner

    传送门:http://www.usaco.org/index.php?page=viewproblem2&cpid=127 又是一道这种题目,遇到一次跪一次,这次终于硬着头皮看懂了题解,但是谢 ...

  7. Usaco 2010 Dec Gold Exercise(奶牛健美操)

    /*codevs 3279 二分+dfs贪心检验 堆版本 re一个 爆栈了*/ #include<cstdio> #include<queue> #include<cst ...

  8. BZOJ1782[USACO 2010 Feb Gold 3.Slowing down]——dfs+treap

    题目描述 每天Farmer John的N头奶牛(1 <= N <= 100000,编号1…N)从粮仓走向他的自己的牧场.牧场构成了一棵树,粮仓在1号牧场.恰好有N-1条道路直接连接着牧场, ...

  9. BZOJ1916[USACO 2010 Open Gold 2.Water Slides]——DP+记忆化搜索

    题目描述 受到秘鲁的马丘比丘的新式水上乐园的启发,Farmer John决定也为奶牛们建 一个水上乐园.当然,它最大的亮点就是新奇巨大的水上冲浪.超级轨道包含 E (1 <= E <=15 ...

随机推荐

  1. (转)tcp/ip协议的简单理解 -- ip报文和tcp报文的格式

    1.概念: TCP/IP协议通信的过程其实就对应着数据入栈与出栈的过程.入栈的过程,数据发送方每层不断地封装首部与尾部,添加一些传输的信息,确保能传输到目的地.出栈的过程,数据接收方每层不断地拆除首部 ...

  2. IDEA 创建和使用tomcat

    一.创建一个普通web项目,步骤略,如下图. 二.配置项目相关信息. 1.通过如下方式在Artifacts下添加我们的项目. 2.选中我们的项目. 3.修改项目的默认输出位置,可根据需要修改. 4.如 ...

  3. 通过chrome浏览器分析网页加载时间

    今天趁着下班的时间看了下chrome浏览器的网页加载时间分析工具和相关文档,简单写点儿东西记录一下. 以百度首页加载为例,分析下一张图片1.jgp(就是背景图)的加载时间 看右侧的Timing标签,从 ...

  4. UOJ400/LOJ2553 CTSC2018 暴力写挂 边分治、虚树

    传送门--UOJ 传送门--LOJ 跟隔壁通道是一个类型的 要求的式子中有两个LCA,不是很方便,因为事实上在这种题目中LCA一般都是枚举的对象-- 第二棵树上的LCA显然是动不了的,因为没有其他的量 ...

  5. CF939D Love Rescue 并查集

    传送门 题意:给出两个由小写字母构成的长度相等的字符串$S$与$T$,给出变换$c1\,c2$表示将两个字符串中所有$c1$字符变为$c2$,求将$S$和$T$通过这种变换变为相等字符串的最少变换次数 ...

  6. SpringBoot favicon.ico

    默认的favicon.ico spring boot 默认输出spring的logo, 可以使用spring.mvc.favicon.enabled=false将其关闭 ############### ...

  7. 从angularjs传递参数至Web API

    昨天分享的博文<angularjs呼叫Web API>http://www.cnblogs.com/insus/p/7772022.html,只是从Entity获取数据,没有进行参数POS ...

  8. MVC ActionResult派生类关系图

    态度决定一切,我要改变的不仅仅是技术,还有对待事情的态度! 先上个图: 由上图可知,ActionResult为根节点,其下有很多子节点!下面简单介绍下: MVC中ActionResult是Action ...

  9. Luogu P4137 Rmq Problem / mex

    区间mex问题,可以使用经典的记录上一次位置之后再上主席树解决. 不过主席树好像不是很好写哈,那我们写莫队吧 考虑每一次维护什么东西,首先记一个答案,同时开一个数组记录一下每一个数出现的次数. 然后些 ...

  10. 聊聊Zookeeper应用场景、架构设计、选主机制

    Zookeeper作为一个分布式协调系统提供了一项基本服务:分布式锁服务,分布式锁是分布式协调技术实现的核心内容.像配置管理.任务分发.组服务.分布式消息队列.分布式通知/协调等,这些应用实际上都是基 ...