两份几乎一模一样的代码,为什么一个AC一个WA
查看原帖
两份几乎一模一样的代码,为什么一个AC一个WA
418419
ko_no_lzx_da楼主2022/5/13 20:50
#include<iostream>
#include<cmath>
#include<map>
#include<cstring>
#include<string>
#include<queue>
#include<algorithm>
#include<vector>
#include<stack>
using namespace std;
struct node{
	int sum;
	int l,r;
	int lan;
}tree[10000000];
void down(int n){
	tree[n*2].lan+=tree[n].lan;
	tree[n*2+1].lan+=tree[n].lan;
	tree[n*2].sum=tree[n].lan*(tree[n*2].r-tree[n*2].l+1);
	tree[n*2+1].sum=tree[n].lan*(tree[n*2+1].r-tree[n*2+1].l+1);
	tree[n].lan=0;
}
void build(int l,int r,int n){
	tree[n].l=l,tree[n].r=r;
	if(l==r){
		cin >>tree[n].sum;
		return;
	}
	int mid=(l+r)/2;
	build(l,mid,n*2);
	build(mid+1,r,n*2+1);
	tree[n].sum=tree[n*2+1].sum+tree[n*2].sum;
	return;
}
void add(int l,int r,int n,int L,int R,int v){
	if(L<=l&&r<=R){
		tree[n].sum+=v*(r-l+1);
		tree[n].lan+=v;
		return;
	}
	down(n);
	int mid=(l+r)/2;
	if(L<=mid)add(l,mid,n*2,L,R,v);
	if(R>mid)add(mid+1,r,n*2+1,L,R,v);
	tree[n].sum=tree[n*2+1].sum+tree[n*2].sum;
	return;
}
int ans;
void find(int l,int r,int n,int L,int R){
	if(L<=l&&r<=R){
		ans+=tree[n].sum;
		return;
	}
	down(n);
	int mid=(l+r)/2;
	if(L<=mid)find(l,mid,n*2,L,R);
	if(R>mid)find(mid+1,r,n*2+1,L,R);
	tree[n].sum=tree[n*2+1].sum+tree[n*2].sum;
	return;
}
int n,m;
int main(){
	cin >>n>>m;
	build(1,n,1);
	for(int i=1;i<=m;i++){
		int t,ll,rr,k;
		cin >>ll>>rr>>t;
		if(t==1){
			cin >>k;
			add(1,n,1,ll,rr,k);
		}
		if(t==2){
			find(1,n,1,ll,rr);
			cout <<ans<<endl;
			ans=0;
		}
	}
	return 0;
}

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<queue>
#include<cmath>
#include<algorithm>
using namespace std;
struct node{
	long long l,r;
	long long sum;
	long long lan;
}tree[10000000];
long long L,R;
void on(long long n){
	tree[n].sum=tree[n*2].sum+tree[n*2+1].sum;
}
void build(long long l,long long r,long long n){
	tree[n].l=l,tree[n].r=r;
	if(l==r){
		cin >>tree[n].sum;
		return;
	}
	long long mid=(l+r)/2;
	build(l,mid,n*2);
	build(mid+1,r,n*2+1);
	on(n);
	return;
}
void down(long long n){
	tree[n*2].lan+=tree[n].lan;
	tree[n*2+1].lan+=tree[n].lan;
	tree[n*2].sum+=(tree[n*2].r-tree[n*2].l+1)*tree[n].lan;
	tree[n*2+1].sum+=(tree[n*2+1].r-tree[n*2+1].l+1)*tree[n].lan;
	tree[n].lan=0;
	return;
}
void add(long long l,long long r,long long n,long long v){
	if(L<=l&&r<=R){
		tree[n].lan+=v;
		tree[n].sum+=(r-l+1)*v;
		return;
	}
	down(n);
	long long mid=(l+r)/2;
	if(L<=mid)add(l,mid,n*2,v);
	if(R>mid)add(mid+1,r,n*2+1,v);
	on(n);
	return;
}
long long ans=0;
void find(long long l,long long r,long long n){
	if(L<=l&&r<=R){
		ans+=tree[n].sum;
		return;
	}
	down(n);
	long long mid=(l+r)/2;
	//cout <<l<<" "<<r<<endl;
	if(L<=mid)find(l,mid,n*2);
	if(R>mid)find(mid+1,r,n*2+1);
	on(n);
}
int main(){
	long long n,m;
	cin >>n>>m;
	build(1,n,1);
	for(long long i=1;i<=m;i++){
		long long t,k;
		ans=0;
		cin >>t>>L>>R;
		if(t==1){
			cin >>k;
			add(1,n,1,k);
		}else{
			find(1,n,1);
			cout <<ans<<endl;
		}
	}
	return 0;
}

2022/5/13 20:50
加载中...