洛谷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 一个表示加的 一个表示乘的 需要先计算乘法 再计算加法 来自你谷 ...
随机推荐
- 手动从0搭建ABP框架-ABP官方完整解决方案和手动搭建简化解决方案实践
本文主要讲解了如何把ABP官方的在线生成解决方案运行起来,并说明了解决方案中项目间的依赖关系.然后手动实践了如何从0搭建了一个简化的解决方案.ABP官方的在线生成解决方案源码下载参考[3],手动搭 ...
- 整数分解和for循环
整数的分解: 一个整数是由多位数字组成的,那么如何能分解出整数的各个位上的数字呢 对一个整数做%10的操作,就可以得到它的个位数 对一个整数做/10的操作,就去掉了他的个位数 然后再对2的结果做%10 ...
- vue脚手架创建项目后使用路由报错Object(...) is not a function问题
在这之前我做过的vue项目没有这种问题,今天突然出现这个问题,也检查了很久的代码,最后解决我也不知道我是哪一步做错了 首先我是创建的vue2项目,基本操作跟平常一样,在运用路由跳转的时候遇到这个问题 ...
- 构建数据湖上低延迟数据 Pipeline 的实践
T 摘要 · 云原生与数据湖是当今大数据领域最热的 2 个话题,本文着重从为什么传统数仓 无法满足业务需求? 为何需要建设数据湖?数据湖整体技术架构.Apache Hudi 存储模式与视图.如何解决冷 ...
- ZOJ 3537 (凸包 + 区间DP)(UNFINISHED)
#include "Head.cpp" const int N = 10007; int n, m; struct Point{ int x,y; bool operator &l ...
- Taurus.MVC 微服务框架 入门开发教程:项目集成:2、客户端:ASP.NET Core(C#)项目集成:应用中心。
系列目录: 本系列分为项目集成.项目部署.架构演进三个方向,后续会根据情况调整文章目录. 本系列第一篇:Taurus.MVC V3.0.3 微服务开源框架发布:让.NET 架构在大并发的演进过程更简单 ...
- 定语从句"介词+which/whom"的用法
介词+which [例句]My elder sister works in the famous university. She graduated from the famous universit ...
- postgresql使用group by进行数据去重-2022新项目
一.业务场景 数据去重是web开发中经常会遇到的方式之一,数据库操作中有一个关键字distinct主要就是用来做这件事,用来进行去重. 比如进行统计查询的时候,可以这样写 select count(d ...
- .NET 纯原生实现 Cron 定时任务执行,未依赖第三方组件
常用的定时任务组件有 Quartz.Net 和 Hangfire 两种,这两种是使用人数比较多的定时任务组件,个人以前也是使用的 Hangfire ,慢慢的发现自己想要的其实只是一个能够根据 Cron ...
- 「2020-2021 集训队作业」Yet Another Linear Algebra Problem(行列式,Binet-Cauchy 公式)
题面 出题人:T L Y \tt TLY TLY 太阳神:Tiw_Air_OAO 「 2020 - 2021 集 训 队 作 业 」 Y e t A n o t h e r L i n e a r A ...