[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打广告,但是现在我自己都不太好意思去看那篇文 ...
随机推荐
- workman源代码阅读 - 使用信号处理器实现定时器
<?php /** * SIGALRM信号处理器注册成功后,在什么情况下进程会收到该信号呢? * * 在Linux系统下,每个进程都有惟一的一个定时器,该定时器提供了以秒为单位的定时功能.在定时 ...
- javaweb学习总结(三十八)——事务
一.事务的概念 事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功. 例如:A——B转帐,对应于如下两条sql语句 update from account set mone ...
- Guava学习-缓存
Guava的缓存是本地缓存,所以我觉得在使用场景上适合那种并非是高一致性的场景中,而且他的实现和ConcurrentHashMap很类似.但是毕竟是缓存嘛,肯定有自动清除的功能.外加一些什么清除策略等 ...
- Java中的可变长参数
可变长参数的定义 与一般方法没多大差别,只不过形参多了...(三个点) 方法名(数据类型 ... 变量名){} 小案例: public class ParamDemo { public static ...
- ahjesus在asp.net中还可以通过设置HttpCookie对象的过期时间为DateTime.MinValue来指定此Cookies为跟随浏览器生效
ahjesus在asp.net中还可以通过设置HttpCookie对象的过期时间为DateTime.MinValue来指定此Cookies为跟随浏览器生效
- 【工匠大道】将项目同时托管到Github和Git@OSC
原文地址 摘要: Github是最大的git代码托管平台,GIT@OSC是国内最大的git代码托管平台,支持免费私有库,支持SVN操作,用户众多.很多用户需要同时将代码托管到两个平台,这篇文章的主要 ...
- 15、ASP.NET MVC入门到精通——MVC-路由
本系列目录:ASP.NET MVC4入门到精通系列目录汇总 Routing(路由) – URL url 作为广泛使用的Web用户接口,需要被重视 好的Url应该满足如下条件: URL应为获取某种资源提 ...
- web项目知识整理
一.div居中 1.margin:auto 2.left:50%:margin-left:div宽度的一半 二.一般处理程序操作session 引using System.Web.SessionSta ...
- 【转】js 中导出excel 较长数字串会变为科学计数法
[转]js 中导出excel 较长数字串会变成科学计数法 在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串 ...
- Watir-WebDriver关于交互式等待方法,告别一味sleep时代
有交互就有等待,等待页面加载完毕的时间怎么处理呢? 有人说sleep: sleep N #等待N秒后继续执行 怎么才能告别毫无意义的命令呢? 接下来介绍一下Watir-Webdriver为我们提供等待 ...