其他分享
首页 > 其他分享> > 19级新生进班考核、18级老生天梯考核--弹药数量

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