poj 3468 整理一下线段树的写法
// 对于延迟更新,我们在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 整理一下线段树的写法的更多相关文章
- HDU 1828 / POJ 1177 Picture (线段树扫描线,求矩阵并的周长,经典题)
做这道题之前,建议先做POJ 1151 Atlantis,经典的扫描线求矩阵的面积并 参考连接: http://www.cnblogs.com/scau20110726/archive/2013/0 ...
- poj 3277 City Horizon (线段树 扫描线 矩形面积并)
题目链接 题意: 给一些矩形,给出长和高,其中长是用区间的形式给出的,有些区间有重叠,最后求所有矩形的面积. 分析: 给的区间的范围很大,所以需要离散化,还需要把y坐标去重,不过我试了一下不去重 也不 ...
- POJ 2777 Count Color (线段树成段更新+二进制思维)
题目链接:http://poj.org/problem?id=2777 题意是有L个单位长的画板,T种颜色,O个操作.画板初始化为颜色1.操作C讲l到r单位之间的颜色变为c,操作P查询l到r单位之间的 ...
- POJ 2828 Buy Tickets (线段树 or 树状数组+二分)
题目链接:http://poj.org/problem?id=2828 题意就是给你n个人,然后每个人按顺序插队,问你最终的顺序是怎么样的. 反过来做就很容易了,从最后一个人开始推,最后一个人位置很容 ...
- poj 2777 Count Color(线段树)
题目地址:http://poj.org/problem?id=2777 Count Color Time Limit: 1000MS Memory Limit: 65536K Total Subm ...
- poj 2828 Buy Tickets (线段树(排队插入后输出序列))
http://poj.org/problem?id=2828 Buy Tickets Time Limit: 4000MS Memory Limit: 65536K Total Submissio ...
- poj 3264 Balanced Lineup(线段树、RMQ)
题目链接: http://poj.org/problem?id=3264 思路分析: 典型的区间统计问题,要求求出某段区间中的极值,可以使用线段树求解. 在线段树结点中存储区间中的最小值与最大值:查询 ...
- poj 2777 Count Color(线段树区区+染色问题)
题目链接: poj 2777 Count Color 题目大意: 给出一块长度为n的板,区间范围[1,n],和m种染料 k次操作,C a b c 把区间[a,b]涂为c色,P a b 查 ...
- POJ 2991 Crane(线段树+计算几何)
POJ 2991 Crane 题目链接 题意:给定一个垂直的挖掘机臂.有n段,如今每次操作能够旋转一个位置,把[s, s + 1]专程a度,每次旋转后要输出第n个位置的坐标 思路:线段树.把每一段当成 ...
随机推荐
- Qt for Android(一)Qt在Android手机上全屏显示
1.在程序的编译路径下找到AndroidManifest.xml文件,具体路径如下: 2.在pro文件中添加一句话: ANDROID_PACKAGE_SOURCE_DIR = $$PWD/Androi ...
- Java实现线程的三种方式和区别
Java实现线程的三种方式和区别 Java实现线程的三种方式: 继承Thread 实现Runnable接口 实现Callable接口 区别: 第一种方式继承Thread就不能继承其他类了,后面两种可以 ...
- Intent Flags
Activity都是运行在任务栈里面,但如果要从广播接受者BordercastReceiver或者服务Service去启动一个Activity,必须为当前Activity创建一个新的任务栈才能正常显示 ...
- 11Flutter页面布局 Stack层叠组件 Stack与Align Stack与Positioned实现定位布局
/* Flutter 页面布局 Stack层叠组件: Stack与Align Stack与Positioned实现定位布局: Flutter Stack组件: Stack表示堆得意思,我们可以用Sta ...
- Qt编写自定义控件31-面板仪表盘控件
一.前言 在Qt自定义控件中,仪表盘控件是数量最多的,写仪表盘都写到快要吐血,可能是因为各种工业控制领域用的比较多吧,而且仪表盘又是比较生动直观的,这次看到百度的echart中有这个控件,所以也来模仿 ...
- java nio 缓冲区读写数据(图形详解)
Position 您可以回想一下,缓冲区实际上就是美化了的数组.在从通道读取时,您将所读取的数据放到底层的数组中. position 变量跟踪已经写了多少数据.更准确地说,它指定了下一个字节将放到数组 ...
- EasyUI之toolTip
<a class="easyui-tooltip" title="提示框" href="http://www.baidu.com"&g ...
- 通过route指令指定笔记本同时连接外网和内网
假如你的外网网关是:X.X.X.X 内网网关:192.168.1.1 则在命令窗口输入以下两条命令: route add 0.0.0.0 mask 0.0.0.0 X.X.X.X route add ...
- Hackertarget:一款发现攻击面的工具
前言 https://github.com/ismailtasdelen/hackertarget 代码 主要通过这家公司提供的API查询相关数据实现的功能,API看起来可以用很久. #!/usr/b ...
- Vuetify Warning: Unable to locate target [data-app]
今天在大改 nuxt 项目 layout 的时候,将 Vuetify 的 side nav 换成 Element 的折叠式 nav 后,发现了一个 Warning,虽然不影响使用,但是控制台输出一堆, ...