【题目链接】 http://www.lydsy.com/JudgeOnline/problem.php?id=1828

【题目大意】

  现在有一些线段[l,r]的需求需要满足,i位置最多允许a[i]条线段堆叠,
  问最多能满足多少条线段的需求

【题解】

  我们将所有的线段按照右端点排序,那么从头到尾考虑能不能满足需求一定能得到最优解,
  因为对于相同右端点的来说,先后顺序不影响放入,
  而对于右端点不同的来说,右端点靠前的先处理一定比靠后的先处理更优。
  处理方式相当于线段树的区间查询和区间修改。

【代码】

  1. #include <cstdio>
  2. #include <algorithm>
  3. using namespace std;
  4. const int N=100010;
  5. const int INF=0x3f3f3f3f;
  6. struct data{int l,r;}p[N];
  7. bool cmp(data a,data b){return a.r<b.r;}
  8. int tag[N<<2],T[N<<2],a[N];
  9. void up(int x){T[x]=min(T[x<<1],T[x<<1|1]);}
  10. void pd(int x){
  11. if(tag[x]){
  12. T[x<<1]+=tag[x]; T[x<<1|1]+=tag[x];
  13. tag[x<<1]+=tag[x]; tag[x<<1|1]+=tag[x];
  14. tag[x]=0;
  15. }
  16. }
  17. void build(int x,int l,int r){
  18. int mid=(l+r)>>1;
  19. if(l==r){T[x]=a[l];tag[x]=0;return;}
  20. build(x<<1,l,mid); build(x<<1|1,mid+1,r);
  21. up(x);
  22. }
  23. void update(int x,int l,int r,int L,int R,int p){
  24. int mid=(l+r)>>1;
  25. if(L<=l&&r<=R){T[x]+=p;tag[x]+=p;return;} pd(x);
  26. if(L<=mid)update(x<<1,l,mid,L,R,p);
  27. if(R>mid)update(x<<1|1,mid+1,r,L,R,p);
  28. up(x);
  29. }
  30. int query(int x,int l,int r,int L,int R){
  31. int mid=(l+r)>>1;
  32. //printf("%d %d %d\n",l,r,T[x]);
  33. if(L<=l&&r<=R)return T[x]; pd(x);
  34. int res=INF;
  35. if(L<=mid)res=min(res,query(x<<1,l,mid,L,R));
  36. if(R>mid)res=min(res,query(x<<1|1,mid+1,r,L,R));
  37. return res;
  38. }
  39. int n,m;
  40. int main(){
  41. while(~scanf("%d%d",&n,&m)){
  42. for(int i=1;i<=n;i++)scanf("%d",&a[i]);
  43. build(1,1,n);
  44. for(int i=1;i<=m;i++)scanf("%d%d",&p[i].l,&p[i].r);
  45. sort(p+1,p+m+1,cmp);
  46. int ans=0;
  47. for(int i=1;i<=m;i++){
  48. int x=query(1,1,n,p[i].l,p[i].r);
  49. //printf("%d %d\n",p[i].l,p[i].r);
  50. //printf("%d\n",x);
  51. if(x){
  52. ans++;
  53. update(1,1,n,p[i].l,p[i].r,-1);
  54. }
  55. }printf("%d\n",ans);
  56. }return 0;
  57. }

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 农场分配【贪心+线段树】

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

  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. POJ 30253 Fence Repair (二叉树+优先队列)

    题目链接 Description Farmer John wants to repair a small length of the fence around the pasture. He meas ...

  2. python keras YOLOv3实现目标检测

    1.连接 https://www.jianshu.com/p/3943be47fe84

  3. LCD实验学习笔记(五):MMU

    内存管理分别页表机制和内存分配机制两块. 页表机制就是管理设备真实物理地址与虚拟地址的动态或静态的映射,基于cpu内部的mmu(内存管理单元)进行. CP15(协处理器)的C0(缓存)是一级页表,含4 ...

  4. ADO POST时出现“无法为更新定位行,一些值可能已在最后一次读取后已更改”问题的解决方法

    原因有这样几种: 1.在数据库设计时,为某些字段设置了默认值,在修改进行提交以后,数据库会自动修改对应字段的所有行的默认值,从而导致了数据库与数据集中数据的不一致,使ADOQuery无法对数据集进行定 ...

  5. Percona XtraDB Cluster(PXC)原理

    Percona XtraDB Cluster(PXC)原理 介绍: PXC曾经属于一套近乎最完美的mysql高可用集群解决方案(现mgr总体上要优于pxc),相比传统的基于主从复制模式的集群架构MHA ...

  6. 自定义shell开头PS1

    vim /etc/profile export PS1="flag:\W \u\$" \h是主机名,并不全,域 \W是当前所在目录名 \u 是当前shell用户名

  7. C语言比较巧妙的字符串分割程序

    在解析字符串时,能够解析的给出每个字符串的长度.内容.以及每个字符串的第一个字符的地址. short i; ; //切割之后的字符串的个数 ,ItemLen[],Idx[], ThCommandLen ...

  8. Redis 基础使用(1)

    redis 数据库的使用场景介绍 redis 是 NoSQL 数据库中的一种,特别适合解决一些使用传统关系数据库难以解决的问题,redis 作为内存数据库,如果在不合适的场合,对内存的消耗是很大的,甚 ...

  9. javascript 线程问题小记

    大家都知道javascript是单线程执行的,alert之后,就无法执行以下的函数,浏览器是按照从上到下的顺序来安排解析显示的. 其实虽然javascript是单线程的,但是浏览器是多线程的,典型的浏 ...

  10. Leetcode 之Binary Tree Inorder Traversal(43)

    树的中序遍历.先不断压入左结点至末尾,再访问,再压入右结点.注意和先序遍历的比较 vector<int> inorderTraversal(TreeNode *root) { vector ...