[tem]线段树(白书版)
个人感觉有点坑
add用的标记永久化
set用的标记下传
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#define lson o<<1,l,m
#define rson (o<<1)+1,m+1,r
#define ls o<<1
#define rs (o<<1)+1
using namespace std;
const int N=1e4,INF=1e9; int minv[N<<],maxv[N<<],sumv[N<<];
int addv[N<<],setv[N<<];
int ql,qr,p,v; //point
int queryMin(int o,int l,int r){
int m=l+((r-l)>>),ans=INF;
if(ql<=l&&r<=qr) return minv[o];
if(ql<=m) ans=min(ans,queryMin(lson));
if(m+<=qr) ans=min(ans,queryMin(rson));
return ans;
} void change(int o,int l,int r){
int m=l+((r-l)>>);
if(l==r)
minv[o]=v;
else{
if(p<=m) change(lson);
else change(rson);
minv[o]=min(minv[ls],minv[rs]);
}
} //add
int _min,_max,_sum;
void maintain(int o,int l,int r){
sumv[o]=minv[o]=maxv[o]=;//!!
if(l<r){
sumv[o]=sumv[ls]+sumv[rs];
minv[o]=min(minv[ls],minv[rs]);
maxv[o]=max(maxv[ls],maxv[rs]);
}
minv[o]+=addv[o];
maxv[o]+=addv[o];
sumv[o]+=addv[o]*(r-l+);
} void addRange(int o,int l,int r){
if(ql<=l&&r<=qr)
addv[o]+=v;
else{
int m=(r+l)>>;
if(ql<=m) addRange(lson);
if(m+<=qr) addRange(rson);
}
maintain(o,l,r);
} void queryRange(int o,int l,int r,int add){
if(ql<=l&&r<=qr){
_sum+=sumv[o]+add*(r-l+);
_min=min(_min,minv[o]+add);
_max=max(_max,maxv[o]+add);
}else{
int m=(r+l)>>;
if(ql<=m) queryRange(lson,add+addv[o]);
if(m+<=qr) queryRange(rson,add+addv[o]);
}
} //set
void mt(int o,int l,int r){
if(setv[o]>=){
sumv[o]=setv[o]*(r-l+);
minv[o]=maxv[o]=setv[o];
}else if(l<r){
sumv[o]=sumv[ls]+sumv[rs];
minv[o]=min(minv[ls],minv[rs]);
maxv[o]=max(maxv[ls],maxv[rs]);
}
} void pushDown(int o){
if(setv[o]>=){
setv[ls]=setv[rs]=setv[o];
setv[o]=-;
}
} void setRange(int o,int l,int r){
if(ql<=l&&r<=qr) setv[o]=v;
else {
pushDown(o);
int m=(r+l)>>;
if(ql<=m) setRange(lson); else mt(lson);
if(m+<=qr) setRange(rson); else mt(rson);
}
mt(o,l,r);
} void queryRange(int o,int l,int r){
if(setv[o]>=){
_sum+=setv[o]*(r-l+);
_min=min(_min,setv[o]);
_max=max(_max,setv[o]);
}else if(ql<=l&&r<=qr){
_sum+=sumv[o];
_min=min(_min,minv[o]);
_max=max(_max,maxv[o]);
}else{
int m=(r+l)>>;
if(ql<=m) queryRange(lson);
if(m+<=qr) queryRange(rson);
}
} int n,t;
int main(int argc, const char * argv[]) { //freopen("in.txt","r",stdin);
//freopen("2.txt","w",stdout); cin>>n>>t;
for(int i=;i<=n;i++){
cin>>v;
ql=qr=i;
addRange(,,n);
} // for(int i=1;i<=n<<1;i++) printf("%d %d %d %d\n",i,sumv[i],minv[i],maxv[i]); while(t--){
int flag;
cin>>flag;
if(flag==){
cin>>ql>>qr;
_sum=;_min=INF;_max=-INF;
queryRange(,,n,);
printf("%d\n",_sum);
}else{
cin>>ql>>qr>>v;
addRange(,,n);
_sum=;_min=INF;_max=-INF;
queryRange(,,n,);
printf("%d\n",_sum);
}
} return ;
}
[tem]线段树(白书版)的更多相关文章
- [tem]线段树练习
1080 线段树练习 单点修改,区间查询和 #include <iostream> #include <cstdio> #include <algorithm> # ...
- luogu3759 不勤劳的图书管理员 (树状数组套线段树)
交换的话,只有它们中间的书会对答案产生影响 树状数组记位置,套线段树记书的编号 它对应的页数和书的个数 然后就是减掉中间那些原来是逆序对的,再把交换以后是逆序对的加上 别忘了考虑这两个自己交换以后是不 ...
- 线段树 & 题目
首先说下我写的线段树吧. 我是按照线段树[完全版]那个人的写法来写的,因为网上大多数题解都是按照他的写法来写. 确实比较飘逸,所以就借用了. 节点大小是maxn是4倍,准确来说是大于maxn的2^x次 ...
- 《白书》上线段树RMQ的实现
白书上的线段树RMQ实现,自己重写了一遍: #include <bits/stdc++.h> using namespace std; const int MAXN=1<<17 ...
- poj2991 Crane(线段树+集合)白书例题
题目大意:起重机有n节,题目给出要调节的k节,每节调节成x度,求最后底部的起重机的坐标(最顶上的起点为(0,0)). 分析:一开始我看白书,看不懂他那个向量旋转的坐标是怎么来的,翻了很多博客,才发现, ...
- [XJOI NOI2015模拟题13] C 白黑树 【线段树合并】
题目链接:XJOI - NOI2015-13 - C 题目分析 使用神奇的线段树合并在 O(nlogn) 的时间复杂度内解决这道题目. 对树上的每个点都建立一棵线段树,key是时间(即第几次操作),动 ...
- [转载]完全版线段树 by notonlysuccess大牛
原文出处:http://www.notonlysuccess.com/ (好像现在这个博客已经挂掉了,在网上找到的全部都是转载) 今天在清北学堂听课,听到了一些很令人吃惊的消息.至于这消息具体是啥,等 ...
- 【转】线段树完全版~by NotOnlySuccess
线段树完全版 ~by NotOnlySuccess 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文章了,觉 ...
- 《完全版线段树》——notonlysuccess
转载自:NotOnlySuccess的博客 [完全版]线段树 很早前写的那篇线段树专辑至今一直是本博客阅读点击量最大的一片文章,当时觉得挺自豪的,还去pku打广告,但是现在我自己都不太好意思去看那篇文 ...
随机推荐
- java.net.SocketException: Software caused connection abort: socket write error
用Java客户端程序访问Java Web服务器时出错: java.net.SocketException: Software caused connection abort: socket write ...
- os模块汇总
os.name 输出字符串指示正在使用的平台.如果是window 则用'nt'表示,对于Linux/Unix用户,它是'posix'. os.getcwd() 函数得到当前Python脚本工作的目录路 ...
- android.view.InflateException: Binary XML file line #34: Error inflating class
问题一般出在xml的第三方View的全类名,你可能是直接粘贴过来的,没有改成自己项目的全类名.
- Tomcat启动报错整理
1.启动报 Connector attribute SSLCertificateFile must be defined when using SSL with APR conf\server.xml ...
- java web学习总结(十八) -------------------过滤器的高级使用
在filter中可以得到代表用户请求和响应的request.response对象,因此在编程中可以使用Decorator(装饰器)模式对request.response对象进行包装,再把包装对象传给目 ...
- Linux(Centos)之安装tomcat并且部署Java Web项目
1.准备工作 a.下载tomcat linux的包,地址:http://tomcat.apache.org/download-80.cgi,我们下载的版本是8.0,下载方式如图: b ...
- 使用 jQuery & CSS3 制作美丽的照片画廊
在本教程中,我们将创建一个很好看的照片画廊效果.我们的想法是,以显示专辑作为一个滑块,而当这张专辑被选中,我们将使用一个美丽的照片堆栈展示专辑的图像.在照片堆栈视图,我们可以通过将最上面的图像移动到所 ...
- 彻底解决mysql中文乱码的办法 ???
MySQL会出现中文乱码的原因不外乎下列几点:1.server本身设定问题,例如还停留在latin12.table的语系设定问题(包含character与collation)3.客户端程式(例如p ...
- 使用原生JS封装一个ajax
function ajax(data){ //第一步,创建XHR对象 var xhr = null; if(window.XMLHttpRequest){ xhr = new XMLHttpReque ...
- 更改Visual Studio 2015 默认的语言设置
Vs支持多种语言,但有可能创建项目时,默认的开发语言不是你需要的,比如:默认是Visual C++ 你可以通过"工具"----选项----导入和导出设置来修改. 引用: https ...