洛谷——P2068 统计和
阅读原文时间:2023年07月12日阅读:1

P2068 统计和

给定一个长度为n(n<=100000),初始值都为0的序列,x(x<=10000)次的修改某些位置上的数字,每次加上一个数,然后提出y (y<=10000)个问题,求每段区间的和。时间限制1秒。

输入格式:

第一行1个数,表示序列的长度n

第二行1个数,表示操作的次数w

后面依次是w行,分别表示加入和询问操作

其中,加入用x表示,询问用y表示

x的格式为"x a b" 表示在序列a的位置加上b

y的格式为"y a b" 表示询问a到b区间的加和

输出格式:

每行一个数,分别是每次询问的结果

输入样例#1:

5
4
x 3 8
y 1 3
x 4 9
y 3 4

输出样例#1:

8
17

线段树单点修改区间查询

#include
#include
#include
#include
#include
#define N 410000
using namespace std;
char ch;
int n,m,x,y,ans;
int read()
{
,f=; char ch=getchar();
; ch=getchar();}
+ch-'; ch=getchar();}
return x*f;
}
struct Tree
{
int l,r,w,f;
}tree[N];
void build(int k,int l,int r)
{
tree[k].l=l,tree[k].r=r;
if(tree[k].l==tree[k].r)
{
tree[k].w=;
return ;
}
;
build(k<<,l,m); build(k<<|,m+,r); } void change_point(int k) { if(tree[k].l==tree[k].r) { tree[k].w+=y; return ; } ; ); |); tree[k].w=tree[k<<].w+tree[k<<|].w; } void ask_interval(int k) { if(tree[k].l>=x&&tree[k].r<=y) { ans+=tree[k].w; return ; } ; ); |); } int main() { n=read(),m=read(); build(,,n); while(m--) { ans=; cin>>ch;x=read(),y=read();
if(ch=='x')
change_point();
else
{
ask_interval();
printf("%d\n",ans);
}
}
;
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章