分块试水--CODEVS4927 线段树练习5
模板
1 #include<stdio.h> 2 #include<algorithm> 3 #include<string.h> 4 #include<stdlib.h> 5 #include<math.h> 6 //#include<bitset> 7 //#include<iostream> 8 using namespace std; 9 10 int n,m,q; 11 #define maxn 100011 12 #define maxm 361 13 #define LL long long 14 const LL inf=1e18; 15 LL a[maxn],add[maxm],be[maxm],sum[maxm],Max[maxm],Min[maxm]; bool hasbe[maxm]; 16 int bel[maxn],tot; 17 18 void down(int x) 19 { 20 int l=(x-1)*m+1,r=min(x*m,n); 21 for (int i=l;i<=r;i++) 22 { 23 if (add[x]) a[i]+=add[x]; 24 else if (hasbe[x]) a[i]=be[x]; 25 } 26 add[x]=hasbe[x]=0; 27 } 28 void up(int x) 29 { 30 int l=(x-1)*m+1,r=min(x*m,n); 31 sum[x]=0; Max[x]=-inf; Min[x]=inf; 32 for (int i=l;i<=r;i++) 33 sum[x]+=a[i],Max[x]=max(Max[x],a[i]),Min[x]=min(Min[x],a[i]); 34 } 35 void Addsingle(int x,int y,int v) 36 { 37 down(bel[x]); 38 for (int i=x;i<=y;i++) a[i]+=v; 39 up(bel[x]); 40 } 41 void Add(int x,int y,int v) 42 { 43 if (bel[x]==bel[y]) Addsingle(x,y,v); 44 else 45 { 46 int j; 47 for (j=x;bel[j]==bel[x];j++); 48 Addsingle(x,j-1,v); 49 for (j=y;bel[j]==bel[y];j--); 50 Addsingle(j+1,y,v); 51 for (int i=bel[x]+1;i<bel[y];i++) 52 { 53 if (hasbe[i]) be[i]+=v; 54 else add[i]+=v; 55 sum[i]+=1ll*m*v; 56 Max[i]+=v; Min[i]+=v; 57 } 58 } 59 } 60 void Besingle(int x,int y,int v) 61 { 62 down(bel[x]); 63 for (int i=x;i<=y;i++) a[i]=v; 64 up(bel[x]); 65 } 66 void Be(int x,int y,int v) 67 { 68 if (bel[x]==bel[y]) Besingle(x,y,v); 69 else 70 { 71 int j; 72 for (j=x;bel[j]==bel[x];j++); 73 Besingle(x,j-1,v); 74 for (j=y;bel[j]==bel[y];j--); 75 Besingle(j+1,y,v); 76 for (int i=bel[x]+1;i<bel[y];i++) 77 { 78 if (add[i]) add[i]=0; 79 hasbe[i]=1; be[i]=v; 80 sum[i]=1ll*m*v; 81 Max[i]=Min[i]=v; 82 } 83 } 84 } 85 LL qsumsingle(int x,int y) 86 { 87 LL ans=0; 88 for (int i=x;i<=y;i++) 89 { 90 if (hasbe[bel[i]]) ans+=be[bel[i]]; 91 else ans+=a[i]+add[bel[i]]; 92 } 93 return ans; 94 } 95 LL qsum(int x,int y) 96 { 97 if (bel[x]==bel[y]) return qsumsingle(x,y); 98 else 99 { 100 int j; 101 for (j=x;bel[j]==bel[x];j++); 102 LL ans=qsumsingle(x,j-1); 103 for (j=y;bel[j]==bel[y];j--); 104 ans+=qsumsingle(j+1,y); 105 for (int i=bel[x]+1;i<bel[y];i++) ans+=sum[i]; 106 return ans; 107 } 108 } 109 LL qmaxsingle(int x,int y) 110 { 111 LL ans=-inf; 112 for (int i=x;i<=y;i++) 113 { 114 if (hasbe[bel[i]]) ans=max(ans,be[bel[i]]); 115 else ans=max(ans,a[i]+add[bel[i]]); 116 } 117 return ans; 118 } 119 LL qmax(int x,int y) 120 { 121 if (bel[x]==bel[y]) return qmaxsingle(x,y); 122 else 123 { 124 int j; 125 for (j=x;bel[j]==bel[x];j++); 126 LL ans=qmaxsingle(x,j-1); 127 for (j=y;bel[j]==bel[y];j--); 128 ans=max(ans,qmaxsingle(j+1,y)); 129 for (int i=bel[x]+1;i<bel[y];i++) ans=max(ans,Max[i]); 130 return ans; 131 } 132 } 133 LL qminsingle(int x,int y) 134 { 135 LL ans=inf; 136 for (int i=x;i<=y;i++) 137 { 138 if (hasbe[bel[i]]) ans=min(ans,be[bel[i]]); 139 else ans=min(ans,a[i]+add[bel[i]]); 140 } 141 return ans; 142 } 143 LL qmin(int x,int y) 144 { 145 if (bel[x]==bel[y]) return qminsingle(x,y); 146 else 147 { 148 int j; 149 for (j=x;bel[j]==bel[x];j++); 150 LL ans=qminsingle(x,j-1); 151 for (j=y;bel[j]==bel[y];j--); 152 ans=min(ans,qminsingle(j+1,y)); 153 for (int i=bel[x]+1;i<bel[y];i++) ans=min(ans,Min[i]); 154 return ans; 155 } 156 } 157 int main() 158 { 159 scanf("%d%d",&n,&q); 160 m=(int)sqrt(n); 161 for (int i=1;i<=n;i++) bel[i]=(i-1)/m+1; 162 tot=bel[n]; 163 for (int i=1;i<=tot;i++) Max[i]=-inf,Min[i]=inf; 164 for (int i=1;i<=n;i++) 165 { 166 scanf("%lld",&a[i]); 167 sum[bel[i]]+=a[i]; 168 Max[bel[i]]=max(Max[bel[i]],a[i]); 169 Min[bel[i]]=min(Min[bel[i]],a[i]); 170 } 171 172 char c[10];int x,y,z; 173 while (q--) 174 { 175 scanf("%s%d%d",c,&x,&y); 176 if (c[0]=='a') scanf("%d",&z),Add(x,y,z); 177 else if (c[1]=='e') scanf("%d",&z),Be(x,y,z); 178 else if (c[1]=='u') printf("%lld\n",qsum(x,y)); 179 else if (c[1]=='a') printf("%lld\n",qmax(x,y)); 180 else printf("%lld\n",qmin(x,y)); 181 } 182 return 0; 183 }
View Code
转载于:https://www.cnblogs.com/Blue233333/p/8034325.html
分块试水--CODEVS4927 线段树练习5相关推荐
- 分块试水--CODEVS5037 线段树练习4加强版
感觉这才算入门题吧..前面那些线段树练习,改几个字符就过了一定要搞成几道题.. n<=2e5的数列,给常数K<=2e5,m<=2e5个操作,区间加,问一个区间里K的倍数. 这题空间? ...
- 51NOD 1287 加农炮(不水的线段树)
>>点击进入原题测试<< Input示例 9 11 1 2 0 4 3 2 1 5 7 2 8 0 7 6 5 3 4 5 6 5 Output示例 2 2 2 4 3 3 5 ...
- NEFU 1266 快乐的雨季 (线段树)
题意: 中文 思路: 线段树基础题当然亦可以分块做 代码: 线段树: #include <bits/stdc++.h> using namespace std; #define ls l, ...
- 【线段树】2019雅礼集训 sequence
题目: 给出k,和一个长度为n的序列A 有q次询问, 每次询问Al,Al+1,Al+2--,ArA_l,A_{l+1},A_{l+2}--,A_{r}Al,Al+1,Al+2--,Ar中,有多 ...
- 1355 巧克力 (线段树点+区间)
继续最水的线段树 简单粗暴 #include<cstdio> #include<cstring> #include<algorithm> #define lc p ...
- 2019长沙学院新生赛(A水,B水,C(整除分块),D水,E(巧数学),F(二分+bfs),H(换根dp),I(线段树)J(dp+倍增+lca))
A-XOR SUM 通过简单观察得知连续四个数的异或值就是等于0,暴力找出左区间和右区间就可以了,最多跑四个单位 0^1^2^3==0 4^5^6^7=0 #include<bits/std ...
- LibreOJ 6277,6278,6280 数列分块入门1,2,4 树状数组,分块,线段树等.
分块1 分块2 分块4 模板一共有九个.我试着在三天内做了3个. 应该不用超链接吧. 分块1 区间加,单点询问. 这不是裸的改版树状数组吗?用树状数组处理前缀和水过. #include<bits ...
- 【YBT2023寒假Day4 C】樱桃莓莓(交互)(四毛子分块)(线段树)
樱桃莓莓 题目链接:YBT2023寒假Day4 C 题目大意 有一个黑盒操作满足交换律和结合律,有 n 个数,q 次询问,每次选 m 个下标,你要计算所有不包含那 m 个下标的数进行黑盒操作之后的结果 ...
- 【bzoj3524】【Poi2014】【Couriers】可持久化线段树(主席树)水题
[pixiv] https://www.pixiv.net/member_illust.php?mode=medium&illust_id=62485671 向大(hei)佬(e)势力学(di ...
最新文章
- 架构师之路 — 数据库设计 — 关系型数据库的外键约束与关联
- vuex实践之路——笔记本应用(三)
- 现在c++都转go了
- Spring AOP用法
- 利用Octave解线性方程组
- opensplice dds v6.3.2_给你看个宝贝,近乎完美的DDS正弦波信号音生成器
- UE4 调试着色器编译过程
- 数据结构树的基本操作_数据结构二叉树的基本操作~~~~
- php 模板 自定义函数调用,thinkphp模板中使用自定义函数
- Java完全参考手册_Java完全参考手册(第8版) ((美)Herbert Schildt) pdf扫描版
- html5兼容QQ浏览器,【QQ浏览器5.1】发布 HTML5兼容性测试
- PS2有线手柄的SPI协议
- ElementUI Cascader 级联选择器实现点击文本选中
- windows c语言编程环境,windows7中c语言编程环境的搭建
- node.js版本不同,跑不起项目(个人笔记)
- 启动mongo数据库
- 2021-11-09小程序的开发制作的价格是多少?
- 整流二极管的作用是什么?
- MACD策略引入backtrader出错
- / Vijos FBI树 递归
热门文章
- 初中学历在辽宁学计算机,在辽宁省实验中学学习是怎样一番体验?
- oracle最快访问行,Oracle技术网—在Oracle快速进行数据行存在性检查
- android 获取monkey日志_安卓app测试之Monkey日志分析
- openglshader实现虚拟场景_虚拟演播室设计原则
- 算法训练 数的划分 动态规划
- apache license 2.0如何使用防止法律纠纷_Thinkphp + queue 使用队列进行 邮件通知
- Java 解析URL
- C/C++ 文件的后缀名
- cmd中Redis的启动
- MATLAB教程(1) MATLAB 基础知识(3)