题目链接

http://uoj.ac/problem/164

题解

神仙线段树题。

首先赋值操作可以等价于减掉正无穷再加上\(x\).

假设某个位置从前到后的操作序列是: \(x_1,x_2,...,x_k\)

那么则有: 当前值就是该序列的最大后缀和,历史最大值就是该序列的最大子段和!

然后如果把最大子段和定义加法,那么就变成了区间加单点查询。

直接线段树维护即可,时间复杂度\(O(n\log n)\).

(好吧,其实似乎把赋值看做减去正无穷再加\(x\)似乎是可以被卡爆long long的……但是它确实过了)

代码

  1. #include<bits/stdc++.h>
  2. #define llong long long
  3. using namespace std;
  4. const int N = 5e5;
  5. void updsum(llong &x,llong y) {x = x>=y?x:y;}
  6. struct Data
  7. {
  8. llong s,ls,rs,lrs;
  9. Data() {}
  10. Data(llong x) {lrs = x; x = x<0ll?0ll:x; s = ls = rs = x;}
  11. Data(llong _s,llong _ls,llong _rs,llong _lrs):s(_s),ls(_ls),rs(_rs),lrs(_lrs) {}
  12. bool operator ==(const Data &arg) const {return s==arg.s&&ls==arg.ls&&rs==arg.rs&&lrs==arg.lrs;}
  13. };
  14. Data operator +(const Data &arg1,const Data &arg2)
  15. {
  16. Data ret(0,0,0,0);
  17. ret.lrs = arg1.lrs+arg2.lrs;
  18. ret.ls = max(arg1.ls,arg1.lrs+arg2.ls);
  19. ret.rs = max(arg1.rs+arg2.lrs,arg2.rs);
  20. ret.s = max(max(arg1.s,arg2.s),arg1.rs+arg2.ls);
  21. return ret;
  22. }
  23. llong a[N+3];
  24. int n,q;
  25. struct SegmentTree
  26. {
  27. Data sgt[(N<<2)+3];
  28. void pushdown(int u)
  29. {
  30. sgt[u<<1] = sgt[u<<1]+sgt[u];
  31. sgt[u<<1|1] = sgt[u<<1|1]+sgt[u];
  32. sgt[u] = Data(0);
  33. }
  34. void build(int u,int le,int ri,llong a[])
  35. {
  36. if(le==ri) {sgt[u] = Data(a[le]); return;}
  37. int mid = (le+ri)>>1;
  38. build(u<<1,le,mid,a); build(u<<1|1,mid+1,ri,a);
  39. }
  40. void add(int u,int le,int ri,int lb,int rb,llong x)
  41. {
  42. if(le>=lb && ri<=rb) {sgt[u] = sgt[u]+Data(x); return;}
  43. pushdown(u);
  44. int mid = (le+ri)>>1;
  45. if(lb<=mid) add(u<<1,le,mid,lb,rb,x);
  46. if(rb>mid) add(u<<1|1,mid+1,ri,lb,rb,x);
  47. }
  48. llong query(int u,int le,int ri,int pos,int typ) //1:cur 2:hist
  49. {
  50. if(le==ri) {return typ==1?sgt[u].rs:sgt[u].s;}
  51. pushdown(u);
  52. int mid = (le+ri)>>1;
  53. if(pos<=mid) return query(u<<1,le,mid,pos,typ);
  54. else return query(u<<1|1,mid+1,ri,pos,typ);
  55. }
  56. } sgt;
  57. int main()
  58. {
  59. scanf("%d%d",&n,&q); llong cur = 0ll;
  60. for(int i=1; i<=n; i++) scanf("%lld",&a[i]),cur = max(cur,a[i]);
  61. sgt.build(1,1,n,a);
  62. while(q--)
  63. {
  64. int opt; scanf("%d",&opt);
  65. if(opt==1||opt==2)
  66. {
  67. int l,r; llong x; scanf("%d%d%lld",&l,&r,&x); if(opt==1) cur+=x; if(opt==2) x=-x;
  68. sgt.add(1,1,n,l,r,x);
  69. }
  70. else if(opt==3)
  71. {
  72. int l,r; llong x; scanf("%d%d%lld",&l,&r,&x);
  73. sgt.add(1,1,n,l,r,-cur); sgt.add(1,1,n,l,r,x);
  74. }
  75. else if(opt==4||opt==5)
  76. {
  77. int pos; scanf("%d",&pos);
  78. llong ans = sgt.query(1,1,n,pos,opt-3); printf("%lld\n",ans);
  79. }
  80. }
  81. return 0;
  82. }

UOJ #164 [清华集训2015]V (线段树)的更多相关文章

  1. 【uoj#164】[清华集训2015]V 线段树维护历史最值

    题目描述 给你一个长度为 $n$ 的序列,支持五种操作: $1\ l\ r\ x$ :将 $[l,r]$ 内的数加上 $x$ :$2\ l\ r\ x$ :将 $[l,r]$ 内的数减去 $x$ ,并 ...

  2. 【题解】P4247 [清华集训]序列操作(线段树修改DP)

    [题解]P4247 [清华集训]序列操作(线段树修改DP) 一道神仙数据结构(DP)题. 题目大意 给定你一个序列,会区间加和区间变相反数,要你支持查询一段区间内任意选择\(c\)个数乘起来的和.对1 ...

  3. 清华集训2015 V

    #164. [清华集训2015]V http://uoj.ac/problem/164 统计 描述 提交 自定义测试 Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化题目,题目中的常数 ...

  4. BZOJ 4732 UOJ #268 [清华集训2016]数据交互 (树链剖分、线段树)

    题目链接 (BZOJ) https://www.lydsy.com/JudgeOnline/problem.php?id=4732 (UOJ) http://uoj.ac/problem/268 题解 ...

  5. 「清华集训2015」V

    「清华集训2015」V 题目大意: 你有一个序列,你需要支持区间加一个数并对 \(0\) 取 \(\max\),区间赋值,查询单点的值以及单点历史最大值. 解题思路: 观察发现,每一种修改操作都可以用 ...

  6. [UOJ#274][清华集训2016]温暖会指引我们前行

    [UOJ#274][清华集训2016]温暖会指引我们前行 试题描述 寒冬又一次肆虐了北国大地 无情的北风穿透了人们御寒的衣物 可怜虫们在冬夜中发出无助的哀嚎 “冻死宝宝了!” 这时 远处的天边出现了一 ...

  7. 2018.07.28 uoj#164. 【清华集训2015】V(线段树)

    传送门 线段树好题. 要求支持的操作: 1.区间变成max(xi−a,0)" role="presentation" style="position: rela ...

  8. UOJ #164. 【清华集训2015】V | 线段树

    题目链接 UOJ #164 题解 首先,这道题有三种询问:区间加.区间减(减完对\(0\)取\(\max\)).区间修改. 可以用一种标记来表示--标记\((a, b)\)表示把原来的值加上\(a\) ...

  9. @uoj - 164@ 【清华集训2015】V

    目录 @description@ @solution@ @accepted code@ @details@ @description@ Picks博士观察完金星凌日后,设计了一个复杂的电阻器.为了简化 ...

随机推荐

  1. C#特性 详解

    一:Conditional:条件特性,预定义了一个条件方法. 使用方法: [Conditional("DEBUG")] public void test() { MessageBo ...

  2. Django rest-framework框架-组件之路由

    路由: a. url(r'^(?P<version>[v1|v2]+)/v1/$',views.ViewView.as_view()) url(r'^(?P<version>[ ...

  3. Css制作table细线表格

    制作细线表格,我想应该是最基本的css知识了,记录下来巩固下. 推荐: table{ border-collapse:collapse; border: 1px solid #000000; } td ...

  4. Plugin 免费CSS生成器CssCollector

    下载: 百度云 自己在做Web开发的时候,页面里会有很多样式类,一个个复制到样式表里总感觉很麻烦 网上也没有找到合适的工具,可以一键生成样式表 所以,干脆自己做一个咯~ 案例展示 花了一天时间,CSS ...

  5. Point to class member

    #include <iostream> using namespace std; class Student { public: Student(string n, int nu):nam ...

  6. 6.Java集合-LinkedList实现原理及源码分析

    Java中LinkedList的部分源码(本文针对1.7的源码) LinkedList的基本结构 jdk1.7之后,node节点取代了 entry ,带来的变化是,将1.6中的环形结构优化为了直线型链 ...

  7. nohub

    nohup command > myout.file 2>&1 & nohup command > /dev/null 2>&1 &

  8. 学习CSRF漏洞并挖掘CSRF漏洞

    什么是跨站请求伪造? 跨站请求伪造(英语:Cross-siterequest forgery),也被称为one-clickattack或者session riding,通常缩写为CSRF或者XSRF, ...

  9. TSN(Temporal Segment Networks)

    一.算法详解 二.代码解析(pytorch版) 训练代码:https://blog.csdn.net/u014380165/article/details/79058147 测试代码:https:// ...

  10. zabbix low-level discovery 监控mysql

    当一台服务器上MySQL有多个实例的时候,MySQL占用多个不同端口.利用zabbix的low-level discovery可以轻松监控. 思路参考:http://dl528888.blog.51c ...