[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打广告,但是现在我自己都不太好意思去看那篇文 ...
随机推荐
- PHP中return 和 exit 、break和contiue 区别与用法
先说一下exit函数的用法. 作用: 输出一则消息并且终止当前脚本. 如果一段文本中包括多个以 结束的脚本,则exit退出当前所在脚本. 比如一篇php文本包括一下代码,则输出为world. < ...
- adb命令
一下是记录一些日常经常用的adb command, adb root: adb shell -> su -> return -> adb root(首先让安卓设备获得root权限,然 ...
- java web学习总结(二) -------------------TOMCAT使用帮助(一)
一.Tomcat服务器端口的配置 Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件. 如果想修改Tomcat服务器的启动端口,则可以在server.xml ...
- logstash VS splunk
web 系统是典型的分布式部署,由此对其运行状况,硬件运转情况监控也显得尤为重要,这些监控数据表面上对业务运行没有多大的用处(属于基础数据),但正是这些基础数据形成了业务“流”.比如,用户搜索爱好,浏 ...
- JS 预解释相关理解
1.JS中的内存空间分为两种:栈内存.堆内存 栈内存:提供JS代码执行的环境;存储基本数据类型的值; ->全局作用域或者私有的作用域其实都是栈内存 堆内存:存储引用数据类型的值(对象是把属性名和 ...
- 超简洁的CSS下拉菜单
效果体验:http://hovertree.com/texiao/css/3.htm HTML文件代码: <!DOCTYPE html> <html xmlns="http ...
- javascript实现下雪效果
原理: 1.js动态创建DIV,指定CLASS类设置不同的背景图样式显示不同的雪花效果. 2.js获取创建的DIV并改变其top属性值,当下落的高度大于屏幕高后删除该移动div 3.好像不够完善勿喷 ...
- iOS UITableView的使用 (选自oschina)
1.新手篇创建tableView http://my.oschina.net/joanfen/blog/203041 2.进阶篇列表中行的操作 http://my.oschina.net/jo ...
- How to Operate SharePoint User Alerts with PowerShell
When you migrate list or site, the user alerts in the site will not be migrated together with the co ...
- Android横屏下Fragment界面重叠问题
前言: 项目是基于平板开发的,设计的界面是要求横屏展示界面.所以我将所有的Activity都强制设置为横屏 android:screenOrientation="landscape" ...