cogs 1316. 数列操作B 区间修改 单点查询
1316. 数列操作B
★★ 输入文件:shulieb.in 输出文件:shulieb.out 简单对比
时间限制:1 s 内存限制:128 MB
【问题描述】
假设有一个大小为 n(n≤100000) 整数数列 A,支持如下两种操作:
1. 将 Ai,Ai+1,…,Aj 的值均增加 d
2. 查询 Ai 的值
根据操作要求进行正确操作并输出结果。
【输入格式】
输入文件第一行一个整数 n,
第二行为 n 个整数,表示数列 A 中各项的初始值。
第三行为一个整数 m ,表示操作数。下接 m 行,每行描述一个操作,有如下两种情况:
ADD i j d(将 Ai,Ai+1,…,Aj(1≤i,j≤n) 的值均增加一个整数 d)
QUERY s(表示查询 As 的值)
【输出格式】
对于每一个询问,输出查询到的结果。
【样例输入】
4
1 4 2 3
3
QUERY 1
ADD 2 2 50
QUERY 2
【样例输出】
1
54 做法一:用树状数组存储差分数组
代码如下
#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#define maxn 100005
using namespace std;
int n,m;
int a[maxn],sum[maxn];
int lowbit(int x){ return x&(-x); }
#define ll long long
void Add(int x,int d){//存的是差分数组
while(x<=n){sum[x]+=d;x+=lowbit(x); }
}
long long Sum(int x){
long long ret=;
while(x>){ ret+=sum[x];x-=lowbit(x);}
return ret;
}
int main()
{
freopen("shulieb.in","r",stdin);freopen("shulieb.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=;i<=m;i++){
string s;cin>>s;
if(s[]=='Q'){
int x;scanf("%d",&x);
printf("%lld\n",Sum(x)+a[x]);
}
else{
int l,r,x;scanf("%d%d%d",&l,&r,&x);
Add(l,x);Add(r+,-x);
} } return ;
}
2.线段树打标记!
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
#define ll long long
int a[maxn];
int n,m;
struct SegmentTree{
int l,r;
long long dat;
int 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 pos){
if(l==r) return t[p].dat;
int mid=(l+r)>>;
Pushdown(p,l,r,mid);
if(pos<=mid) return Get(p*,l,mid,pos);
else return Get(p*+,mid+,r,pos);
}
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("shulieb.in","r",stdin);freopen("shulieb.out","w",stdout);
scanf("%d",&n);
for(int i=;i<=n;i++) scanf("%d",&a[i]);
scanf("%d",&m);
for(int i=;i<=m;i++){
string s;cin>>s;
if(s[]=='Q'){
int x;scanf("%d",&x);
printf("%lld\n",Get(,,n,x)+a[x]);
}
else{
int s,t,d;scanf("%d%d%d",&s,&t,&d);
Add(,,n,s,t,d);
}
} return ;
}
cogs 1316. 数列操作B 区间修改 单点查询的更多相关文章
- cogs 1317. 数列操作C 区间修改 区间查询
1317. 数列操作C ★★★ 输入文件:shuliec.in 输出文件:shuliec.out 简单对比时间限制:1 s 内存限制:128 MB [题目描述] 假设有一个长度为 n( ...
- HDU 1556 BIT区间修改+单点查询(fread读入优化)
BIT区间修改+单点查询 [题目链接]BIT区间修改+单点查询 &题解: BIT区间修改+单点查询和求和的bit是一模一样的(包括add,sum) 只不过是你使用函数的方式不一样: 使用区间的 ...
- 【树状数组区间修改单点查询+分组】HDU 4267 A Simple Problem with Integers
http://acm.hdu.edu.cn/showproblem.php?pid=4267 [思路] 树状数组的区间修改:在区间[a, b]内更新+x就在a的位置+x. 然后在b+1的位置-x 树状 ...
- BZOJ4999:This Problem Is Too Simple!(DFS序&树上差分&线段树动态开点:区间修改单点查询)
Description 给您一颗树,每个节点有个初始值. 现在支持以下两种操作: 1. C i x(0<=x<2^31) 表示将i节点的值改为x. 2. Q i j x(0<=x&l ...
- hdu-1556 Color the ball---树状数组+区间修改单点查询
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=1556 题目大意: Problem Description N个气球排成一排,从左到右依次编号为1,2 ...
- D - Mayor's posters POJ - 2528 离散化+线段树 区间修改单点查询
题意 贴海报 最后可以看到多少海报 思路 :离散化大区间 其中[1,4] [5,6]不能离散化成[1,2] [2,3]因为这样破坏了他们的非相邻关系 每次离散化区间 [x,y]时 把y+1点也加入 ...
- POJ2155 Matrix(二维树状数组||区间修改单点查询)
Given an N*N matrix A, whose elements are either 0 or 1. A[i, j] means the number in the i-th row an ...
- 【树状数组区间修改单点查询】HDU 4031 Attack
http://acm.hdu.edu.cn/showproblem.php?pid=4031 [题意] 有一个长为n的长城,进行q次操作,d为防护罩的冷却时间,Attack表示区间a-b的墙将在1秒后 ...
- HDU 5861 Road(线段树 区间修改 单点查询)
Road Time Limit: 12000/6000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submi ...
随机推荐
- H3C DR和BDR选举
- React---钩子函数
钩子函数的状态有4个阶段: <p>1.初始化阶段 (componentWillMount() || componentDidMount()) </p> ...
- 前端小白-----ES6之字符串模板
前言:只要坚持就会胜利--Coldfront-小白菜 既是总结也是一种分享 分享内容:ES6 字符串模板 案例1:var Musics=[{music:"六月的雨",singer: ...
- mysql(8.0.16)安装及使用注意事项
1.安装地址:https://dev.mysql.com/downloads/mysql/ 2.在安装路径:D:\mysql\mysql-8.0.16-winx64(安装时的路径,可自己选择)下面新建 ...
- 【52.55%】【BZOJ 4520】K远点对
Time Limit: 30 Sec Memory Limit: 512 MB Submit: 588 Solved: 309 [Submit][Status][Discuss] Descript ...
- [板子]快速幂&矩阵快速幂
不会的来这看:https://www.cnblogs.com/CXCXCXC/p/4641812.html 简单的一说:当转换为二进制的时候有位运算这种黑科技,&相当于%2判断奇偶性. x&a ...
- http://mirror2.openwrt.org/sources/
http://mirror2.openwrt.org/sources/ Index of /sources/ ../ 1.0.4.3.arm 22-Dec-2008 20:29 93996 2.13. ...
- 前端工具--利用Adblock Plus阻止js执行
今天遇到个问题:需要阻止页面某个js的运行 效果达到
- 重置Rhapsody超级管理员administrator的密码
Rhapsody的安装信息说明 rhapsody 默认初始安装的用户名为 Administrator 密码为 rhapsody 配置文件rhapsody.properties位于位于{安装目录}\Rh ...
- MYSQL调优实战
一:基础数据准备 DROP TABLE IF EXISTS `tbl_user`; CREATE TABLE `tbl_user` ( `id` ) NOT NULL AUTO_INCREMENT, ...