长得挺唬人的贪心,按照右端点排序,用最小值线段树的询问判断当前牛是否能放进去,能的话更新线段树,ans++

来自https://www.cnblogs.com/rausen/p/4529245.html非常严谨的证明

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<algorithm>
  4. using namespace std;
  5. const int N=100005;
  6. int n,m,c[N],ans;
  7. struct xds
  8. {
  9. int l,r,mn,lz;
  10. }t[N<<2];
  11. struct qwe
  12. {
  13. int l,r;
  14. }a[N];
  15. bool cmp(const qwe &a,const qwe &b)
  16. {
  17. return a.r<b.r;
  18. }
  19. int read()
  20. {
  21. int r=0,f=1;
  22. char p=getchar();
  23. while(p>'9'||p<'0')
  24. {
  25. if(p=='-')
  26. f=-1;
  27. p=getchar();
  28. }
  29. while(p>='0'&&p<='9')
  30. {
  31. r=r*10+p-48;
  32. p=getchar();
  33. }
  34. return r*f;
  35. }
  36. void pd(int ro)
  37. {
  38. if(t[ro].lz!=0)
  39. {
  40. t[ro<<1].mn-=t[ro].lz,t[ro<<1].lz+=t[ro].lz;
  41. t[ro<<1|1].mn-=t[ro].lz,t[ro<<1|1].lz+=t[ro].lz;
  42. t[ro].lz=0;
  43. }
  44. }
  45. void build(int ro,int l,int r)
  46. {
  47. t[ro].l=l,t[ro].r=r;
  48. if(l==r)
  49. {
  50. t[ro].mn=c[l];
  51. return;
  52. }
  53. int mid=(l+r)>>1;
  54. build(ro<<1,l,mid);
  55. build(ro<<1|1,mid+1,r);
  56. t[ro].mn=min(t[ro<<1].mn,t[ro<<1|1].mn);
  57. }
  58. void update(int ro,int l,int r)
  59. {
  60. if(t[ro].l==l&&t[ro].r==r)
  61. {
  62. t[ro].mn--,t[ro].lz++;
  63. return;
  64. }
  65. pd(ro);
  66. int mid=(t[ro].l+t[ro].r)>>1;
  67. if(r<=mid)
  68. update(ro<<1,l,r);
  69. else if(l>mid)
  70. update(ro<<1|1,l,r);
  71. else
  72. update(ro<<1,l,mid),update(ro<<1|1,mid+1,r);
  73. t[ro].mn=min(t[ro<<1].mn,t[ro<<1|1].mn);
  74. }
  75. int ques(int ro,int l,int r)
  76. {
  77. if(t[ro].l==l&&t[ro].r==r)
  78. return t[ro].mn;
  79. pd(ro);
  80. int mid=(t[ro].l+t[ro].r)>>1;
  81. if(r<=mid)
  82. return ques(ro<<1,l,r);
  83. else if(l>mid)
  84. return ques(ro<<1|1,l,r);
  85. else
  86. return min(ques(ro<<1,l,mid),ques(ro<<1|1,mid+1,r));
  87. }
  88. int main()
  89. {
  90. n=read(),m=read();
  91. for(int i=1;i<=n;i++)
  92. c[i]=read();
  93. for(int i=1;i<=m;i++)
  94. a[i].l=read(),a[i].r=read();
  95. sort(a+1,a+1+m,cmp);
  96. build(1,1,n);
  97. for(int i=1;i<=m;i++)
  98. if(ques(1,a[i].l,a[i].r)>0)
  99. update(1,a[i].l,a[i].r),ans++;
  100. printf("%d\n",ans);
  101. return 0;
  102. }

bzoj 1828: [Usaco2010 Mar]balloc 农场分配【贪心+线段树】的更多相关文章

  1. BZOJ_1828_[Usaco2010 Mar]balloc 农场分配_线段树

    BZOJ_1828_[Usaco2010 Mar]balloc 农场分配_线段树 Description Input 第1行:两个用空格隔开的整数:N和M * 第2行到N+1行:第i+1行表示一个整数 ...

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

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

  3. BZOJ 1828: [Usaco2010 Mar]balloc 农场分配

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

  4. 【BZOJ】1828: [Usaco2010 Mar]balloc 农场分配(经典贪心)

    [算法]贪心+线段树 [题意]给定n个数字ci,m个区间[a,b](1<=a,b<=10^5),每个位置最多被ci个区间覆盖,求最多选择多少区间. 附加退化问题:全部ci=1,即求最多的不 ...

  5. BZOJ1828 [Usaco2010 Mar]balloc 农场分配

    直接贪心,我们把线段按照右端点从小到大排序,然后一个个尝试插入即可... 来证明贪心的正确性: 不妨设贪心得到的答案集合为$S$,最优解的答案集合为$T$ 若$S$不是最优解,那么$S \not= T ...

  6. BZOJ.3307.雨天的尾巴(dsu on tree/线段树合并)

    BZOJ 洛谷 \(dsu\ on\ tree\).(线段树合并的做法也挺显然不写了) 如果没写过\(dsu\)可以看这里. 对修改操作做一下差分放到对应点上,就成了求每个点子树内出现次数最多的颜色, ...

  7. BZOJ4391 High Card Low Card [Usaco2015 dec](贪心+线段树/set库

    正解:贪心+线段树/set库 解题报告: 算辣直接甩链接qwq 恩这题就贪心?从前往后从后往前各推一次然后找一遍哪个地方最大就欧克了,正确性很容易证明 (这里有个,很妙的想法,就是,从后往前推从前往后 ...

  8. 【题解】P1712 [NOI2016]区间(贪心+线段树)

    [题解]P1712 [NOI2016]区间(贪心+线段树) 一个observe是,对于一个合法的方案,将其线段长度按照从大到小排序后,他极差的来源是第一个和最后一个.或者说,读入的线段按照长度分类后, ...

  9. BZOJ 1827: [Usaco2010 Mar]gather 奶牛大集会 树形DP

    [Usaco2010 Mar]gather 奶牛大集会 Bessie正在计划一年一度的奶牛大集会,来自全国各地的奶牛将来参加这一次集会.当然,她会选择最方便的地点来举办这次集会.每个奶牛居住在 N(1 ...

随机推荐

  1. Xcode8、 iOS10 适配问题

    调用相机.相册.麦克风.位置等隐私问题崩溃解决办法 你的项目中访问了隐私数据,比如:相机,相册,联系人等,在Xcode8中打开编译的话,统统会crash,控制台会输出下面这样的日志: 这是因为iOS对 ...

  2. Leetcode 213.大家劫舍II

    打家劫舍II 你是一个专业的小偷,计划偷窃沿街的房屋,每间房内都藏有一定的现金.这个地方所有的房屋都围成一圈,这意味着第一个房屋和最后一个房屋是紧挨着的.同时,相邻的房屋装有相互连通的防盗系统,如果两 ...

  3. C++ fill 和memset

    以下内容来自www.cplusplus.com--------------------------------------------------- FILL: template <class ...

  4. Django的static和media

    2013-09-09 18:13:57|          最近用到Django的静态文件,关于static和media,配置了很多次,终于可以用了.        首先是static,在'site/ ...

  5. [bzoj2091][Poi2010]The Minima Game_动态规划

    The Minima Game bzoj-2091 Poi-2010 题目大意:给出N个正整数,AB两个人轮流取数,A先取.每次可以取任意多个数,直到N个数都被取走.每次获得的得分为取的数中的最小值, ...

  6. 技术杂记之:在阿里云centos7上部署JDK MYSQL TOMCAT

    今日小编闲来无事,乘着公司新项目即将上线之际,在阿里云上整了一台centos作为测试机.原本以为一个小时搞定,结果还是花了一点小小时间.不管怎么说,记录下来,给各位小白当成课后甜点吧. 价格 先上价格 ...

  7. Servlet实现点击计数器

    以下内容引用自http://wiki.jikexueyuan.com/project/servlet/hits-counter.html: 一.Web页面的点击计数器 很多时候,可能有兴趣知道网站的某 ...

  8. Sql查询一个列对应多个列

    Sql查询一个列对应多个列 今天遇到一个问题,表table1有两个字段col1.col2两个字段.先记录下来,以后有个参考. 现在需要查询出的数据满足如下要求: 1.col1重复.col2重复的数据只 ...

  9. 用Visual Studio 2010 打开Visual Studio 2013 (C#专用)

    1.更改.sln 1)将Microsoft Visual Studio Solution File, Format Version 12.00   改成11.00 2)将 # Visual Studi ...

  10. [Maid] Write Tasks in Markdown with Maid

    Maid enables you to write your tasks in Markdown. Create a maidfile.md or a README.mdthen add Header ...