POJ - 3468

整理了个新的线段树的模板,暑期集训的时候学长给的模板,每个节点单单存了自己所要维护的内容,还是少了点。导致在写pushdown的时候,len我会有点难写。所以就整理个新的模板。

每个节点还存了l,r,lazy,len,写起来思路清晰多了。

#include<iostream>
#include<cstdio>
#define lson (rt << 1)
#define rson (rt << 1 | 1)
#define Lson lson, l, mid
#define Rson rson, mid + 1, r
typedef long long ll;
const int INF=0x3f3f3f3f;
const int maxn=1e5+;
using namespace std;
struct node
{
ll val;//值
int len;//长度
ll lazy;//标记
int l,r;//左右端点
}tree[maxn<<]; ll arr[maxn]; int n,m; void build(int rt,int l,int r) //建树
{
tree[rt].lazy=;
tree[rt].l=l;tree[rt].r=r;
tree[rt].len=r-l+;
if (l==r) tree[rt].val=arr[l];//到达树端点,给val赋值
else
{
int mid=(l+r)/;
build(Lson);
build(Rson);
tree[rt].val=tree[lson].val+tree[rson].val;
}
} void pushdown(int rt) //向下传递lazy标记
{
if (tree[rt].lazy)
{
tree[lson].lazy+=tree[rt].lazy;
tree[rson].lazy+=tree[rt].lazy;
tree[lson].val+=tree[lson].len*tree[rt].lazy;
tree[rson].val+=tree[rson].len*tree[rt].lazy;
tree[rt].lazy=;
}
} void add(int rt,int id,ll addval) //单点更新
{
if (tree[rt].l==tree[rt].r)
{
tree[rt].val+=addval;
return;
}
else
{
int mid=(tree[rt].l+tree[rt].r)/;
if (id<=mid) add(lson,id,addval);
else add(rson,id,addval);
tree[rt].val=tree[lson].val+tree[rson].val;
}
} ll query(int rt,int l,int r) //计算区间和
{
if (tree[rt].l>=l&&tree[rt].r<=r)
return tree[rt].val;
if (tree[rt].l>r||tree[rt].r<l)
return ;
pushdown(rt);
return query(lson,l,r)+query(rson,l,r);
} void update(int rt,int l,int r,ll addval) //区间更新
{
ll mid;
if (tree[rt].l>=l&&tree[rt].r<=r)
{
tree[rt].lazy+=addval;
tree[rt].val+=tree[rt].len*addval;
return;
}
if (tree[rt].l>r||tree[rt].r<l)
return;
pushdown(rt);
update(lson,l,r,addval);
update(rson,l,r,addval);
tree[rt].val=tree[lson].val+tree[rson].val;
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
{
scanf("%lld",&arr[i]);
}
build(,,n);
for (int i=;i<=m;i++)
{
char s[];
scanf("%s",s);
int l,r;
ll x;
if (s[]=='C')
{ scanf("%d%d%lld",&l,&r,&x);
update(,l,r,x);
}
else
{
scanf("%d%d",&l,&r);
printf("%lld\n",query(,l,r));
}
}
return ;
}

线段树模板加模板题POJ3468的更多相关文章

  1. hdu1698(线段树区间替换模板)

    题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1698 题意: 第一行输入 t 表 t 组测试数据, 对于每组测试数据, 第一行输入一个 n , 表示 ...

  2. 【线段树I:母题】hdu 1166 敌兵布阵

    [线段树I:母题]hdu 1166 敌兵布阵 题目链接:hdu 1166 敌兵布阵 题目大意 C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又開始忙乎了.A国在海 ...

  3. UESTC 1591 An easy problem A【线段树点更新裸题】

    An easy problem A Time Limit: 2000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others ...

  4. 【CF52C】Circular RMQ(线段树区间加减,区间最值)

    给定一个循环数组a0, a1, a2, …, an-1,现在对他们有两个操作: Inc(le, ri, v):表示区间[le, ri]范围的数值增加v Rmq(le, ri):表示询问区间[le, r ...

  5. poj 3468 A Simple Problem with Integers 线段树区间加,区间查询和(模板)

    A Simple Problem with Integers Time Limit: 1 Sec  Memory Limit: 256 MB 题目连接 http://poj.org/problem?i ...

  6. 【BZOJ 3196】二逼平衡树 线段树套splay 模板题

    我写的是线段树套splay,网上很多人写的都是套treap,然而本蒟蒻并不会treap 奉上sth神犇的模板: //bzoj3196 二逼平衡树,支持修改某个点的值,查询区间第k小值,查询区间某个值排 ...

  7. POJ 3468:A Simple Problem with Integers(线段树区间更新模板)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 141093 ...

  8. 【luogu P3372 线段树1】 模板

    线段树的模板题 题目链接:https://www.luogu.org/problemnew/show/P3372 update区间修改,query区间求和 #include <iostream& ...

  9. 线段树(SegmentTree)基础模板

    线段树模板题来源:https://www.lintcode.com/problem/segment-tree-build/description 201. 线段树的构造 /** * Definitio ...

随机推荐

  1. SecureCRT安装包和破解脚本

    第一步下载 SecureCRT安装包和破解脚本 下载 http://pan.baidu.com/s/1c1D5Ala 破解脚本 securecrt_mac_crack.pl安装包scrt-7.3.7- ...

  2. Android(常用)主流UI开源库整理

    这几天刚做完一个项目..有点空余时间,就想着吧这一两年做的项目中的UI界面用到的一些库整理一下.后来想了一下,既然要整理,就把网上常用的 AndroidUI界面的主流开源库 一起整理一下,方便查看. ...

  3. 分享一个mysql服务启动与关闭的bat文件

    有时候打开数据库可视化工具(sqlyog.navicat)连接数据库时,会出现以下报错信息. 大家都知道是数据库的服务没有启动. 所以我想给大家分享一个bat文件可供快速启动mysql的数据库的服务, ...

  4. 建议2:注意Javascript数据类型的特殊性---(4)避免误用parseInt

    parseInt是一个将字符串转换为整数得函数,与parseFloat(将字符串转换为浮点数)对应,这两种函数是JavaScript提供得两种静态函数,用于把非数字得原始值转换为数字. 在开始转换时, ...

  5. 函数基础重点掌握内容:创建函数、return返回单个值、return返回多个值、函数名加括号与不加括号的区别

    ##比较两个数大小 #有参函数!!! def compare(s,t): if s > t: print(s) else: print(t) f=compare compare(1000,30) ...

  6. SQLHelper.cs类 微软C#版

    using System; using System.Data; using System.Xml; using System.Data.SqlClient; using System.Collect ...

  7. android只设置部分控件随着软键盘的出现而腾出空间

    转载请标明出处:https://www.cnblogs.com/tangZH/p/12013685.html 在项目过程中,出现了一个需求,软键盘要顶起部分控件,而另一部分控件不动. 关于这种需求,我 ...

  8. docker安装redis 5.0.7并挂载外部配置和数据

    环境 CentOS Linux release 7.7.1908 (Core) 拉取redis 5.0.7 镜像 docker pull redis:5.0.7 创建挂载目录 mkdir -p /ho ...

  9. 林克的小本本之——HCL网络知识随笔

    单臂路由 单臂路由是一种通过在路由器的一个接口上配置逻辑接口,来实现不同Vlan之间互通的方法. 实例: #配置SW1的VLAN [SW1]vlan 2 #配置端口vlan略 [SW1]int g1/ ...

  10. Jmeter常用的两大性能测试场景

    一.阶梯式场景 该场景主要应用在负载测试里面,通过设定一定的并发线程数,给定加压规则,遵循“缓起步,快结束”的原则,不断地增加并发用户来找到系统的性能瓶颈,进而有针对性的进行各方面的系统优化. 使用到 ...