题目链接

BZOJ1113

题解

显然只与高有关,每次选择所有海报中最低的覆盖所有海报,然后分治两边

每个位置会被调用一次,复杂度\(O(nlogn)\)

\(upd:\)智障了,,是一道\(O(n)\)普及-贪心模拟题QAQ

  1. #include<algorithm>
  2. #include<iostream>
  3. #include<cstring>
  4. #include<cstdio>
  5. #include<cmath>
  6. #include<map>
  7. #define Redge(u) for (int k = h[u],to; k; k = ed[k].nxt)
  8. #define REP(i,n) for (int i = 1; i <= (n); i++)
  9. #define mp(a,b) make_pair<int,int>(a,b)
  10. #define cls(s) memset(s,0,sizeof(s))
  11. #define cp pair<int,int>
  12. #define LL long long int
  13. #define ls (u << 1)
  14. #define rs (u << 1 | 1)
  15. using namespace std;
  16. const int maxn = 250005,maxm = 100005,INF = 1000000000;
  17. inline int read(){
  18. int out = 0,flag = 1; char c = getchar();
  19. while (c < 48 || c > 57){if (c == '-') flag = -1; c = getchar();}
  20. while (c >= 48 && c <= 57){out = (out << 3) + (out << 1) + c - 48; c = getchar();}
  21. return out * flag;
  22. }
  23. int h[maxn],n,ans;
  24. int pos[maxn << 2],mn[maxn << 2],tag[maxn << 2];
  25. inline void upd(int u){
  26. if (mn[ls] <= mn[rs]) pos[u] = pos[ls];
  27. else pos[u] = pos[rs];
  28. mn[u] = min(mn[ls],mn[rs]);
  29. }
  30. inline void pd(int u){
  31. if (tag[u]){
  32. mn[ls] += tag[u]; mn[rs] += tag[u];
  33. tag[ls] += tag[u]; tag[rs] += tag[u];
  34. tag[u] = 0;
  35. }
  36. }
  37. void add(int u,int l,int r,int L,int R,int v){
  38. if (l >= L && r <= R){mn[u] += v; tag[u] += v; return;}
  39. pd(u);
  40. int mid = l + r >> 1;
  41. if (mid >= L) add(ls,l,mid,L,R,v);
  42. if (mid < R) add(rs,mid + 1,r,L,R,v);
  43. upd(u);
  44. }
  45. cp query(int u,int l,int r,int L,int R){
  46. if (l >= L && r <= R) return mp(mn[u],pos[u]);
  47. pd(u);
  48. int mid = l + r >> 1;
  49. if (mid >= R) return query(ls,l,mid,L,R);
  50. if (mid < L) return query(rs,mid + 1,r,L,R);
  51. cp t1 = query(ls,l,mid,L,R),t2 = query(rs,mid + 1,r,L,R);
  52. return mp(min(t1.first,t2.first),t1.first <= t2.first ? t1.second : t2.second);
  53. }
  54. void build(int u,int l,int r){
  55. if (l == r){mn[u] = h[l]; pos[u] = l; return;}
  56. int mid = l + r >> 1;
  57. build(ls,l,mid);
  58. build(rs,mid + 1,r);
  59. upd(u);
  60. }
  61. void solve(int l,int r){
  62. if (l > r) return;
  63. cp t = query(1,1,n,l,r);
  64. if (t.first){
  65. if (t.second > l) add(1,1,n,l,t.second - 1,-t.first);
  66. if (t.second < r) add(1,1,n,t.second + 1,r,-t.first);
  67. ans++;
  68. }
  69. solve(l,t.second - 1);
  70. solve(t.second + 1,r);
  71. }
  72. int main(){
  73. n = read();
  74. REP(i,n) read(),h[i] = read();
  75. build(1,1,n);
  76. solve(1,n);
  77. printf("%d\n",ans);
  78. return 0;
  79. }

BZOJ1113 [Poi2008]海报PLA 【分治 + 线段树】的更多相关文章

  1. BZOJ1113 Poi2008 海报PLA【单调栈】【水】

    BZOJ1113 Poi2008 海报PLA Description N个矩形,排成一排. 现在希望用尽量少的矩形海报Cover住它们. Input 第一行给出数字N,代表有N个矩形.N在[1,250 ...

  2. bzoj1113: [Poi2008]海报PLA

    #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #i ...

  3. BZOJ 1113: [Poi2008]海报PLA

    1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1025  Solved: 679[Submit][Statu ...

  4. 【BZOJ-1113】海报PLA 单调栈

    1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 896  Solved: 573[Submit][Status ...

  5. UVALive 7148 LRIP【树分治+线段树】

    题意就是要求一棵树上的最长不下降序列,同时不下降序列的最小值与最大值不超过D. 做法是树分治+线段树,假设树根是x,y是其当前需要处理的子树,对于子树y,需要处理出两个数组MN,MX,MN[i]表示以 ...

  6. 1113: [Poi2008]海报PLA

    1113: [Poi2008]海报PLA Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 765  Solved: 466[Submit][Status ...

  7. 【loj6145】「2017 山东三轮集训 Day7」Easy 动态点分治+线段树

    题目描述 给你一棵 $n$ 个点的树,边有边权.$m$ 次询问,每次给出 $l$ .$r$ .$x$ ,求 $\text{Min}_{i=l}^r\text{dis}(i,x)$ . $n,m\le ...

  8. 【BZOJ4372】烁烁的游戏 动态树分治+线段树

    [BZOJ4372]烁烁的游戏 Description 背景:烁烁很喜欢爬树,这吓坏了树上的皮皮鼠.题意:给定一颗n个节点的树,边权均为1,初始树上没有皮皮鼠.烁烁他每次会跳到一个节点u,把周围与他距 ...

  9. 【bzoj4372】烁烁的游戏 动态点分治+线段树

    题目描述 给一颗n个节点的树,边权均为1,初始点权均为0,m次操作:Q x:询问x的点权.M x d w:将树上与节点x距离不超过d的节点的点权均加上w. 输入 第一行两个正整数:n,m接下来的n-1 ...

随机推荐

  1. Received non-all-whitespace CHARACTERS or CDATA event in nextTag(). ,无法整齐打印验证错误。 解析XML文档出现的问题

    在启动keyCloak,想要在standAlone模式下切换数据库,修改standAlone.xml文件时. 在bin/目录下启动standAlone模式出现错误: 10:07:24,799 INFO ...

  2. github在版本库中删除某个文件的所有历史记录

    github的目的就是版本控制,记录每一个版本的变动.然而有的时候我们往往希望从版本库中彻底删除某个文件,不再显示在历史记录中.例如不小心上传了一堆错误的文件,或者不小心上传了帐号.密码,那么这个时候 ...

  3. UITabBarController的使用

    UITabBarController的使用 前言: 苹果开发的小伙伴都知道,项目中只要用到了UITabBarController,UITabBarController就是APP的骨架.所以熟练掌握UI ...

  4. PropertyGrid中的枚举显示为中文

    参考http://www.cnblogs.com/yank/archive/2011/09/17/2179598.html 在上述文档的基础上做了改进.从EnumConverter类派生 显示效果: ...

  5. python数据分析画图体验

    对于numpy的函数,pands等,不是很熟,我来copy一下code,敲击一下,找找感觉. 默认的导入包import numpy as npimport matplotlib.pyplot as p ...

  6. ubuntu16更新源

    http://blog.csdn.net/fengyuzhiren/article/details/54844870

  7. 【Alpha发布】贡献分分配

    最后贡献分分配: (1211)王嘉豪:32 (1186)黄雨萌:36 (1182)佘彦廷:40 (1208)何小松:50 (1200)鲁聃:62 (1174)邢浩:64 (1193)刘乾:66

  8. pycharm 打开两个项目

    1.之前用打开文件,选择一直选不到整个项目,打开也都是在已经打开的项目窗口中加载一个文件. 2.网上有介绍说设置,但是自己的pycharm经过中文汉化,许多设置项已消失不见... 3.最近打开,直接操 ...

  9. POJ 1185 炮兵阵地 状压dp

    题目链接: http://poj.org/problem?id=1185 炮兵阵地 Time Limit: 2000MS Memory Limit: 65536K 问题描述 司令部的将军们打算在N*M ...

  10. C++内存布局(1)-让new出的两个变量在堆上的地址连续

    大家都知道栈的地址按照从高到低的顺序增长的, 而堆的地址是按照从底到高的顺序增长的. ); ); cout<<"n1,n2所指的地址:" << n1 < ...