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

  然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了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. JavaScript DOM 编程艺术(第2版)读书笔记(1)

    JavaScript 简史 JavaScript 是Netscape公司与Sun公司合作开发的.在 JavaScript 1.0发布时,Netscape Navigator主宰着浏览器市场.微软在推出 ...

  2. [转]iOS学习之UINavigationController详解与使用(二)页面切换和segmentedController

    转载地址:http://blog.csdn.net/totogo2010/article/details/7682433 iOS学习之UINavigationController详解与使用(一)添加U ...

  3. HDU 4712:Hamming Distance

    Hamming Distance Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/65535 K (Java/Others) ...

  4. jsp:和属性相关的方法,请求的转发,重定向

    jsp中与属性相关的方法: 方法: void setAttribute(String name, Object o): 设置属性 Object getAttribute(String name):获取 ...

  5. HDU(1853),最小权匹配,KM

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1853 Cyclic Tour Time Limit: 1000/1000 MS (Java/Other ...

  6. HTML5视频标签video

    现阶段,我们要在网页中嵌入视频的最可靠最常用的办法是使用Flash,通过使用<object>和<embed>标签,就可以通过浏览器播放swf,flv等格式视频文件,但是前提是浏 ...

  7. SpringMvc 使用poi导入导出Excel

    Util类 package com.common.util; public class ExportUtil { private XSSFWorkbook wb = null; private XSS ...

  8. MVC 过滤器

  9. linux定时任务crontab

    今天在执行mysql定时任务语句时候问了很多大拿,都建议我不要随便在生产环境下写定时任务这样的语句,有的说会有延时,那样的话就不准了,有的说在.系统时间和本地时间不一致怎么办?后来就建议我用linux ...

  10. VC++打开对话框选择一个文件夹路径 BROWSEINFO结构

    typedef struct _browseinfoW { HWND hwndOwner; PCIDLIST_ABSOLUTE pidlRoot; LPWSTR pszDisplayName; // ...