洛谷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 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
随机推荐
- linux安全之网络设置
可以通过/etc/sysctl.conf控制和配置Linux内核及网络设置. # 避免放大攻击 net.ipv4.icmp_echo_ignore_broadcasts = 1 # 开启恶意icmp错 ...
- 关于微信小程序生产环境体验版获取不到openId的问题(大坑)
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_119 我们知道openid是微信用户验证的重要标识,支付功能严重依赖这个东西,之前我们做微信支付的时候是通过在微信客户端直接调用官 ...
- 见微知著,细节上雕花:SVG生成矢量格式网站图标(Favicon)探究
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_215 Favicon是favorites icon的缩写,也被称为website icon(站点图标).page icon(页面图 ...
- 技术分享 | 为什么MGR一致性模式不推荐AFTER
GreatSQL社区原创内容未经授权不得随意使用,转载请联系小编并注明来源. 1.引子 2.AFTER 的写一致性 3.AFTER 的读一致性 4.AFTER 执行流程 5.BEFORE 执行流程 6 ...
- 60行自己动手写LockSupport是什么体验?
60行自己动手写LockSupport是什么体验? 前言 在JDK当中给我们提供的各种并发工具当中,比如ReentrantLock等等工具的内部实现,经常会使用到一个工具,这个工具就是LockSupp ...
- mongo数据同步的三种方案
(一)直接复制data目录(需要停止源和目标的mongo服务)1.针对目标mongo服务已经存在,并正在运行的(mongo2-->mongo).执行步骤:(1).停止源/目标服务器的mongo服 ...
- 全局异常处理及参数校验-SpringBoot 2.7 实战基础 (建议收藏)
优雅哥 SpringBoot 2.7 实战基础 - 08 - 全局异常处理及参数校验 前后端分离开发非常普遍,后端处理业务,为前端提供接口.服务中总会出现很多运行时异常和业务异常,本文主要讲解在 Sp ...
- 基于bert_bilstm_crf的命名实体
前言 本文将介绍基于pytorch的bert_bilstm_crf进行命名实体识别,涵盖多个数据集.命名实体识别指的是从文本中提取出想要的实体,本文使用的标注方式是BIOES,例如,对于文本虞兔良先生 ...
- CPU性能优化干货总结
一.背景 部门成立专项组,对数智平台和站务系统做性能优化,其中目标之一为降低服务端硬件成本,即在32G内存.CPU银牌的配置下,能支撑1万+发客量.要达到此目标,需通过压力测试并配合监控系统,以QPS ...
- 使用VS Code 搭建 platformio 平台
一.需要的资源网站 arduino GitHub:https://github.com/arduino espressif GitHub:https://github.com/espressif pl ...