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 ...
随机推荐
- (jdbc)取得数据库自动生成的主键方法
一些类,在前面的博客中有,就不重复了 public class Test2 { TestDAO t=new TestDAO(); /*前提是数据表的主键是自动增加的, *取得数据库自动生成的主键 * ...
- 过滤DataTable中的空数据
DataTable dt = new DataTable(tableName); for (int i = 0; i < columnsNames.Length; i++) { dt.Colum ...
- [theWord] 一种英文字典的基类设计
theWord --- 一种英文字典的基类设计 使用场景 想写一个应用,来记录自己背单词时候,对每个单词的记忆状况之类的东西.至于为什么做这个,试过了一些背单词软件,并不觉得好用,自己做一个吧. 那么 ...
- 利用JAVA反射机制将JSON数据转换成JAVA对象
net.sf.json.JSONObject为我们提供了toBean方法用来转换为JAVA对象, 功能更为强大, 这里借鉴采用JDK的反射机制, 作为简单的辅助工具使用, 有些数据类型需要进行转 ...
- thinkphp 实现无限极分类
thinkphp实现无限极分类,获得所有的子类 今天学习测试了一上午也没有整出来,一开始一直没有办法把所有的子分类拿出来. 最后找到原因: 每次调用的时候没有在最后return的位置我没有选择retu ...
- 华东交通大学2016年ACM“双基”程序设计竞赛 1004
Problem Description LB是个十分喜欢钻研的人,对什么事都要搞明白.有一天他看到一个公式,((a-b)*c+d*e)/f=k.他想如果给定K的值,一共有多少种不同整数的组合(a,b, ...
- 2016年12月8日 星期四 --出埃及记 Exodus 21:3
2016年12月8日 星期四 --出埃及记 Exodus 21:3 If he comes alone, he is to go free alone; but if he has a wife wh ...
- python学习笔记三 函数(基础篇)
函数 内置函数 常用的内建函数: type() 列出指定对象的类型 help() 能够提供详细的帮助信息 dir() 将对象的所有特性列出 vars() 列出当前模块的所有变量 file, ...
- yum报错
用man clean all man yum,可以看到,clean选项的作用是: Is used to clean up various things which accumulate in th ...
- 关于myeclipse中maven项目转换相关设置
关于myeclipse中maven项目转换相关设置 在myeclipse菜单中,Configure->Convert to Maven Project 这个菜单 如果没有的话,需要做如下设置: ...