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

  然后,这是线段树裸题,而且是最简单的区间增加与查询,我参考了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. Coco2dx 3D例子

    1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18     // add "HelloWorld" splash screen"   ...

  2. 单利 复利计算器程序1.0 2.0 3.0 [ 合 ] 之 C语言

    本程序用C语言编写~~~ 1.计算:本金为100万,利率或者投资回报率为3%,投资年限为30年,那么,30年后所获得的利息收入:按复利计算公式来计算就是:1,000,000×(1+3%)^30 1 v ...

  3. Python基本概念及零碎知识点

    1.python面向对象 类和对象是面向对象编程的两个主要方面.类创建一个新类型,而对象这个类的实例:这类似于你有一个int类型的变量,这存储整数的变量是int类的实例(对象)把握一点:在python ...

  4. Humble Numbers

    Humble Numbers Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9988 Accepted: 4665 Descri ...

  5. 【20160924】GOCVHelper 图像增强部分(5)

    // Multiply 正片叠底 void Multiply(Mat& src1, Mat& src2, Mat& dst) {     for(int index_row=0 ...

  6. JAVAWeb使用POI做导出Excel

    一.需要了解的API ①HSSFWorkBook //代表一个Excel文件 ②HSSFSheet //代表一个表 ③HSSFRow //代表一个表中的某一行 ④HSSFCell //代表一个表中的某 ...

  7. 正确修改MySQL最大连接数的三种好用方案

    以下的文章主要介绍的是正确修改MySQL最大连接数的三种好用方案,我们大家都知道MySQL数据库在安装完之后,默认的MySQL数据库,其最大连接数为100,一般流量稍微大一点的论坛或网站这个连接数是远 ...

  8. 【Java】Java创建String时,什么情况放进String Pool?

    对Java创建String是否放入String pool作代码性的试验. 参考的优秀文章 JAVA面试题解惑系列(二)——到底创建了几个String对象? public String(String o ...

  9. SVN Unable to connect to a repository at URL问题解决

    图1 之前用的好好的,不知道为什么今天就不行了,根据网上给的方法TortoiseSVN -> Settings -> Saved Data,点击个个"Clear"按钮, ...

  10. Response.Cookies 和 Request.Cookies

    Response.Cookies 和 Request.Cookies     原文地址: http://www.cnblogs.com/forcertain/archive/2012/12/04/28 ...