1317. 数列操作C

★★★   输入文件:shuliec.in   输出文件:shuliec.out   简单对比
时间限制:1 s   内存限制:128 MB

【题目描述】

假设有一个长度为 n(n≤100000) 的数列 A,支持如下两种操作:

1. 将 Ai,Ai+1,…,Aj 的值均增加 d

2. 查询 As+As+1+⋯+At(s≤t) 的值。

根据操作要求进行正确操作并输出结果。

【输入格式】

第一行为一个正整数 n,表示数列的大小。

第二行有 n 个整数,表示数列 A 各项的初始值。

第三行为一个整数 m ,表示操作的个数。

下面是 m 行,每行描述一个操作:

ADD i j d(将 Ai,Ai+1,…,Aj(1≤i,j≤n) 的值均增加一个整数 d)

SUM s t(表示查询 As+⋯+At 的值)

【输出格式】

对于每一次询问,输出查询到的结果。

【样例输入】

4
1 4 2 3
3
SUM 1 3
ADD 2 2 50
SUM 2 3

【样例输出】

7
56

【提示】

所有答案小于 4611686018427387904

加强 10 组极限数据,未全部重测 by rvalue 2018.2.26

还是线段树而已

#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
#define ll long long
ll a[maxn];
int n,m;
struct SegmentTree{
int l,r;
long long dat;
long long lazy_tag;
}t[maxn<<];
void Pushdown(int p,int l,int r,int mid){
t[p*].dat+=t[p].lazy_tag*(mid-l+);
t[p*+].dat+=t[p].lazy_tag*(r-mid);
t[p*].lazy_tag+=t[p].lazy_tag;
t[p*+].lazy_tag+=t[p].lazy_tag;
t[p].lazy_tag=;
}
void build(int p,int l,int r){
t[p].l=l;t[p].r=r;
if(l==r){
t[p].dat=a[l];
return;
}
int mid=(l+r)>>;
build(p*,l,mid);
build(p*+,mid+,r);
t[p].dat=t[p*].dat+t[p*+].dat;
}
ll Get(int p,int l,int r,int s,int tt){
if(s>r||tt<l) return ;
if(s<=l&&r<=tt) return t[p].dat;
int mid=(l+r)>>;
Pushdown(p,l,r,mid);
return Get(p*,l,mid,s,tt)+ Get(p*+,mid+,r,s,tt);
}
void Add(int p,int l,int r,int s,int tt,ll x){
if(s>r||tt<l) return;
if(s<=l&&r<=tt){
t[p].dat+=x*(r-l+);
t[p].lazy_tag+=x;
return;
}
int mid=(l+r)>>;
Pushdown(p,l,r,mid);
Add(p*,l,mid,s,tt,x);Add(p*+,mid+,r,s,tt,x);
t[p].dat=t[p*].dat+t[p*+].dat;
}
int main()
{
freopen("shuliec.in","r",stdin);freopen("shuliec.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%lld",&a[i]);
scanf("%d",&m);
build(,,n);
for(int i=;i<=m;i++){
string s;cin>>s;
if(s[]=='S'){
int l,r;scanf("%d%d",&l,&r);
printf("%lld\n",Get(,,n,l,r));
}
else{
int s,t;
ll d;
scanf("%d%d%lld",&s,&t,&d);
Add(,,n,s,t,d);
}
} return ;
}

还有一个

标记永久化线段树

#include <stdio.h>
#include <algorithm>
using namespace std;
const int maxn=;
#define LL long long
#define mid (l+r>>1)
#define ls (rt<<1)
#define rs (rt<<1|1)
#define lson ls,l,mid
#define rson rs,mid+1,r
int n,m,cnt,a[maxn];
LL sum[maxn<<],lazy[maxn<<];
void Build(int rt,int l,int r){
if(l==r){
sum[rt]=a[l];
return;
}
Build(lson),Build(rson);
sum[rt]=sum[ls]+sum[rs];
}
void Add(int rt,int l,int r,int s,int t,LL qx){
if(s>r||t<l)return;
if(s<=l&&r<=t){
lazy[rt]+=qx;
sum[rt]+=qx*(r-l+);
return;
}
Add(lson,s,t,qx),Add(rson,s,t,qx);
sum[rt]=sum[ls]+sum[rs]+lazy[rt]*(r-l+);
}
LL Get(int rt,int l,int r,int s,int t){
if(s>r||t<l)return ;
if(s<=l&&r<=t)return sum[rt];
int ll=max(l,s),rr=min(r,t);
return lazy[rt]*(rr-ll+)+Get(lson,s,t)+Get(rson,s,t);
}
int main(){
freopen("shuliec.in","r",stdin);freopen("shuliec.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++)scanf("%d",&a[i]);
Build(,,n);
scanf("%d",&m);
for(int i=;i<m;i++){
char s[];
scanf("%s",s);
if(s[]=='S'){
int l,r;scanf("%d%d",&l,&r);
printf("%lld\n",Get(,,n,l,r));
}
else{
int l,r;LL x;scanf("%d%d%lld",&l,&r,&x);
Add(,,n,l,r,x);
}
}
}

标记永久化就是在打标记的时候只需要打在上面就行了

不需要往下放

cogs 1317. 数列操作C 区间修改 区间查询的更多相关文章

  1. cogs 1316. 数列操作B 区间修改 单点查询

    1316. 数列操作B ★★   输入文件:shulieb.in   输出文件:shulieb.out   简单对比时间限制:1 s   内存限制:128 MB [问题描述] 假设有一个大小为 n(n ...

  2. COGS.1317.数列操作c(分块 区间加 区间求和)

    题目链接 #include<cmath> #include<cstdio> #include<cctype> #include<algorithm> u ...

  3. COGS 2638. 数列操作ψ 线段树

    传送门 : COGS 2638. 数列操作ψ 线段树 这道题让我们维护区间最大值,以及维护区间and,or一个数 我们考虑用线段树进行维护,这时候我们就要用到吉司机线段树啦 QAQ 由于发现若干次an ...

  4. [线段树]区间修改&区间查询问题

    区间修改&区间查询问题 [引言]信息学奥赛中常见有区间操作问题,这种类型的题目一般数据规模极大,无法用简单的模拟通过,因此本篇论文将讨论关于可以实现区间修改和区间查询的一部分算法的优越与否. ...

  5. 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询

    题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...

  6. bzoj 3779 重组病毒 —— LCT+树状数组(区间修改+区间查询)

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3779 RELEASE操作可以对应LCT的 access,RECENTER则是 makeroo ...

  7. 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询

    题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...

  8. 题解报告:CODE[VS] 1082 线段树练习3(区间修改+区间查询)

    题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...

  9. A Simple Problem with Integers-POJ3468 区间修改+区间查询

    题意: 给你n个数和2个操作,C操作是将一个区间内的每个数都加上k,Q操作是询问一个区间的和 链接:http://poj.org/problem?id=3468 思路: 线段树区间修改+区间查询 代码 ...

随机推荐

  1. 10月17日 JS开始日~

    1.变量提升 变量提升是浏览器的一个功能,在运行js代码之前,浏览器会给js一个全局作用域,叫window, window分为两个模块,一个叫做内存模块,一个叫做运行模块,内存模块找到当前作用域下的 ...

  2. KVM web管理工具——WebVirtMgr

    系统环境: [root@kvm-admin ~]# cat /etc/redhat-release CentOS Linux release (Core) 关闭防火墙.selinux [root@kv ...

  3. 56. Merge Interval

    56. Merge Interval 0. 参考文献 序号 文献 1 花花酱 LeetCode 56. Merge Intervals 2 [LeetCode] Merge Intervals 合并区 ...

  4. php中对象类型与数组之间的转换

    1.刚看视频学习的时候看到一个困扰很久的问题, 有时候我们在进行做项目的时候会碰到的一个小问题.举一个小例子.  获取一个xml文件里面的数据. xml.xml文件如下: <?xml versi ...

  5. vue组件间通信六种方式(完整版)

    本文总结了vue组件间通信的几种方式,如props. $emit/ $on.vuex. $parent / $children. $attrs/ $listeners和provide/inject,以 ...

  6. 宏旺半导体浅谈存储芯片LPDDR4X与UFS2.1的差别

    现在市面上手机参数动不动就是8GB+128GB,手机的这些参数是越大越好吗?这些数字代表什么?宏旺半导体ICMAX给大家科普下. 手机的运行内存RAM——LPDDR4X LPDDR4X为RAM(运存) ...

  7. python无网安装psycopg2

    1. 问题描述 ​ python项目要获取greenplum数据库数据,gp底层是postgresql,需要使用python的第三方工具包psycopg2操作数据库,但是问题是服务器上没有网络,无法在 ...

  8. linux应用程序设计--GCC程序编译

    GCC程序编译 linux系统下的GCC(GNU C Compiler)是GNU推出的功能强大.性能优越的多平台编译器,是GNU的代表作之一.GCC可以在多种硬件平台上编译出可执行程序,其执行效率与一 ...

  9. 第一章 Servlet

    JavaEEe技术包括Servlet/Jsp.Java Message Service(JMS).Enterprise JavaBeans(EJB).JavaServer Faces(JSF),以及J ...

  10. Git设置忽略文件

    在向代码仓库提交的时候,一般需要忽略掉一些文件或目录,比如Eclipse工程的配置文件,Maven工程的target目录,以及.log日志文件等等. 这个问题在Git中解决起来也很简单:在Git工作区 ...