[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 函数和模块. 查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9976234 ...
- html 弹框 优化 alert
<!DOCTYPE html> <html> <head> <title>cs</title> </head> <styl ...
- python数据类型及其特有方法
一.运算符 in方法 "hello" in "abcdefghijklmnopqrstuvwxyz" "li" in ["gg&q ...
- python2.7练习小例子(九)
9)1.题目:暂停一秒输出. 程序分析:使用 time 模块的 sleep() 函数. 程序源代码: #!/usr/bin/python # -*- coding: UTF-8 ...
- oracle查询优化,存储过程select表循环插入另一个表,以及索引重建
查询语句pl/sql中用F5优化语句 ORACLE的explain plan工具的作用只有一个,获取语句的执行计划1.语句本身并不执行,ORACLE根据优化器产生理论上的执行计划2.语句的分析结果存放 ...
- 详解jQuery中 .bind() vs .live() vs .delegate() vs .on() 的区别
转载自:http://zhuzhichao.com/2013/12/differences-between-jquery-bind-vs-live/ 我见过很多开发者很困惑关于jQuery中的.bin ...
- stm32--USB(作为U盘)+FatFs的实现
一.USB功能的添加(作为U盘) 添加文件 将官方库中的Library文件夹中的所有有效文件添加到工程中,分为4个文件夹: usb class为硬件相关(Library\Class): usb dri ...
- spring boot 入门3 如何在springboot 上使用AOP
Aop是spring的两大核心之一 那么如何在springboot中采用注解的形式实现aop那? 1)首先我们定义一个相关功能的切面类 并 采用@Aspect 注解来声明当前类为切面 同时采用@Com ...
- Mysql双主操作
MySQL双主(主主)架构方案 在企业中,数据库高可用一直是企业的重中之重,中小企业很多都是使用mysql主从方案,一主多从,读写分离等,但是单主存在单点故障,从库切换成主库需要作改动.因此,如果 ...
- MinGW安装图文教程以及如何配置C语音编程环境
MinGW安装图文教程以及如何配置C语音编程环境 转载自:http://www.jb51.net/softjc/192017.html MinGW 是一组包含文件和端口库,其功能是允许控制台模式的程序 ...