站外模版题,juruo紧急求助
  • 板块学术版
  • 楼主枫原千叶
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/6/1 22:50
  • 上次更新2024/6/2 10:13:42
查看原帖
站外模版题,juruo紧急求助
703487
枫原千叶楼主2024/6/1 22:50

原题网址:

https://acm.hdu.edu.cn/showproblem.php?pid=1166

我的代码:


using namespace std;

#define int long long
int test,n,a[120005],segtree[120005],cnt,tag[120005]; 
string s;

void init(){
	memset(segtree,0,sizeof segtree);
	memset(tag,0,sizeof tag);
	return;
}

void push_up(int rt){
	segtree[rt]=segtree[rt*2]+segtree[rt*2+1];
}

void build(int L,int R,int rt){
	tag[rt]=0;
	if(L==R){
		cin>>segtree[rt];
		return;
	}
	build(L,(L+R)/2,rt*2);
	build((L+R)/2+1,R,rt*2+1);
	push_up(rt);
	return;
}

void solve(int rt,int l,int r,int k){
	tag[rt]=tag[rt]+k;
	segtree[rt]=segtree[rt]+k*(r-l+1);
	return;
}

void push_down(int rt,int l,int r){
	int mid=(l+r)/2;
	solve(rt*2,l,mid,tag[rt]);
	solve(rt*2+1,mid+1,r,tag[rt]);
	tag[rt]=0;
	return;
}

void update(int nl,int nr,int l,int r,int rt,int k){
	if(nl<=l&&r<=nr){
		segtree[rt]+=k*(r-l+1);
		tag[rt]+=k;
		return;
	}
	push_down(rt,l,r);
	int mid=(l+r)/2;
	if(nl<=mid){
		update(nl,nr,l,mid,rt*2,k);
	}
	if(nr>mid){
		update(nl,nr,mid+1,r,rt*2+1,k);
	}
	push_up(rt);
}

int query(int q_x,int q_y,int l,int r,int rt){
    int res=0;
    if(q_x<=l&&r<=q_y){
    	return segtree[rt];
	}
    int mid=(l+r)/2;
    push_down(rt,l,r);
    if(q_x<=mid){
    	res+=query(q_x,q_y,l,mid,rt*2);
	}
    if(q_y>mid){
    	res+=query(q_x,q_y,mid+1,r,rt*2+1);
	}
    return res;
}

signed main(){
	ios::sync_with_stdio(0);
	cin>>test;
	while(test--){
		cout<<"Case "<<++cnt<<":"<<endl;
		cin>>n;
		init();
		build(1,n,1);
		while(cin>>s&&s[0]!='E'){
			int a,b;
			cin>>a>>b;
			if(s[0]=='Q'){
				cout<<query(a,b,1,n,1)<<endl;
			}else if(s[0]=='A'){
				update(a,a,1,n,1,b);
			}else if(s[0]=='S'){
				update(a,a,1,n,1,-b);
			}
		}
	}
	return 0;
} 

为什么样例过了,感觉逻辑也没问题,但是WA?

2024/6/1 22:50
加载中...