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 ...
随机推荐
- HDU 1286
欧拉函数 φ函数的值 通式:φ(x)=x(1-1/p1)(1-1/p2)(1-1/p3)(1-1/p4)…..(1-1/pn),其中p1, p2……pn为x的所有质因数,x是不为0的整数.φ(1)=1 ...
- 解析XML内容到User对象
users.xml <?xml version="1.0" encoding="UTF-8"?> <xml-root> <conn ...
- Vue之webpack的entry和output
一.文件结构 二.index.html <!DOCTYPE html> <html lang="en"> <head> <meta cha ...
- P1094 百钱白鸡
题目描述 公鸡5文钱一只,母鸡3文钱一只,小鸡3只一文钱,用100文钱买100只鸡,其中公鸡,母鸡,小鸡都必须要有,问公鸡,母鸡,小鸡要买多少只刚好凑足100文钱. 输入格式 无. 输出格式 输出所有 ...
- Java8 API学习2 - java.lang.CharSequence, java.lang.String
CharSequence public interface CharSequence 字符序列接口, 实现此接口的非抽象类有String, StringBuffer, StringBuilder. 从 ...
- P1021 整数奇偶排序
整数奇偶排序 题目出处:<信息学奥赛一本通>第二章上机练习6,略有改编 题目描述 告诉你包含 \(n\) 个数的数组 \(a\) ,你需要把他们按照"奇数排前面,偶数排后面:奇数 ...
- Java语言中使用OpenMP
从去年年中,开始学习Java,主要是维护公司用Java编写的服务器软件.目前,该服务器软件遇到一个问题,在下载大文件时,如果同时下载的用户很多, 服务器软件工作会出现异常,有的用户无法下载.服务器硬件 ...
- H3C配置BPDU的生成和传递
- python写的有声小说爬虫
querybook.py from bs4 import BeautifulSoup from lxml import html import xml import requests import s ...
- 1134 最长上升子序列 (序列型 DP)
思路: 由于一般的动态规划时间复杂度是O(n^2)(哈哈哈哈 第一次用的就是这个!)用在这里由于n最大为50000 所以会超时 到这里我们可以用一个数组来动态维护这个最长上升的子序列,将你要输入的子序 ...