【题意】给定n棵高度初始为0的草,每天每棵草会长高a[i],m次收割,每次在d[i]天将所有>b[i]的草收割到b[i],求每次收割量。n<=500000。

【算法】线段树上二分

【题解】按照生长速度a[]排序后,容易发现数列永远单调。

在线段树上的区间维护以下值:

1.最后一棵草的高度a

2.上次收割日期b

3.总的草高和c

4.总的生长速度和d

5.收割标记D和B

上传的时候注意右区间收割晚于左区间时强制合并。

下传的时候注意标记D和B直接覆盖。

线段树上二分:

1.判断当前区间是否符合(一般为区间最右端点),否则返回r+1

2.若l=r,返回。

3.查询左区间。

4.若左区间不符合,查询右区间。

过程中可以顺便查询答案和修改标记。

  1. #include<cstdio>
  2. #include<algorithm>
  3. #include<cstring>
  4. #include<cctype>
  5. #define int long long
  6. using namespace std;
  7. int read(){
  8. int s=,t=;char c;
  9. while(!isdigit(c=getchar()))if(c=='-')t=-;
  10. do{s=s*+c-'';}while(isdigit(c=getchar()));
  11. return s*t;
  12. }
  13. const int maxn=;
  14. int a[maxn],sum,n,m;
  15. struct tree{int l,r,a,b,c,d,B,D;}t[maxn*];
  16. void modify(int k,int B,int D){t[k].B=B;t[k].D=D;t[k].a=B;t[k].b=D;t[k].c=B*(t[k].r-t[k].l+);}
  17. void up(int k){
  18. t[k].a=t[k<<|].a;
  19. t[k].b=t[k<<|].b;
  20. t[k].c=t[k<<].c+t[k<<].d*(t[k<<|].b-t[k<<].b)+t[k<<|].c;
  21. }
  22. void down(int k){
  23. if(t[k].D){
  24. modify(k<<,t[k].B,t[k].D);modify(k<<|,t[k].B,t[k].D);
  25. t[k].B=t[k].D=;
  26. }
  27. }
  28. void build(int k,int l,int r){
  29. t[k].l=l;t[k].r=r;
  30. if(l==r){t[k].a=;t[k].b=;t[k].c=;t[k].d=a[l];return;}
  31. int mid=(l+r)>>;
  32. build(k<<,l,mid);build(k<<|,mid+,r);
  33. up(k);
  34. t[k].d=t[k<<].d+t[k<<|].d;
  35. }
  36. void plus(int k,int D,int B){sum+=t[k].c+t[k].d*(D-t[k].b)-B*(t[k].r-t[k].l+);modify(k,B,D);}
  37. int find(int k,int D,int B){
  38. if(t[k].a+a[t[k].r]*(D-t[k].b)<=B)return t[k].r+;
  39. if(t[k].l==t[k].r){
  40. plus(k,D,B);
  41. return t[k].r;
  42. }
  43. down(k);
  44. int num;
  45. if((num=find(k<<,D,B))<=t[k<<].r){
  46. plus(k<<|,D,B);
  47. }
  48. else num=find(k<<|,D,B);
  49. up(k);
  50. return num;
  51. }
  52. #undef int
  53. int main(){
  54. #define int long long
  55. n=read();m=read();
  56. for(int i=;i<=n;i++)a[i]=read();
  57. sort(a+,a+n+);
  58. build(,,n);
  59. while(m--){
  60. int D=read(),B=read();
  61. sum=;
  62. find(,D,B);
  63. printf("%lld\n",sum);
  64. }
  65. return ;
  66. }

写复杂的题目前一定要列好程序草稿,把细节都写清楚,程序写出来就会比较清晰,不容易犯错。

原来这么复杂的题目也是可以1A的(躺

【BZOJ】4293: [PA2015]Siano 线段树上二分的更多相关文章

  1. BZOJ.4293.[PA2015]Siano(线段树)

    题目链接 \(Description\) 有一片n亩的土地,要在这上面种草. 在每一亩土地上都种植了一种独一无二的草,其中,第\(i\)亩土地的草每天会长高\(a[i]\)厘米. 一共会进行\(m\) ...

  2. LOJ 3059 「HNOI2019」序列——贪心与前后缀的思路+线段树上二分

    题目:https://loj.ac/problem/3059 一段 A 选一个 B 的话, B 是这段 A 的平均值.因为 \( \sum (A_i-B)^2 = \sum A_i^2 - 2*B \ ...

  3. 贪心+离散化+线段树上二分。。。 Samara University ACM ICPC 2016-2017 Quarterfinal Qualification Contest G. Of Zorcs and Axes

    题目链接:http://codeforces.com/gym/101149/problem/G 题目大意:给你n对数字,为(a[i], b[i]),给你m对数字,为(w[i], c[i]).给n对数字 ...

  4. hdu 5930 GCD 线段树上二分/ 强行合并维护信息

    from NOIP2016模拟题28 题目大意 n个点的序列,权值\(<=10^6\) q个操作 1.单点修改 2.求所有区间gcd中,不同数个数 分析 1.以一个点为端点,向左或向右的gcd种 ...

  5. HDU 4747 Mex【线段树上二分+扫描线】

    [题意概述] 一个区间的Mex为这个区间没有出现过的最小自然数,现在给你一个序列,要求求出所有区间的Mex的和. [题解] 扫描线+线段树. 我们在线段树上维护从当前左端点开始的前缀Mex,显然从左到 ...

  6. [NOIP2015模拟10.27] [JZOJ4270] 魔道研究 解题报告(动态开点+权值线段树上二分)

    Description “我希望能使用更多的魔法.不对,是预定能使用啦.最终我要被大家称呼为大魔法使.为此我决定不惜一切努力.”——<The Grimoire of Marisa>雾雨魔理 ...

  7. 【洛谷5537】【XR-3】系统设计(哈希_线段树上二分)

    我好像国赛以后就再也没有写过 OI 相关的博客 qwq Upd: 这篇博客是 NOIP (现在叫 CSP 了)之前写的,但是咕到 CSP 以后快一个月才发表 -- 我最近这么咕怎么办啊 -- 题目 洛 ...

  8. 5.4 省选模拟赛 修改 线段树优化dp 线段树上二分

    LINK:修改 题面就不放了 大致说一下做法.不愧是dls出的题 以前没见过这种类型的 不过还是自己dp的时候写丑了. 从这道题中得到一个结论 dp方程要写的优美一点 不过写的过丑 优化都优化不了. ...

  9. 9 16 模拟赛&关于线段树上二分总结

    1 考试时又犯了一个致命的错误,没有去思考T2的正解而是去简单的推了一下式子开始了漫漫找规律之路,不应该这样做的 为了得到规律虽然也打了暴力 但是还是打了一些不必要的程序 例如求组合数什么的比较浪费时 ...

随机推荐

  1. C#高级编程 (第六版) 学习 第一章:.Net体系结构

    第一章 .Net体系结构 1,公共语言运行库(Common Language Runtime, CLR) .Net Framework的核心是其运行库的执行环境,称为公共语言运行库,或.Net运行库. ...

  2. oracle 查询优化及sql改写

    ORACLE有个高速缓冲的概念,这个高速缓冲就是存放执行过的SQL语句,那oracle在执行sql语句的时候要做很多工作,例如解析sql语句,估算索引利用率,绑定变量,读取数据块等等这些操作.假设高速 ...

  3. Robotium之“去哪儿旅行”

    Robotium基于APK自动化测试,只有APK文件,没有源代码. Eclipse 默认的debug keystore可以在Windows->Preferences->Android-&g ...

  4. hdu-题目1421:搬寝室

    http://acm.hdu.edu.cn/showproblem.php?pid=1421 搬寝室 Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  5. django学习系列-01

    安装Django > pip install django==1.10.3(py2)或者>python3 -m pip install django==1.10.3(py3) 成功安装 D ...

  6. lxs1314 is not in the sudoers file. This incident will be reported.

    虚拟机下面  普通用户用sudo执行命令时报"xxx is not in the sudoers file.This incident will be reported"错误,解决 ...

  7. MySQL配置文件简单解析

    [mysqld] basedir = /data/mysql datadir = /data/mysqldata tmpdir = /data/mysqltmpdata //mysql的查询临时目录, ...

  8. 【刷题】BZOJ 5248 [2018多省省队联测]一双木棋

    Description 菲菲和牛牛在一块n行m列的棋盘上下棋,菲菲执黑棋先手,牛牛执白棋后手.棋局开始时,棋盘上没有任何棋子, 两人轮流在格子上落子,直到填满棋盘时结束.落子的规则是:一个格子可以落子 ...

  9. 【BZOJ3242】【NOI2013】快餐店(动态规划)

    [BZOJ3242][NOI2013]快餐店(动态规划) 题面 BZOJ 题解 假设我们要做的是一棵树,那么答案显然是树的直径的一半. 证明? 假设树的直径是\(2d\),那么此时最远点的距离是\(d ...

  10. 【BZOJ1492】【NOI2007】货币兑换(动态规划,CDQ分治,Splay)

    [BZOJ1492][NOI2007]货币兑换(动态规划,CDQ分治,Splay) 题面 BZOJ 洛谷 Description 小Y最近在一家金券交易所工作.该金券交易所只发行交易两种金券:A纪念券 ...