CF997E Good Subsegments

传送门

和 CF526F 差不多,只不过这道题是对多个子区间进行询问。

据说有一个叫析合树的东西可以在线做,不过有时间再说吧。

考虑离线询问,将每个询问固定至其右端点。

则我们要做的是在那道题的基础上,记录每个位置的历史贡献。

由于 \((i,i)\) 这个区间一直是符合条件的,故线段树根节点的最小值一定为 \(0\) ,我们只需要另外再维护一个标记,每次判断其是否与父节点的最小值一样即可。

贴代码

  1. /*---Author:HenryHuang---*/
  2. /*---Never Settle---*/
  3. #include<bits/stdc++.h>
  4. using namespace std;
  5. const int maxn=1.2e5+5;
  6. int val[maxn];
  7. int num[maxn<<2],tot[maxn<<2],tag[maxn<<2],tt[maxn<<2];
  8. long long sum[maxn<<2];
  9. void up(int t){
  10. num[t]=min(num[t<<1],num[t<<1|1]);tot[t]=0;
  11. if(num[t]==num[t<<1]) tot[t]+=tot[t<<1];
  12. if(num[t]==num[t<<1|1]) tot[t]+=tot[t<<1|1];
  13. sum[t]=sum[t<<1]+sum[t<<1|1];
  14. return ;
  15. }
  16. void down(int t){
  17. if(tag[t]){
  18. num[t<<1]+=tag[t],num[t<<1|1]+=tag[t];
  19. tag[t<<1]+=tag[t],tag[t<<1|1]+=tag[t];
  20. tag[t]=0;
  21. }
  22. if(tt[t]){
  23. if(num[t<<1]==num[t]) sum[t<<1]+=1ll*tot[t<<1]*tt[t],tt[t<<1]+=tt[t];
  24. if(num[t<<1|1]==num[t]) sum[t<<1|1]+=1ll*tot[t<<1|1]*tt[t],tt[t<<1|1]+=tt[t];
  25. tt[t]=0;
  26. }
  27. }
  28. void build(int l,int r,int t){
  29. if(l==r){
  30. num[t]=tot[t]=1;
  31. return ;
  32. }
  33. int mid=(l+r)>>1;
  34. build(l,mid,t<<1);
  35. build(mid+1,r,t<<1|1);
  36. up(t);return ;
  37. }
  38. void update(int ll,int rr,int l,int r,int nu,int t){
  39. if(ll<=l&&r<=rr){
  40. tag[t]+=nu;
  41. num[t]+=nu;
  42. return ;
  43. }
  44. int mid=(l+r)>>1;down(t);
  45. if(ll<=mid) update(ll,rr,l,mid,nu,t<<1);
  46. if(rr>mid) update(ll,rr,mid+1,r,nu,t<<1|1);
  47. up(t);return ;
  48. }
  49. long long query(int ll,int rr,int l,int r,int t){
  50. if(ll<=l&&r<=rr){
  51. return sum[t];
  52. }
  53. int mid=(l+r)>>1;down(t);long long tmp=0;
  54. if(ll<=mid) tmp+=query(ll,rr,l,mid,t<<1);
  55. if(rr>mid) tmp+=query(ll,rr,mid+1,r,t<<1|1);
  56. return tmp;
  57. }
  58. stack<pair<int,int> > mn,mx;
  59. long long ans[maxn];
  60. vector<pair<int,int> > opt[maxn];
  61. int owo[maxn];
  62. int main(){
  63. ios::sync_with_stdio(0);
  64. cin.tie(0),cout.tie(0);
  65. int n;cin>>n;
  66. for(int i=1;i<=n;++i){
  67. int b;cin>>b;
  68. val[i]=b;
  69. }
  70. int Q;cin>>Q;
  71. for(int i=1;i<=Q;++i){
  72. int l,r;cin>>l>>r;
  73. opt[r].emplace_back(l,i);
  74. }
  75. mx.emplace(0,2e9),mn.emplace(0,0);
  76. build(1,n,1);
  77. for(int i=1;i<=n;++i){
  78. int p,q;
  79. while((!mx.empty())&&mx.top().second<=val[i]){
  80. tie(p,q)=mx.top();mx.pop();
  81. update(mx.top().first+1,p,1,n,val[i]-q,1);
  82. }
  83. mx.emplace(i,val[i]);
  84. while((!mn.empty())&&mn.top().second>=val[i]){
  85. tie(p,q)=mn.top();mn.pop();
  86. update(mn.top().first+1,p,1,n,q-val[i],1);
  87. }
  88. mn.emplace(i,val[i]);
  89. update(1,i,1,n,-1,1);//[i,i]一定合法
  90. ++tt[1],sum[1]+=tot[1];
  91. for(auto x:opt[i]){
  92. tie(p,q)=x;
  93. ans[q]+=query(p,i,1,n,1);
  94. }
  95. }
  96. for(int i=1;i<=Q;++i) cout<<ans[i]<<'\n';
  97. return 0;
  98. }

「CF997E」 Good Subsegments的更多相关文章

  1. 「译」JUnit 5 系列:条件测试

    原文地址:http://blog.codefx.org/libraries/junit-5-conditions/ 原文日期:08, May, 2016 译文首发:Linesh 的博客:「译」JUni ...

  2. 「译」JUnit 5 系列:扩展模型(Extension Model)

    原文地址:http://blog.codefx.org/design/architecture/junit-5-extension-model/ 原文日期:11, Apr, 2016 译文首发:Lin ...

  3. JavaScript OOP 之「创建对象」

    工厂模式 工厂模式是软件工程领域一种广为人知的设计模式,这种模式抽象了创建具体对象的过程.工厂模式虽然解决了创建多个相似对象的问题,但却没有解决对象识别的问题. function createPers ...

  4. 「C++」理解智能指针

    维基百科上面对于「智能指针」是这样描述的: 智能指针(英语:Smart pointer)是一种抽象的数据类型.在程序设计中,它通常是经由类型模板(class template)来实做,借由模板(tem ...

  5. 「JavaScript」四种跨域方式详解

    超详细并且带 Demo 的 JavaScript 跨域指南来了! 本文基于你了解 JavaScript 的同源策略,并且了解使用跨域跨域的理由. 1. JSONP 首先要介绍的跨域方法必然是 JSON ...

  6. 「2014-5-31」Z-Stack - Modification of Zigbee Device Object for better network access management

    写一份赏心悦目的工程文档,是很困难的事情.若想写得完善,不仅得用对工具(use the right tools),注重文笔,还得投入大把时间,真心是一件难度颇高的事情.但,若是真写好了,也是善莫大焉: ...

  7. 「2014-3-18」multi-pattern string match using aho-corasick

    我是擅(倾)长(向)把一篇文章写成杂文的.毕竟,写博客记录生活点滴,比不得发 paper,要求字斟句酌八股结构到位:风格偏杂文一点,也是没人拒稿的.这么说来,arxiv 就好比是 paper 世界的博 ...

  8. 「2014-3-17」C pointer again …

    记录一个比较基础的东东-- C 语言的指针,一直让人又爱又恨,爱它的人觉得它既灵活又强大,恨它的人觉得它太过于灵活太过于强大以至于容易将人绕晕.最早接触 C 语言,还是在刚进入大学的时候,算起来有好些 ...

  9. 「2014-3-13」Javascript Engine, Java VM, Python interpreter, PyPy – a glance

    提要: url anchor (ajax) => javascript engine (1~4 articles) => java VM vs. python interpreter =& ...

随机推荐

  1. wangEditor 轻量级富文本框编辑器使用方法

    首先第一步先去wangEditor官网下载所需要的脚本文件! http://www.wangeditor.com/ 接下来先在你的项目的HTML标签里加上这样一段标签: 1 <body> ...

  2. 【NX二次开发】Block UI OrientXpress

    属性说明 属性   类型   描述   常规           BlockID    String    控件ID    Enable    Logical    是否可操作    Group    ...

  3. linux安装配置交叉编译器arm-linux-gnueabi-gcc

    要使我们在x86架构下运行的程序迁移至ARM架构的开发板中运行时,需要通过交叉编译器将x86下编写的程序进行编译后,开发版才能运行. 在安装之前我们需要了解,什么是交叉编译器. 一.下载交叉编译器 这 ...

  4. 【C语言】整型在内存中的存储

    整型在内存中的存储 1.整型的归类 char short int long 以上都分为有符号(signed)与无符号(unsigned)的类型 2.原码.反码和补码 2.1 定义 计算机在表示一个数字 ...

  5. Docker 优雅终止方案

    作为一名系统工程师,你可能经常需要重启容器,毕竟Kubernetes的优势就是快速弹性伸缩和故障恢复,遇到问题先重启容器再说,几秒钟即可恢复,实在不行再重启系统,这就是系统重启工程师的杀手锏.然而现实 ...

  6. Ubuntu18.04 LTS x64 构建ARM交叉编译环境(尝试,但失败了!!!估计是编译器没选对)

    [测试而已,由于需要了解编译器和处理器体系,因此先放弃该方法] 动机 入门嵌入式开发,又需要 Windows 又需要 Linux,但资料给的竟然是 Ubuntu9,导致我不能使用 VSCode Rem ...

  7. 27、myslq更改为不自动提交

    27.1.说明: 默认情况下, MySQL启用自动提交模式(变量autocommit为ON).这意味着, 只要你执行DML操作的语句, MySQL会立即隐式提交事务(Implicit Commit). ...

  8. layui checkbox 样式

    layui  checkbox扩展插件:  一.新建  checkbox.css 样式文件 .checkBox .block{float:left; margin:5px;padding:6px 6p ...

  9. JUnit5编写基本测试

    JUnit5的测试不是通过名称,而是通过注解来标识的. 测试类与方法 Test Class:测试类,必须包含至少一个test方法,包括: 最外层的class static member class @ ...

  10. POJ 3026 Borg Maze 广搜(BFS)+最小生成树

    题意:从S出发,去抓每一个A,求总路径最短长度.在S点和A点人可以分身成2人,不过一次只能让一个人走. 思路是先利用BFS求出各点之间的距离,建成图,再套用最小生成树模板. 一次性A了.不过觉得在判断 ...