cogs 1317. 数列操作C 区间修改 区间查询
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 区间修改 区间查询的更多相关文章
- cogs 1316. 数列操作B 区间修改 单点查询
1316. 数列操作B ★★ 输入文件:shulieb.in 输出文件:shulieb.out 简单对比时间限制:1 s 内存限制:128 MB [问题描述] 假设有一个大小为 n(n ...
- COGS.1317.数列操作c(分块 区间加 区间求和)
题目链接 #include<cmath> #include<cstdio> #include<cctype> #include<algorithm> u ...
- COGS 2638. 数列操作ψ 线段树
传送门 : COGS 2638. 数列操作ψ 线段树 这道题让我们维护区间最大值,以及维护区间and,or一个数 我们考虑用线段树进行维护,这时候我们就要用到吉司机线段树啦 QAQ 由于发现若干次an ...
- [线段树]区间修改&区间查询问题
区间修改&区间查询问题 [引言]信息学奥赛中常见有区间操作问题,这种类型的题目一般数据规模极大,无法用简单的模拟通过,因此本篇论文将讨论关于可以实现区间修改和区间查询的一部分算法的优越与否. ...
- 【bzoj3132】上帝造题的七分钟 二维树状数组区间修改区间查询
题目描述 “第一分钟,X说,要有矩阵,于是便有了一个里面写满了0的n×m矩阵. 第二分钟,L说,要能修改,于是便有了将左上角为(a,b),右下角为(c,d)的一个矩形区域内的全部数字加上一个值的操作. ...
- bzoj 3779 重组病毒 —— LCT+树状数组(区间修改+区间查询)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3779 RELEASE操作可以对应LCT的 access,RECENTER则是 makeroo ...
- 【bzoj3779】重组病毒 LCT+树上倍增+DFS序+树状数组区间修改区间查询
题目描述 给出一棵n个节点的树,每一个节点开始有一个互不相同的颜色,初始根节点为1. 定义一次感染为:将指定的一个节点到根的链上的所有节点染成一种新的颜色,代价为这条链上不同颜色的数目. 现有m次操作 ...
- 题解报告:CODE[VS] 1082 线段树练习3(区间修改+区间查询)
题目描述 Description 给你N个数,有两种操作: 1:给区间[a,b]的所有数增加X 2:询问区间[a,b]的数的和. 输入描述 Input Description 第一行一个正整数n,接下 ...
- A Simple Problem with Integers-POJ3468 区间修改+区间查询
题意: 给你n个数和2个操作,C操作是将一个区间内的每个数都加上k,Q操作是询问一个区间的和 链接:http://poj.org/problem?id=3468 思路: 线段树区间修改+区间查询 代码 ...
随机推荐
- 搭建本地pip源
搭建本地的pip源 开发环境部署机器的时候, 每次从网上下载pip包会很慢, 将需要的包和相关依赖下载到本地, 搭建一个本地源服务器. 基本都是安装多个包, 推荐使用文件的方式, 文件内容格式, 可以 ...
- 13 | 效率为王:脚本与数据的解耦 + Page Object模型
- Linux 中文件和文件夹获取 MySQL 权限(SELinux)
今天在 Linux 系统上移动 MySQL 的数据库目录 配置如下: /etc/my.cnf [mysqld]datadir=/home/mysqlsocket=/var/lib/mysql/mysq ...
- 【测试-测试心得】测试发现BUG后,怎么定位问题?
一.判断前后端 Safari中可以右键,选择“检查元素”,再选择“网络”同样可以抓取到http请求,如图 怎么区分是前端错误还是后端错误? 1.在开发者工具中,如果console中有报错,则表示前端代 ...
- HDU 5792:World is Exploding(树状数组求逆序对)
http://acm.hdu.edu.cn/showproblem.php?pid=5792 World is Exploding Problem Description Given a sequ ...
- 跟我学SpringCloud | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪
SpringCloud系列教程 | 第十一篇:使用Spring Cloud Sleuth和Zipkin进行分布式链路跟踪 Springboot: 2.1.6.RELEASE SpringCloud: ...
- Modbus RTU 通信应用案例
如何打开项目归档文件 例程中的TIA博途项目文件与STEP 7项目文件均为归档文件,需要按如下方式打开: TIA博途项目文件 1. 打开TIA博途软件,通过软件左下方“项目视图”按钮切换至项目视图: ...
- python的@修饰符
‘@’引用已有的函数,对下面的函数进行修饰.引用函数必须放在修饰函数的上面,引用函数的返回值,返回给被修饰的函数 一个简单的栗子: def funA(fn): print('A') # 输出A fn( ...
- 微信小程序开发--页面结构
一.微信小程序开发--页面文件组成 [page.name].js 页面逻辑文件,用于创建页面对象,以及处理页面生命周期控制和数据处理 [page.name].wxml wxml指的是Wei Xin M ...
- ASP.NET Core MVC 之模型(Model)
1.模型绑定 ASP.NET Core MVC 中的模型绑定将数据从HTTP请求映射到操作方法参数.参数既可以是简单类型,也可以是复杂类型.MVC 通过抽象绑定解决了这个问题. 2.使用模型绑定 当 ...