[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打广告,但是现在我自己都不太好意思去看那篇文 ...
随机推荐
- 关于C#操作防火墙,阻止程序联网
//开启服务.开启防火墙 public void OpenFileWall() { // 1. 判断当前系统为XP或Win7 RegistryKey rk = Registry.LocalMachin ...
- luogg_java学习_06_面向对象特性之封装和继承
这篇博客总结了1天,希望自己以后返回来看的时候理解更深刻,也希望可以起到帮助初学者的作用. 转载请注明 出自 : luogg的博客园 , 因为前不久偶然发现某网站直接复制粘贴我的博客,交谈之后他们修改 ...
- [函数] Delphi FMX Windows 取得下载 Downloads 目录
在 Firemonkey 提供了一个跨平台的函数 TPath.GetDownloadsPath 来取得该平台的下载目录,但是非常奇怪的是,在 Windows 平台下,取得的下载目录确是: C:\Use ...
- 基于小脚丫DDS 调频 调幅 调相 切换波形 AD5601输出模拟波形
先讲讲里面的矩阵键盘,矩阵键盘列有下拉电阻,默认全为0000,默认行输入为1111,当有按键按下的时候,列输入会被拉高,这时控制行的输出做行扫描,电子琴用key_flag_r0电平作为使能,这里用ke ...
- [连载]《C#通讯(串口和网络)框架的设计与实现》-4.设备驱动管理器的设计
目 录 第四章 设备驱动管理器的设计... 2 4.1 接口定义... 2 4.2 设备容器... 7 4.3 ...
- 【工业串口和网络软件通讯平台(SuperIO)教程】三.二次开发流程
1.1 二次开发流程图 1.2 引用相关组件 找到“开发包”,引用里边的相关组件.如下图: 1.3 开发设备驱动模块 1.3.1 开发发送协议驱动 继承SuperIO.Devi ...
- WCF自寄宿
WCF很早就出现了,然而我感受到能够让新手重点去学习WCF而不是WebService是最近两年.我相信大部分人初步了解WCF的时候会很痛苦,尤其是生成代理类,以及配置的问题.我本人其实比较讨厌配置编程 ...
- javascript中concat方法深入理解
最近在恶补js知识的时候,总是会因为js强大的语法而感到震撼.因为以前对前端方面的疏忽,导致了一些理解的错误.因此痛改前非,下定决心,不管做什么事情,都要有专研的精神. 在介绍前,抛出一个问题:如何将 ...
- 更改Visual Studio 2015 默认的语言设置
Vs支持多种语言,但有可能创建项目时,默认的开发语言不是你需要的,比如:默认是Visual C++ 你可以通过"工具"----选项----导入和导出设置来修改. 引用: https ...
- TouchDevelop [Mobile App]
TouchDevelop是一个全新的Windows Phone软件开发环境,是第一个可以使用手机编程的应用. 所用语言看上去有点像BASIC,也有Scratch和AppInventor那样的色块拖拽环 ...