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 思路: 线段树区间修改+区间查询 代码 ...
随机推荐
- 使用SQL行转列函数pivot遇到的问题
背景:对投票的结果按照单位进行汇总统计,数据库中表记录的各个账号对各个选项的投票记录.马上想到一个解决方案,先根据单位和选项进行Group By,然后再行转列得出单位对各个选项的投票情况. with ...
- 我把代码开源、托管到了GitHub、码云
前言 学习了那么多知识点,写了那么多代码,一直都没有时间整理,之前都是新学一个知识点就在同一个工程项目中进行实践测试,导致这个工程越来越臃肿.越来越乱,连我自己都快看不懂了... 这段时间整理了部分代 ...
- 快速搭建 Windows Kubernetes
背景 接上一篇 Windows 应用容器 后,想要快速且便利的部署与管理它们,可以借助容器编排工具.对于 Windows 容器,在今天 Service Fabric 会是个更为成熟的选择,在业界有更多 ...
- 微信小程序 CSS border-radius元素 overflow:hidden失效问题 iPhone ios 苹果兼容问题 伪类元素
同事找我解决一个问题 说安卓圆角没问题 苹果上失效了 我一看 其实就是没做兼容上图给你们看看 有没有看出来 其实就是父级设置圆角属性失效 父元素使用border-radius和overflow:hid ...
- python 微信红包生成器
#红包生成思路#200 块钱 10个红包#0-200 的一个轴,随机取9个点,分成10段, 每一段的值表示一个红包的大小 #把输入的 money值 * 100 拿到的数值就是分, 不用再考虑单位是元的 ...
- Linux 操作系统及其组成,shell命令
Linux 操作系统及其组成 操作系统的作用 操作系统(OS)是管理计算机硬件与软件资源的计算机程序,同时也是计算机系统的内核与基石.操作系统需要处理如管理与配置内存.决定系统资源供需的优先次序.控制 ...
- .Net Core 防止跨站点请求伪造
一.在From 表单中生成 antiforgery 令牌 1. ASP.NET Core MVC 和 Razor 页模板中的窗体的所有生成 antiforgery 令牌,唯一且不可预测.服务器先发送到 ...
- nexus私服快速update index方法
简单搭好nexus私服后,做好基本的配置. 稍微麻烦点的就是让其更新Jar索引文件.如果有耐心的话,完全可以通过在线更新索引的方式来做,但所消耗的时间较长,让人误以为出错了,不知所措. 下面介绍一种简 ...
- JAVA跳出指定For循环
1. 问题描述 当有多个for循环的时候,如何跳出最外层循环? 2. 解决方案 2.1 正常单个for循环 package com.example.demo; public class TestFor ...
- BAT的人都是怎么学习的
不知道你发现没,在技术领域走在前列的人,基本都符合一个条件:保持对新技术的敏感度,还能定期更新自己的技能储备. 要做到这一点,最高效的办法就是直接跟 BAT 等一线大厂取经.说白了,平台足够大,就有更 ...