19级新生进班考核、18级老生天梯考核--弹药数量
作者:互联网
线段树最基础的单点修改和区间查询,昨天就该A,今天一看初始化的位置写错了,就不该写这循环输入,完全为了保险起见,结果脑子一糊,啥都不知道了。
#include<bits/stdc++.h>
using namespace std;
int t,n,a,b[200005],p,q,sum;
//自己手写的一个线段树的操作,还是蛮有成就感的!!!
void dfs(int x,int l,int r,int o,int k){
if(x>=l&&x<=r)b[k]+=o;
if(l==r)return;
int mid=(l+r)/2;
if(x<=mid)dfs(x,l,mid,o,k*2);
else dfs(x,mid+1,r,o,k*2+1);
}
void gfs(int x,int y,int l,int r,int k){
if(x==l&&y==r){
sum+=b[k];
return;
}
int mid=(l+r)/2;
if(x>mid)gfs(x,y,mid+1,r,k*2+1);
else if(y<=mid)gfs(x,y,l,mid,k*2);
else{
gfs(x,mid,l,mid,k*2);
gfs(mid+1,y,mid+1,r,k*2+1);
}
}
char s[10];
int main(){
while(~scanf("%d",&t)){
int vis=1;
while(t--){
memset(b,0,sizeof(b));
printf("Case %d:\n",vis++);
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&a);
dfs(i,1,n,a,1);
}
while(scanf("%s",s)){
if(s[0]=='E')break;
else{
scanf("%d %d",&p,&q);
if(s[0]=='S'){
dfs(p,1,n,-q,1);
}
else if(s[0]=='A'){
dfs(p,1,n,q,1);
}
else{
sum=0;
gfs(p,q,1,n,1);
printf("%d\n",sum);
}
}
}
}
}
return 0;
}
KID_E
发布了2 篇原创文章 · 获赞 0 · 访问量 20
私信
关注
标签:私信,19,线段,int,考核,级新生,文章 来源: https://blog.csdn.net/KID_E/article/details/104522165