[hdu 4348]区间修改区间查询可持久化线段树
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4348
一开始把lazy标记给push_down了,后来发现这样会让持久化变乱,然后想到不用push_down也可以统计和,改写之后就过了。
#include<bits/stdc++.h>
using namespace std; const int maxn=;
int a[maxn];
int rt[maxn];
int ts;
int n; struct Node
{
int lson,rson;
long long val,lz;
}node[*maxn];
int tot; void push_up(int i)
{
node[i].val=node[node[i].lson].val+node[node[i].rson].val;
} //void push_down(int i)
//{
// if (node[i].lz==0) return;
// int ls=node[i].lson;
// int rs=node[i].rson;
// node[ls].lz+=node[i].lz;
// node[rs].lz+=node[i].lz;
// node[ls].val+=node[i].lz*node[ls].len;
// node[rs].val+=node[i].lz*node[rs].len;
// node[i].lz=0;
//} int build(int l,int r)
{
int th=++tot;
node[th].lz=;
if (l==r) node[th].val=a[l];
else
{
int mid=(l+r)/;
node[th].lson=build(l,mid);
node[th].rson=build(mid+,r);
push_up(th);
}
return th;
} int rebuild(int l,int r,int x,int i,int nowl,int nowr)
{
int th=++tot;
node[th].val=node[i].val;
node[th].lson=node[i].lson;
node[th].rson=node[i].rson;
node[th].lz=node[i].lz;
if (l==nowl&&r==nowr)
{
node[th].lz+=x;
node[th].val+=x*(nowr-nowl+);
}
else
{
int mid=(nowl+nowr)/;
if (r<=mid) node[th].lson=rebuild(l,r,x,node[i].lson,nowl,mid);
else if (l>mid) node[th].rson=rebuild(l,r,x,node[i].rson,mid+,nowr);
else
{
node[th].lson=rebuild(l,mid,x,node[i].lson,nowl,mid);
node[th].rson=rebuild(mid+,r,x,node[i].rson,mid+,nowr);
}
push_up(th);
node[th].val+=node[th].lz*(nowr-nowl+);
}
return th;
} void insert(int l,int r,int x)
{
rt[++ts]=rebuild(l,r,x,rt[ts-],,n);
} long long querysum(int l,int r,int i,int nowl,int nowr)
{
if (nowl==l&&nowr==r) return node[i].val;
int mid=(nowl+nowr)/;
// push_down(i);
long long res=;
if (l>=nowl&&r<=nowr) res+=node[i].lz*(r-l+);
else if (l<nowl&&r>=nowl&&r<=nowr) res+=node[i].lz*(r-nowl+);
else if (r>nowr&&l>=nowl&&l<=nowr) res+=node[i].lz*(nowr-l+);
else if (l<nowl&&r>nowr) res+=node[i].lz*(nowr-nowl+);
if (r<=mid) res+=querysum(l,r,node[i].lson,nowl,mid);
else if (l>mid) res+=querysum(l,r,node[i].rson,mid+,nowr);
else res+=querysum(l,mid,node[i].lson,nowl,mid)+querysum(mid+,r,node[i].rson,mid+,nowr);
return res;
} long long query(int l,int r,int t)
{
return querysum(l,r,rt[t],,n);
} int main()
{
int m;
while (~scanf("%d%d",&n,&m))
{
for (int i=;i<=n;i++) scanf("%d",&a[i]);
ts=tot=;
rt[]=build(,n);
while (m--)
{
char s[];
scanf("%s",s);
if (s[]=='C')
{
int l,r,d;
scanf("%d%d%d",&l,&r,&d);
insert(l,r,d);
}
else if (s[]=='Q')
{
int l,r;
scanf("%d%d",&l,&r);
printf("%I64d\n",query(l,r,ts));
}
else if (s[]=='H')
{
int l,r,t;
scanf("%d%d%d",&l,&r,&t);
printf("%I64d\n",query(l,r,t));
}
else
{
int t;
scanf("%d",&t);
ts=t;
}
}
}
return ;
}
[hdu 4348]区间修改区间查询可持久化线段树的更多相关文章
- HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和
To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...
- HDU 4348 To the moon 可持久化线段树
To the moon Problem Description BackgroundTo The Moon is a independent game released in November 201 ...
- HDU 5919 Sequence II(可持久化线段树)
[题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...
- hdu 5919 Sequence II (可持久化线段树)
链接:http://acm.hdu.edu.cn/showproblem.php?pid=5919 大致题意: 给你一个长度为n的序列,q个询问,每次询问是给你两个数x,y,经过与上一次的答案进行运算 ...
- 题解报告:poj 3468 A Simple Problem with Integers(线段树区间修改+lazy懒标记or树状数组)
Description You have N integers, A1, A2, ... , AN. You need to deal with two kinds of operations. On ...
- BZOJ5371[Pkusc2018]星际穿越——可持久化线段树+DP
题目描述 有n个星球,它们的编号是1到n,它们坐落在同一个星系内,这个星系可以抽象为一条数轴,每个星球都是数轴上的一个点, 特别地,编号为i的星球的坐标是i. 一开始,由于科技上的原因,这n个星球的居 ...
- HDU 4348.To the moon SPOJ - TTM To the moon -可持久化线段树(带修改在线区间更新(增减)、区间求和、查询历史版本、回退到历史版本、延时标记不下放(空间优化))
To the moon Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total ...
- HDU 2665.Kth number-可持久化线段树(无修改区间第K小)模板 (POJ 2104.K-th Number 、洛谷 P3834 【模板】可持久化线段树 1(主席树)只是输入格式不一样,其他几乎都一样的)
Kth number Time Limit: 15000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)
Super Mario Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
随机推荐
- python字符串编码
python默认编码 python 2.x默认的字符编码是ASCII,默认的文件编码也是ASCII. python 3.x默认的字符编码是unicode,默认的文件编码是utf-8. 中文乱码问题 无 ...
- oracle监听配置
在listener.ora文件中指定监听的实例名和修改ip地址: 查看实例名:[localhost$] echo $ORACLE_SID LISTENER = (DESCRIPTION_LIST = ...
- JSOI2018 R1 & 九省联考2018 滚粗记
在NOIP与PKUWC相继滚粗后,rp守恒定律似乎终于开始起作用了…… (尽管Day2依然滚粗?) Day1: 本着前40min不写代码的准则,先把三道题大致过了一遍,似乎都比较喜闻乐见? T1:对抗 ...
- python2.7练习小例子(十二)
12):题目:打印出所有的"水仙花数",所谓"水仙花数"是指一个三位数,其各位数字立方和等于该数本身.例如:153是一个"水仙花数" ...
- 各种数据库分页语句整理以及Oracle数据库中的ROWNUM和ORDER BY的区别
.oracle数据库分页 select * from (select a.*,rownum rc from 表名 where rownum<=endrow) a where a.rc>=s ...
- 实用脚本 4 -- Makefile(不同文件下的多个可执行文件or静态库编译到同一目录下)
不同文件下的多个可执行文件编译到同一目录下,这样方便观察编译结果,从而方便进程操作.使用时根据自己的需要在进行局部修改(如 链接库.目标文件等等). 1..bashrc 中设置编译主目录(例如) ex ...
- 雷哥带你走进Javascript
javascript复习笔记--------------------------------------------1.概念2.面向对象思想3.作用认识4.引入方式5.执行顺序 变量 1)声明方式 x ...
- 掘金 Android 文章精选合集
掘金 Android 文章精选合集 掘金官方 关注 2017.07.10 16:42* 字数 175276 阅读 50053评论 13喜欢 669 用两张图告诉你,为什么你的 App 会卡顿? - A ...
- oracle 开启归档日志模式
摘自:https://www.jianshu.com/p/f8c0e9309ce2 在默认情况下,oracle数据库是在非归日志档模式中创建的,在非归档日志模式中,进行日志切换时会直接重写redo l ...
- Delphi实例之橡皮筋画图的实现
Delphi实例之橡皮筋画图的实现 在<Delphi7基础教程>这本书的练习中提到过一个橡皮筋画图的例子,书上的源码是错误的!不知道是打印的错误还是本身源码就有问题,我将它改了过来. 在F ...