POJ 3468 线段树裸题
这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解。
然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了ACdreamer的模板,在此基础上自己用宏定义来精简了一下代码:
#include<cstdio>
typedef long long LL;
#define root int rt, int l, int r
#define lson rt*2, l, mid
#define rson rt*2+1, mid+1, r
#define makemid int mid= (l+r)>>1
int a,b;
LL c; struct tree {
LL add,sum;
} s[]; void build(root) {
s[rt].add= ;
if(l==r){
scanf("%lld",&s[rt].sum);
return ;
}
makemid ;
build(lson);
build(rson);
s[rt].sum= s[rt*].sum+s[rt*+].sum;
} inline void pushdown(int rt, int len) {
int ls= rt*, rs= ls+;
const LL &c= s[rt].add;
s[ls].add += c;
s[rs].add += c;
s[ls].sum += c*(len-len/);
s[rs].sum += c*(len/);
s[rt].add= ;
} void update(root) {
if(a<=l && r<=b){
s[rt].add+= c;
s[rt].sum+= c*(r-l+);
return ;
}
if(s[rt].add) pushdown(rt,r-l+);
makemid ;
if(a<=mid) update(lson);
if(b>mid) update(rson);
s[rt].sum= s[rt*].sum+s[rt*+].sum;
} LL query(root) {
if(a<=l && r<=b) return s[rt].sum;
if(s[rt].add) pushdown(rt,r-l+);
makemid ;
LL res= ;
if(a<=mid) res+= query(lson);
if(b>mid) res+= query(rson);
return res;
} int main(){
int n,q;
while(~scanf("%d%d",&n,&q)){
build(,,n);
while(q--){
getchar();
if(getchar()=='Q'){
scanf("%d%d",&a,&b);
printf("%lld\n",query(,,n));
}
else {
scanf("%d%d%lld",&a,&b,&c);
update(,,n);
}
}
}
return ;
}
原样的代码是:
#include<cstdio>
typedef long long LL;
LL c;
int a,b; struct tree{
LL add,sum;
} s[]; void build(int rt, int l, int r){
s[rt].add= ;
if(l==r){
scanf("%lld",&s[rt].sum);
return ;
}
int mid= (l+r)>>;
build(rt*,l,mid);
build(rt*+,mid+,r);
s[rt].sum= s[rt*].sum+s[rt*+].sum;
} inline void pushdown(int rt, int len){
if(s[rt].add){
int ls= rt*, rs= ls+;
s[ls].add += s[rt].add;
s[rs].add += s[rt].add;
s[ls].sum += s[rt].add*(len-len/);
s[rs].sum += s[rt].add*(len/);
s[rt].add= ;
}
} void update(int rt, int l, int r){
if(a<=l && r<=b){
s[rt].add+= c;
s[rt].sum+= c*(r-l+);
return ;
}
pushdown(rt,r-l+);
int mid= (l+r)>>;
if(a<=mid) update(rt*,l,mid);
if(b>mid) update(rt*+,mid+,r);
s[rt].sum= s[rt*].sum+s[rt*+].sum;
} LL query(int rt, int l, int r){
if(a<=l && r<=b) return s[rt].sum;
pushdown(rt,r-l+);
int mid= (l+r)>>;
LL res= ;
if(a<=mid) res+= query(rt*,l,mid);
if(b>mid) res+= query(rt*+,mid+,r);
return res;
} int main(){
int n,q;
while(~scanf("%d%d",&n,&q)){
build(,,n);
while(q--){
getchar();
if(getchar()=='Q'){
scanf("%d%d",&a,&b);
printf("%lld\n",query(,,n));
}
else {
scanf("%d%d%lld",&a,&b,&c);
update(,,n);
}
}
}
return ;
}
线段树,不断进取中~~
POJ 3468 线段树裸题的更多相关文章
- poj 3468 线段树模板题
#include<iostream> #include<algorithm> #include<stdio.h> using namespace std; #def ...
- poj 3468(线段树)
http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...
- hdu 1698+poj 3468 (线段树 区间更新)
http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...
- BZOJ1067&P2471 [SCOI2007]降雨量[线段树裸题+细节注意]
dlntqlwsl 很裸的一道线段树题,被硬生生刷成了紫题..可能因为细节问题吧,我也栽了一次WA50分.不过这个隐藏条件真的对本菜鸡来说不易发现啊. 未知的年份连续的就看成一个就好了,把年份都离散化 ...
- CPU监控 线段树裸题
LINK:bzoj3064 此题甚好码了20min停下来思考的时候才发现不对的地方有点坑... 还真不好写来着 可这的确是线段树的裸题...我觉得我写应该没有什么大问题 不过思路非常的紊乱 如果是自己 ...
- POJ 3468 (线段树 区间增减) A Simple Problem with Integers
这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...
- POJ - 3264 线段树模板题 询问区间最大最小值
这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...
- 【LOJ6029】「雅礼集训 2017 Day1」市场(线段树裸题)
点此看题面 大致题意: 维护序列,支持区间加法,区间除法(向下取整),区间求\(min\)和区间求和. 线段树维护区间除法 区间加法.区间求\(min\)和区间求和都是线段树基本操作,因此略过不提. ...
- POJ 3468 线段树 成段更新 懒惰标记
A Simple Problem with Integers Time Limit:5000MS Memory Limit:131072K Case Time Limit:2000MS Descr ...
随机推荐
- android FragmentPagerAdapter getItem方法没有执行
转自 http://blog.csdn.net/getchance/article/details/40263505 在一个 Android 应用中,我使用 FragmentPagerAdapter ...
- JSTL.带标签体的标签,方法和例子
1. 实现 forEach 标签: 两个属性: items(集合类型, Collection), var(String 类型) doTag: 遍历 items 对应的集合 把正在遍历的对象放入到 pa ...
- 为Apache配置虚拟机Virtual Host
配置虚拟机最少需要修改两个文件,即httpd-vhosts.conf 和 hosts (记住修改任何配置前先备份哦,这才是个好习惯) 第一步,修改httpd-vhosts.conf文件, 文件路径 \ ...
- fzu 2171 防守阵地 II
Problem 2171 防守阵地 II Accept: 31 Submit: 112Time Limit: 3000 mSec Memory Limit : 32768 KB Prob ...
- offsetHeight 正则表达式验证格式
获取Div 的height width等属性 <%@ Page Language="C#" AutoEventWireup="true" CodeFile ...
- .Net操作.exe文件
Process proc = new Process(); proc.StartInfo.FileName = @"D:\Program Files\Foxmail\Foxmail.exe& ...
- FZU 2146
Easy Game Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Submit St ...
- MSChart BarChart
不让合并0-5 chart1.ChartAreas[].AxisX.LabelStyle.Interval = ; 效果
- 专题:php页面跳转方法
php只有一种方法,利用JavaScript的window.location[和window.location.href效果相同]是一种方法,利用html的meta的Refresh是一种方法. 代码 ...
- linux unzip命令
zip文件是一种常用的压缩文件格式,WinZip.WinRar等压缩软件都支持zip文件格式,就连java的jar包也是zip格式的,Firefox插件xpi文件也是zip格式的.Linux在zi ...