一道用来练习打标记的好题。

对于区间加和区间赋值两个操作分别用两个标记,分析如何打标记并下传标记(还是比较好分析的)。

坑点:查询操作时,我一开始把ans设为-0x3f3f3f3f(调试了好久才发现),这显然是不对的(看题目的数据设置),将其赋值为-1e18就行了。

代码中注释的内容是另一种打标记的方法,未打标记的是自己想出来的(自认为更好懂一些)。

  1 #include<bits/stdc++.h>
2 using namespace std;
3 const int N=1e6+10;
4 typedef long long ll;
5 struct node{
6 ll mmax,l,r;
7 ll tag1,tag2;//修改,加
8 }t[N<<2];
9 ll n,q,a[N];
10
11 void up(ll k){
12 t[k].mmax=max(t[k<<1].mmax,t[k<<1|1].mmax);
13 }
14
15 void rev(ll k,ll x,ll y){
16 if(x==1e9+1){
17 t[k].tag2+=y;
18 t[k].mmax+=y;
19 }
20 else{
21 t[k].tag1=x;
22 t[k].tag2=y;
23 t[k].mmax=x+y;
24 }
25 }
26
27 void pd(ll k){
28 rev(k<<1,t[k].tag1,t[k].tag2);
29 rev(k<<1|1,t[k].tag1,t[k].tag2);
30 t[k].tag1=1e9+1;
31 t[k].tag2=0;
32 }
33
34 /*void downtag1(ll k){
35 if(t[k].tag1!=1e9+1){
36 t[k<<1].mmax=t[k<<1].tag1=t[k].tag1;
37 t[k<<1].tag2=0;
38 t[k<<1|1].mmax=t[k<<1|1].tag1=t[k].tag1;
39 t[k<<1|1].tag2=0;
40 t[k].tag1=1e9+1;
41 }
42 }
43
44 void downtag2(ll k){
45 t[k<<1].tag2+=t[k].tag2;
46 t[k<<1].mmax+=t[k].tag2;
47 t[k<<1|1].tag2+=t[k].tag2;
48 t[k<<1|1].mmax+=t[k].tag2;
49 t[k].tag2=0;
50 }*/
51
52 void build(ll k,ll l,ll r){
53 t[k].l=l,t[k].r=r,t[k].tag1=1e9+1;
54 if(l==r){
55 t[k].mmax=a[l];
56 return ;
57 }
58 ll mid=(l+r)>>1;
59 build(k<<1,l,mid);build(k<<1|1,mid+1,r);
60 up(k);
61 }
62
63 void change1(ll k,ll l,ll r,ll x){
64 if(t[k].l>=l && t[k].r<=r){
65 t[k].mmax=x;
66 t[k].tag1=x,t[k].tag2=0;
67 return ;
68 }
69 pd(k);
70 //downtag1(k),downtag2(k);
71 ll mid=(t[k].l+t[k].r)>>1;
72 if(l<=mid) change1(k<<1,l,r,x);
73 if(r>mid) change1(k<<1|1,l,r,x);
74 up(k);
75 }
76
77 void change2(ll k,ll l,ll r,ll x){
78 if(t[k].l>=l && t[k].r<=r){
79 t[k].mmax+=x;
80 t[k].tag2+=x;
81 return ;
82 }
83 pd(k);
84 //downtag1(k),downtag2(k);
85 ll mid=(t[k].l+t[k].r)>>1;
86 if(l<=mid) change2(k<<1,l,r,x);
87 if(r>mid) change2(k<<1|1,l,r,x);
88 up(k);
89 }
90
91 ll query(ll k,ll l,ll r){
92 if(t[k].l>=l && t[k].r<=r) return t[k].mmax;
93 pd(k);
94 //downtag1(k),downtag2(k);
95 ll mid=(t[k].l+t[k].r)>>1;
96 ll ans=-1e18;
97 if(l<=mid) ans=max(ans,query(k<<1,l,r));
98 if(r>mid) ans=max(ans,query(k<<1|1,l,r));
99 return ans;
100 }
101
102 int main(){
103 scanf("%lld%lld",&n,&q);
104 for(int i=1;i<=n;i++)
105 scanf("%lld",&a[i]);
106 build(1,1,n);
107 while(q--){
108 ll op,l,r,x;
109 scanf("%lld%lld%lld",&op,&l,&r);
110 if(op==1){
111 scanf("%lld",&x);
112 change1(1,l,r,x);
113 }
114 else if(op==2){
115 scanf("%lld",&x);
116 change2(1,l,r,x);
117 }
118 else cout<<query(1,l,r)<<endl;
119 }
120 }

洛谷P1253 [yLOI2018] 扶苏的问题 (线段树)的更多相关文章

  1. 洛谷P3434 [POI2006]KRA-The Disks(线段树)

    洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...

  2. 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)

    LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...

  3. 洛谷P3928 Sequence2(dp,线段树)

    题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...

  4. 【题解】洛谷P4145 花神游历各国(线段树)

    洛谷P4145:https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)=1 一个限制条件 与正常线段树不同的是区间修改为开方 那么 ...

  5. 洛谷P4588 [TJOI2018]数学计算 【线段树】

    题目链接 洛谷P4588 题解 用线段树维护即可 #include<algorithm> #include<iostream> #include<cstring> ...

  6. 【洛谷3822】[NOI2017] 整数(线段树压位)

    题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...

  7. 洛谷P4556 雨天的尾巴(线段树合并)

    洛谷P4556 雨天的尾巴 题目链接 题解: 因为一个点可能存放多种物品,直接开二维数组进行统计时间.空间复杂度都不能承受.因为每一个点所拥有的物品只与其子树中的点有关,所以可以考虑对每一个点来建立一 ...

  8. 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化

    洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...

  9. 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)

    洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...

随机推荐

  1. 只会Excel想做图表可视化,让数据动起来?可以,快来围观啦(附大量模板下载)

    前言 之前我们分享过基于echarts 的数据可视化展示,很多朋友就说,不会软件开发,可不可以直接用Excel进行数据化的展示. 答案是肯定的,确实有这种方案,百度查询一查一大推,各种解决方案各种模板 ...

  2. YII扩展功能图

  3. 利用本地HTTPS模拟环境为FastAPI框架集成FaceBook社交三方登录

    原文转载自「刘悦的技术博客」https://v3u.cn/a_id_174 提起社交,就不得不说马克·扎克伯格(Mark Zuckerberg)一手创办的社交网络(FaceBook).进入2020年, ...

  4. 数据结构与算法【Java】02---链表

    前言 数据 data 结构(structure)是一门 研究组织数据方式的学科,有了编程语言也就有了数据结构.学好数据结构才可以编写出更加漂亮,更加有效率的代码. 要学习好数据结构就要多多考虑如何将生 ...

  5. 巨变!a16z 关于新一代数据基础设施架构的深度洞察

    点击上方 蓝字关注我们 来源 | a16z 作者 | Matt Bornstein, Martin Casado,Jennifer Li 翻译 | 夕颜 作为未来最重要的基础设施之一,数据正在成为各行 ...

  6. Java四大引用详解:强引用、软引用、弱引用、虚引用

    面试官考察Java引用会问到强引用.弱引用.软引用.虚引用,具体有什么区别?本篇单独来详解 @mikechen Java引用 从JDK 1.2版本开始,对象的引用被划分为4种级别,从而使程序能更加灵活 ...

  7. host,nslookup,dig 工具安装

    DNS-测试工具 在centos7.9 中 安装bind后发现缺少,检测工具 工具包安装: 1 [root@server]# yum install -y bind-utils 安装后再次查询,发现已 ...

  8. kafka手动设置offset

    项目中经常有需求不是消费kafka队列全部的数据,取区间数据 查询kafka最大的offset: ./kafka-run-class.sh kafka.tools.GetOffsetShell --b ...

  9. 《吐血整理》进阶系列教程-拿捏Fiddler抓包教程(14)-Fiddler断点(breakpoints)实战,篡改或伪造数据

    1.简介 上一篇主要就讲解和分享Fiddler断点的理论和操作,今天宏哥就用具体例子,将上一篇中的理论知识实践一下.而且在实际测试过程中,有时候需要修改请求或响应数据,或者直接模拟服务器响应,此时可以 ...

  10. 给你的博客加个aplayer

    1.在 layout.ejs 中 body 标签内粘贴入以下 <!--音乐--> <link rel="stylesheet" href="https: ...