题目链接: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. 基于pyecharts的IT各行业薪资展示

    我们的项目是一个信息采集系统,采集的是51job招聘网站,我爬取了Python,Java,C++,PHP还有北京各地区的职位数量,以及经验要求,和学历要求等等. 网页头; <!DOCTYPE h ...

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

    在上一篇文章中,我们介绍了Python的一些控制结构,现在我们继续介绍剩下的 Python 控制结构.查看上一篇文章请点击:https://www.cnblogs.com/dustman/p/9972 ...

  3. delphi 数据库中Connection与Query连接数量问题思考

    今天闲着没事,测试了一下Connection连接MSSQL,可以承受多少连接.    1.看看ADOConnection的连接数:写了一个代码,动态创建,测试了10000个连接,花了大约5~10分钟创 ...

  4. P1107 最大整数

    P1107 最大整数 题目描述 设有n个正整数 (n<=20), 将它们连接成一排, 组成一个最大的多位整数. 例如: n=3时, 3个整数13, 312, 343连接成的最大整数为: 3433 ...

  5. FPGA数字鉴相鉴频器的开发记录

    1. 对于电机的锁相控制,需要对相差进行PI性质的环路滤波,但现有的锁相环中鉴频鉴相器输出为相差脉冲而非数字量,难以直接进行PI特性的环路滤波. 通过对晶振的非整数分频获取准确的参考时钟,基于触发器机 ...

  6. ubuntu 14.04安装nginx+php

    转自:http://www.cnblogs.com/helinfeng/p/4219051.html 基于最新的Ubuntu 14.04(2014年9月)搭建nginx.php.mysql环境,以下全 ...

  7. Qt HUD(平显)演示程序绿色版

    把一个黑底白字的程序改成黑底绿字 上对比图,左侧是原本,右侧是仿造,有些地方比例还是有问题 其实这个程序没有啥技术含量,就是画 #include "mainwindow.h" #i ...

  8. Qt 实现脉搏检测-2,简陋的功能产品

    今天终于可以接上硬件来显示真是的脉搏情况了,上图 主要就是显示脉搏的心跳曲线,和IBI 数据来源是三个,串口,网口和蓝牙,目前只实现了串口,过程应该都是差不多的,监听,读取,解析,等硬件更新后,再次更 ...

  9. linux ----- Vim进入和退出命令

    Vim进入和退出命令     本来不想写任何关于vim的文章的,无奈我今天又忘记怎么退出vim了,常用命令是ESC,然后:wq(保存并退出),:q!(不保存并强制退出),i进入vim模式.另外还有其它 ...

  10. Leetcode. 回文字符串的分割和最少分割数

    Q1: 回文字符串的分割 Given a string s, partition s such that every substring of the partition is a palindrom ...