这些天一直在看线段树,因为临近期末,所以看得断断续续,弄得有些知识点没能理解得很透切,但我也知道不能钻牛角尖,所以配合着刷题来加深理解。

  然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了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 线段树裸题的更多相关文章

  1. poj 3468 线段树模板题

    #include<iostream> #include<algorithm> #include<stdio.h> using namespace std; #def ...

  2. poj 3468(线段树)

    http://poj.org/problem?id=3468 题意:给n个数字,从A1 …………An m次命令,Q是查询,查询a到b的区间和,c是更新,从a到b每个值都增加x.思路:这是一个很明显的线 ...

  3. hdu 1698+poj 3468 (线段树 区间更新)

    http://acm.hdu.edu.cn/showproblem.php?pid=1698 这个题意翻译起来有点猥琐啊,还是和谐一点吧 和涂颜色差不多,区间初始都为1,然后操作都是将x到y改为z,注 ...

  4. BZOJ1067&P2471 [SCOI2007]降雨量[线段树裸题+细节注意]

    dlntqlwsl 很裸的一道线段树题,被硬生生刷成了紫题..可能因为细节问题吧,我也栽了一次WA50分.不过这个隐藏条件真的对本菜鸡来说不易发现啊. 未知的年份连续的就看成一个就好了,把年份都离散化 ...

  5. CPU监控 线段树裸题

    LINK:bzoj3064 此题甚好码了20min停下来思考的时候才发现不对的地方有点坑... 还真不好写来着 可这的确是线段树的裸题...我觉得我写应该没有什么大问题 不过思路非常的紊乱 如果是自己 ...

  6. POJ 3468 (线段树 区间增减) A Simple Problem with Integers

    这题WA了好久,一直以为是lld和I64d的问题,后来发现是自己的pushdown函数写错了,说到底还是因为自己对线段树理解得不好. 因为是懒惰标记,所以只有在区间分开的时候才会将标记往下传递.更新和 ...

  7. POJ - 3264 线段树模板题 询问区间最大最小值

    这是线段树的一个模板题,给出一串数字,然后询问区间的最大最小值. 这个其实很好办,只需把线段树的节点给出两个权值,一个是区间的最小值,一个是区间的最大值,初始化为负无穷和正无穷,然后通过不断地输入节点 ...

  8. 【LOJ6029】「雅礼集训 2017 Day1」市场(线段树裸题)

    点此看题面 大致题意: 维护序列,支持区间加法,区间除法(向下取整),区间求\(min\)和区间求和. 线段树维护区间除法 区间加法.区间求\(min\)和区间求和都是线段树基本操作,因此略过不提. ...

  9. POJ 3468 线段树 成段更新 懒惰标记

    A Simple Problem with Integers Time Limit:5000MS   Memory Limit:131072K Case Time Limit:2000MS Descr ...

随机推荐

  1. hdu 1061 Rightmost Digit

    解决本题使用数学中的快速幂取余: 该方法总结挺好的:具体参考http://www.cnblogs.com/PegasusWang/archive/2013/03/13/2958150.html #in ...

  2. c#读取Excel的列名问题

    在修改c#读取Excel的时候,遇到了一些小问题,总结下,希望别人不用再浪费时间 读取excel的时候,如果是空行就不读取? SELECT * FROM [DB_ESTATE$] where F2&l ...

  3. C/C++ 调用qsort/sort 对字符数组排序的cmp函数写法

    这个问题屡次碰到解决之后再次遇到又忘记怎么弄了,这次打算彻底搞清楚. ·C 首先对所谓字符数组的排序应该是对(char)*a[]数组而非(char)a[][]进行的排序,后者是无法直接调用qsort实 ...

  4. Train Problem I 分类: HDU 2015-06-26 11:27 10人阅读 评论(0) 收藏

    Train Problem I Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  5. javascript学习(一) 异常处理与简单的事件

    一:异常处理 <html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></ti ...

  6. Scrapy学习教程

    http://scrapy-chs.readthedocs.io/zh_CN/0.24/intro/tutorial.html 在线学习教程: http://learnpythonthehardway ...

  7. Linux/Unix里,ln -s

    这是硬/软链接的命令ln -s 是创建软链接ln 是创建硬链接 你可以理解为:相当于windows下创建快捷方式一样,所以就不用太多解释了吧. ln -s /usr/lib/libX11.3 libX ...

  8. STM32/GD32上内存堆栈溢出探测研究

    无数次遭受堆栈溢出折磨,随着系统变得复杂,故障点越来越难以查找!主要溢出情况如下:1,一般RAM最后两块空间是堆Heap和栈Stack,堆从下往上用,栈从上往下用,任意一个用完,都会进入对方的空间2, ...

  9. uva 10673 Play with Floor and Ceil

    Problem APlay with Floor and CeilInput: standard inputOutput: standard outputTime Limit: 1 second Th ...

  10. Linux 系统裁剪

     一.前言 Linux操作系统至1991.10.5号诞生以来,就源其开源性和自由性得到了很多技术大牛的青睐,每个Linux爱好者都为其贡献了自己的一份力,不管是在Linux内核还是开源软件等方面,都为 ...