题目链接: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]区间修改区间查询可持久化线段树的更多相关文章

  1. HDU 4348 To the moon 可持久化线段树,有时间戳的区间更新,区间求和

    To the moonTime Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hust.edu.cn/vjudge/contest/view.a ...

  2. HDU 4348 To the moon 可持久化线段树

    To the moon Problem Description BackgroundTo The Moon is a independent game released in November 201 ...

  3. HDU 5919 Sequence II(可持久化线段树)

    [题目链接]http://acm.hdu.edu.cn/showproblem.php?pid=5919 [题目大意] 给出一个数列,每次查询数列中,区间非重元素的下标的中位数.查询操作强制在线. [ ...

  4. hdu 5919 Sequence II (可持久化线段树)

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=5919 大致题意: 给你一个长度为n的序列,q个询问,每次询问是给你两个数x,y,经过与上一次的答案进行运算 ...

  5. 题解报告: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 ...

  6. BZOJ5371[Pkusc2018]星际穿越——可持久化线段树+DP

    题目描述 有n个星球,它们的编号是1到n,它们坐落在同一个星系内,这个星系可以抽象为一条数轴,每个星球都是数轴上的一个点, 特别地,编号为i的星球的坐标是i. 一开始,由于科技上的原因,这n个星球的居 ...

  7. 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 ...

  8. 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 ...

  9. HDU 4417.Super Mario-可持久化线段树(无修改区间小于等于H的数的个数)

    Super Mario Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

随机推荐

  1. 中恳中笨 搭建flask封装环境

    话不多说,先干再说..... 打开pycharm,创建一个关于flask的项目 2.创建一个App的文件包 3.把staic和templates文件包拖进App里 4.把app.py文件改为manag ...

  2. Python学习手册之控制结构(一)

    在上一篇文章中,我们对 Python 进行了简单介绍和介绍了 Python 的基本语法,现在我们继续介绍 Python 控制结构. 查看上一篇文章请点击:https://www.cnblogs.com ...

  3. POJ3687 反向拓扑排序

    Labeling Balls Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 16032   Accepted: 4713 D ...

  4. 【转】让Moodle支持多个域名

    默认情况下,moodle仅能绑定一个域名.但是由于学校网络分内网和外网,总希望如果是外网访问的,用外网的域名,用内网访问的,就转到内网的ip.这样访问的速度会更快一些,也减低对防火墙的压力.尤其是当外 ...

  5. SQL Server附加数据库拒绝访问错误解决方法

    今天在MsSQL里附加数据库时提示操作系统错误5(拒绝访问),这里我没给出了两个解决方案供大家解决问题. 方案一:切换登录方式 出现这种情况是由于用“混合验证方式”(SQL Server身份验证)登录 ...

  6. express与ejs,ejs在Linux上面的路径问题

    1.学习使用ejs模板(这个是ejs.js) var express = require('express'); var app = express(); app.set("view eng ...

  7. FreeRTOS软件定时器的使用

    先贴上一个创建的代码,先声明一个句柄 TimerHandle_t pump_wakeup_timer_handle = NULL; 创建定时器和启动定时器,第三个参数,pdFALSE是只定时一次,pd ...

  8. JavaScript序列化对象成URL格式

    http://access911.net/fixhtm/72FABF1E15DCEAF3.htm?tt=

  9. tp5.0 模型查询数据的返回类型,分页

    一开始用painate()这个函数的时候,发现有的查询方式不能使用这个函数,由此了解到了模型查询和普通查询返回类型的不同 1.原生查询方法 Db::query("select * from ...

  10. python,批量生成指定格式的审核数据(传输参数格式为数组时)

    #思路#获取list长度(例如列表有20条数据,则生成20条数据),生成数组长度为list元素的数据,完成对列表20条数据的批量审核def createBatchData(self,str_in,li ...