洛谷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 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
随机推荐
- ShardingSphere数据分片
码农在囧途 坚持是一件比较难的事,坚持并不是自欺欺人的一种自我麻痹和安慰,也不是做给被人的,我觉得,坚持的本质并没有带着过多的功利主义,如果满是功利主义,那么这个坚持并不会长久,也不会有好的收获,坚持 ...
- Matplotlib(基本用法)
Matplotlib 是数据分析绘图的常见模块,可以算是 2D-绘图(Python)领域使用最广泛的套件,可以将数据图形化,并且提供多样化的输出格式,利于数据的显示并分析. 接下来展示的是Matplo ...
- 见微知著,细节上雕花:SVG生成矢量格式网站图标(Favicon)探究
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_215 Favicon是favorites icon的缩写,也被称为website icon(站点图标).page icon(页面图 ...
- mysql-shell for GreatSQL 8.0.27编译安装及使用
目录 0. 前言 1. 修改说明 2. 编译mysql-shell 2.1 环境准备 2.2 开始编译mysql & mysql-shell 2.3 利用patchelf修改mysqlsh二进 ...
- DolphinScheduler 荣获 2021 中国开源云联盟优秀开源项目奖!
点击上方 蓝字关注我们 好消息,中国开源云联盟(China Open Source Cloud League,简称"COSCL")于近日公布 2021 杰出开源贡献者.优秀开源项目 ...
- Unity3D学习笔记12——渲染纹理
目录 1. 概述 2. 详论 3. 问题 1. 概述 在文章<Unity3D学习笔记11--后处理>中论述了后处理是帧缓存(Framebuffer)技术实现之一:而另外一个帧缓存技术实现就 ...
- Flutter 实战(一):列表项内容可自定义的列表组件
前言 本篇文的目的是熟练掌握 Flutter 组件的封装,并且使用回调函数实现主要功能. 本组件的设计灵感来源于 Element 组件库的 table 组件. 正题 定义回调函数 在此之前,必须要了解 ...
- QQ高级功能
本篇文章为微信公众号:酿俗 教学内容请跟着小编一起探索吧! 第一步解锁微信豆影藏内容 随后下载需要的材料,注意!手机可能会提示有病毒!这里使用这些功能报病毒很正常 其实并没有病毒只是手机厂商的安全系统 ...
- Util和Helper类
Util和Helper Util Util类,应该是一个无状态的类,只有静态方法. 比如在获取某些类的全局实例化对象的时候可以使用. public class ParamUtil { ... publ ...
- Android Module配置C++支持
AndroidStudio提供了创建项目时选择C++支持的模板,但是新建Module的时候并没有C++模板, 要如何配置Module的C++支持呢? 虽然Module没有提供C++模板,但是我们可以手 ...