// 对于延迟更新,我们在updata 和query的时候 pushdown和pushup两个东西都要存在 

#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
typedef long long ll;
struct node
{
ll l,r,sum,add;
} tree[*];
ll a[];
//ll x,y;
void pushup(int id)
{
tree[id].sum=tree[id*].sum+tree[id*+].sum;
}
void build(ll l,ll r,int id)
{
if(l==r)
{
tree[id].sum=a[l];
return;
}
tree[id].l=l;
tree[id].r=r;
tree[id].add=;
ll mid=(l+r)/;
build(l,mid,id*);
build(mid+,r,id*+);
pushup(id);
}
void pushdown(int id)
{
if(tree[id].add)
{
tree[id*].add +=tree[id].add;
tree[id*+].add += tree[id].add; tree[id*].sum += (tree[id*].r-tree[id*].l+)*(tree[id*].add);
tree[id*+].sum += (tree[id*+].r-tree[id*+].l+)*(tree[id*+].add);
tree[id].add=;
}
} void updata(ll x,ll y,ll l,ll r,int id,ll k)
{
if(x<=l && r<=y)// 在区间里面 就可以做一定操作
{
tree[id].sum += (r-l+)*k;
tree[id].add += k;
return;
}
pushdown(id);//
ll mid=(l+r)/;
if(x <= mid) updata(x,y,l,mid,id*,k);
if(y > mid) updata(x,y,mid+,r,id*+,k);
pushup(id);
} ll query(ll x,ll y,ll l,ll r,int id)
{
if(x<=l && r<=y)
{
return tree[id].sum;
}
pushdown(id);
ll mid=(l+r)/;
ll sum=;
if(x<=mid) sum+=query(x,y,l,mid,id*);
if(y>mid) sum+=query(x,y,mid+,r,id*+);
pushup(id);//
return sum;
}
int main()
{
int n,q;
ll x,y,k;
while(scanf("%d %d",&n,&q)!=EOF)
{
for(int i=; i<=n; i++)
{
scanf("%d",&a[i]);
}
build(,n,);
while(q--)
{
char s[];
scanf("%s",s);
if(s[]=='Q')
{
scanf("%lld %lld",&x,&y);
printf("%lld\n",query(x,y,,n,));
}
else if(s[]=='C')
{
scanf("%lld %lld %lld",&x,&y,&k);
updata(x,y,,n,,k);
}
}
} return ;
}

poj 3468 整理一下线段树的写法的更多相关文章

  1. HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)

    做这道题之前,建议先做POJ 1151  Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...

  2. poj 3277 City Horizon (线段树 扫描线 矩形面积并)

    题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...

  3. POJ 2777 Count Color (线段树成段更新+二进制思维)

    题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...

  4. POJ 2828 Buy Tickets (线段树 or 树状数组+二分)

    题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...

  5. poj 2777 Count Color(线段树)

    题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS   Memory Limit: 65536K Total Subm ...

  6. poj 2828 Buy Tickets (线段树(排队插入后输出序列))

    http://poj.org/problem?id=2828 Buy Tickets Time Limit: 4000MS   Memory Limit: 65536K Total Submissio ...

  7. poj 3264 Balanced Lineup(线段树、RMQ)

    题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...

  8. poj 2777 Count Color(线段树区区+染色问题)

    题目链接:  poj 2777 Count Color 题目大意:  给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C  a  b  c 把区间[a,b]涂为c色,P  a  b 查 ...

  9. POJ 2991 Crane(线段树+计算几何)

    POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂.有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树.把每一段当成 ...

随机推荐

  1. Python语法 - yield表达式(类似 m = yield i )

      yield是个表达式而不仅仅是个语句,所以可以使用x = yield r 这样的语法, yield表达式可以接收send()发出的参数,yield表达式是跟send方法一起配合使用   send方 ...

  2. 你的windows许可证即将过期

    0xC004F025拒绝访问:所请求的操作需要提升特权:解决方法:1.打开我的电脑找到windows System32目录下的cmd                 2.对windows System ...

  3. 重读APUE(7)-link/unlink与mkdir/rmdir

    link–用于创建一个现有文件的链接:实际上是新建一个目录项,指向当前文件的i节点: unlink–用于删除一个现有文件的连接:实际上是对引用i节点的目录项进行删除,并且对链接计数-1:系统会检查文件 ...

  4. 如何卸载oracle11g

    方法/步骤   .关闭oracle所有的服务.可以在windows的服务管理器中关闭:   打开注册表:regedit 打开路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentCo ...

  5. Java同步数据结构之LinkedTransferQueue

    前言 LinkedTransferQueue是Java并发包中最强大的基于链表的无界FIFO阻塞传输队列.从JDK7开始出现,Doug Lea说LinkedTransferQueue是Concurre ...

  6. Java同步数据结构之LinkedBlockingQueue

    前言 比起ArrayBlockingQueue,LinkedBlockingQueue应该是最被大家常用的阻塞队列,LinkedBlockingQueue是基于链表的一种可选容量的阻塞队列,也就是说, ...

  7. 关于Java 8新引入语法特性的简要说明

    Java 8在语法上的主要改进就是新增了Lambda Expression以及Method Reference.由于官方网站的介绍稍显罗嗦,而且例子也有些复杂.我这里将提供一些更为浅显.直观的例子来帮 ...

  8. 阶段5 3.微服务项目【学成在线】_day02 CMS前端开发_10-webpack研究-安装nodejs

    1.3.2.1 安装Node.js webpack基于node.js运行,首先需要安装node.js. node -v:验证是否安装成功了.

  9. springboot动态定时任务

    SpringBoot设置动态定时任务 一.说明 1.在我们日常的开发中,很多时候,定时任务都不是写死的,而是写到数据库中,从而实现定时任务的动态配置. 2.定时任务执行时间可根据数据库中某个设置字段动 ...

  10. php文件断点上传

    前段时间做视频上传业务,通过网页上传视频到服务器. 视频大小 小则几十M,大则 1G+,以一般的HTTP请求发送数据的方式的话,会遇到的问题:1,文件过大,超出服务端的请求大小限制:2,请求时间过长, ...