洛谷P1253 [yLOI2018] 扶苏的问题 (线段树)
一道用来练习打标记的好题。
对于区间加和区间赋值两个操作分别用两个标记,分析如何打标记并下传标记(还是比较好分析的)。
坑点:查询操作时,我一开始把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] 扶苏的问题 (线段树)的更多相关文章
- 洛谷P3434 [POI2006]KRA-The Disks(线段树)
洛谷题目传送门 \(O(n)\)的正解算法对我这个小蒟蒻真的还有点思维难度.洛谷题解里都讲得很好. 考试的时候一看到300000就直接去想各种带log的做法了,反正不怕T...... 我永远只会有最直 ...
- 洛谷.3733.[HAOI2017]八纵八横(线性基 线段树分治 bitset)
LOJ 洛谷 最基本的思路同BZOJ2115 Xor,将图中所有环的异或和插入线性基,求一下线性基中数的异或最大值. 用bitset优化一下,暴力的复杂度是\(O(\frac{qmL^2}{w})\) ...
- 洛谷P3928 Sequence2(dp,线段树)
题目链接: 洛谷 题目大意在描述底下有.此处不赘述. 明显是个类似于LIS的dp. 令 $dp[i][j]$ 表示: $j=1$ 时表示已经处理了 $i$ 个数,上一个选的数来自序列 $A[0]$ 的 ...
- 【题解】洛谷P4145 花神游历各国(线段树)
洛谷P4145:https://www.luogu.org/problemnew/show/P4145 思路 这道题的重点在于sqrt(1)=1 一个限制条件 与正常线段树不同的是区间修改为开方 那么 ...
- 洛谷P4588 [TJOI2018]数学计算 【线段树】
题目链接 洛谷P4588 题解 用线段树维护即可 #include<algorithm> #include<iostream> #include<cstring> ...
- 【洛谷3822】[NOI2017] 整数(线段树压位)
题目: 洛谷 3822 分析: 直接按题意模拟,完了. 将每次加 / 减拆成不超过 \(32\) 个对单独一位的加 / 减. 考虑给一个二进制位(下称「当前位」)加 \(1\) 时,如果这一位本来就是 ...
- 洛谷P4556 雨天的尾巴(线段树合并)
洛谷P4556 雨天的尾巴 题目链接 题解: 因为一个点可能存放多种物品,直接开二维数组进行统计时间.空间复杂度都不能承受.因为每一个点所拥有的物品只与其子树中的点有关,所以可以考虑对每一个点来建立一 ...
- 洛谷P1712 [NOI2016]区间 尺取法+线段树+离散化
洛谷P1712 [NOI2016]区间 noi2016第一题(大概是签到题吧,可我还是不会) 链接在这里 题面可以看链接: 先看题意 这么大的l,r,先来个离散化 很容易,我们可以想到一个结论 假设一 ...
- 【题解】洛谷P2023 [AHOI2009] 维护序列(线段树)
洛谷P2023:https://www.luogu.org/problemnew/show/P2023 思路 需要2个Lazy-Tag 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
随机推荐
- 第五天python3 内建函数总结
id() 返回对象在内存中的地址 hash() 返回对象的hash值 type() 返回对象的类型 float() int() bin() hex() oct() bool() list() tup ...
- [spring]spring的bean自动装配机制
7.bean的自动装配 是spring满足bean依赖的一种方式 spring会在上下文中自动寻找,并自动给bean装配属性 spring的装配方式: (1)手动装配 在people类中依赖了cat和 ...
- SkiaSharp 之 WPF 自绘 拖曳小球(案例版)
感谢各位大佬和粉丝的厚爱和关心( 催更),我会再接再厉的,其实这也是督促自己的一种方式,非常感谢. 刚写了一篇万字长文,自己也休养生息(低调发育)了一段时间,接下来来几个小案例. 拖曳小球 WPF的拖 ...
- [BJDCTF2020]Cookie is so stable-1|SSTI注入
1.打开之后在各个界面查看源代码,未发现很明显的有用信息,仅发现了提示,结果如下: 2.尝试输入数据,结果就是输入什么就回显什么,也未进行过滤,尝试进行sql注入失败,结果如下: 3.那就根据提示抓包 ...
- Windows环境中Hadoop配置
我们之前已经在Windows中安装好了Hadoop,并且配置了环境变量.如果要在本地上运行的,还需要这两个文件,可以去找一下,放到Hadoop的bin目录下面.这样我们写好的mr程序就可以直接在Win ...
- .NET性能优化-使用SourceGenerator-Logger记录日志
前言 在现在许许多多的应用系统中,日志非常关键,它即是排查问题的强力工具,也是程序员居家旅行工作甩锅必备良品. 在团队中编码中,我们都要求对于那些会变更数据的接口.调用第三方的接口记录请求和响应参数, ...
- 使用Typora+EasyBlogImageForTypora写博客,无图床快速上传图片
如今,使用markdown攥写博客已成为主流,而Typora作为markdown的主流工具,广受大众好评,本文讲述从Typora的安装到快速将Typora写好的博文上传到博客园 Typora下载 Ty ...
- jquery转换为同步请求
$.ajax({ async: false, //采用异步的方式提交,不添加默认是异步,布尔值为 true type : 'POST', url : 'https://i-beta.cnblogs.c ...
- powershell 执行策略
前言 上一篇博文,我介绍了一下powershell和cmd的对比.通过学习,我发现powershell的确比cmd更加power,也更加适应现在的使用场景. 那么本文将继续介绍一个powershell ...
- Vue3系列11--Teleport传送组件
Teleport 是一种能够将我们的模板移动到 DOM 中 Vue app 之外的其他位置的技术,不受父级style.v-show等属性影响,但data.prop数据依旧能够共用的技术:类似于 Rea ...