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. 【前端优化】js图片懒加载及优化

    一.前言 为啥要对图片使用懒加载?我们首先来聊聊这个问题,对于页面来说架子啊速度影响着最大的就是图片,一张普通的图片可以达到4-5M的大小,而代码压缩也就只有几十KB.当页面图片过多的时候,页面加载速 ...

  2. 可用的NTP服务器地址

    国内可用的Internet时间同步服务器地址(NTP时间服务器)好在阿里云提供了7个NTP时间服务器也就是Internet时间同步服务器地址 ntp1.aliyun.comntp2.aliyun.co ...

  3. BFS(三):双向广度优先搜索

    所谓双向广度搜索指的是搜索沿两个方向同时进行:(1)正向搜索:从初始结点向目标结点方向搜索:(2)逆向搜索:从目标结点向初始结点方向搜索:当两个方向的搜索生成同一子结点时终止此搜索过程. 广度双向搜索 ...

  4. [Python学习]错误篇一

    REFERENCE:<Head First Python> ID:我的第一篇[Python学习] BIRTHDAY:2019.7.6 EXPERIENCE_SHARING:两个程序错误类型 ...

  5. C语言学习书籍推荐《Practical C++ Programming》下载

    下载链接 :点我 C++ is a powerful, highly flexible, and adaptable programming language that allows software ...

  6. .Net Core Api 授权认证

    一.所使用到的NuGet: 1. System.IdentityModel.Tokens.Jwt 2. Microsoft.AspNetCore.Authentication.JwtBearer 二. ...

  7. 学习 Python 心得

    脚本式编程: 通过脚本参数调用解释器开始执行脚本,直到脚本执行完毕.当脚本执行完成后,解释器不再有效. 让我们写一个简单的 Python 脚本程序.所有 Python 文件将以 .py 为扩展名.将以 ...

  8. 【深入浅出-JVM】(8):TLAB

    概念 TLAB(Thread Local Allocation Buffer)线程本地分配缓冲区(线程私有分配区,私有分配,公共查看),占用 Eden 区(缺省 Eden 的1%),默认开启,JVM ...

  9. VS2010 winform开发笔记---combox的SelectedIndexChanged事件及级联问题

    DisplayMember绑定需要显示的数据表字段, 而ValueMember绑定需要获取选择的项的值. 然后通过 combo.SelectedValue就可以取得选中项的值了. DisplayMem ...

  10. [记录]Python高并发编程

    ========== ==多进程== ========== 要让Python程序实现多进程(multiprocessing),我们先了解操作系统的相关知识. Unix/Linux操作系统提供了一个fo ...