线段树1 奇特问题
  • 板块灌水区
  • 楼主zyp123456
  • 当前回复21
  • 已保存回复21
  • 发布时间2021/6/17 22:48
  • 上次更新2023/11/4 21:47:04
查看原帖
线段树1 奇特问题
233260
zyp123456楼主2021/6/17 22:48
#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void rd(T &s){
	T f=1;char ch=getchar();s=0;
	while(!isdigit(ch))f=(ch=='-')?-1:1,ch=getchar();
	while(isdigit(ch))s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
	s*=f;
}
typedef long long ll;
const int M=100010;
int n,m;
ll tree[M<<2],add[M<<2],a[M];
#define ls k<<1
#define rs k<<1|1
#define mid (l+r)/2
inline void build(int k,int l,int r){
	if(l==r){
		tree[k]=a[l];
		return;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	tree[k]=tree[ls]+tree[rs];
}
inline void pushdown(int k,int l,int r){
	if(!add[k])return;
	tree[ls]+=(mid-l+1)*add[k];
	tree[rs]+=(r-mid)*add[k];
	add[ls]+=add[k];
	add[rs]+=add[k];
	add[k]=0;
}
inline void update(int k,int l,int r,int x,int y,int v){
	if(x<=l&&r<=y){
		tree[k]+=(r-l+1)*v;
		add[k]+=v;
		return; 
	}
	pushdown(k,l,r);
	if(x<=mid)update(ls,l,mid,x,y,v);
	if(y>mid)update(rs,mid+1,r,x,y,v);
	tree[k]=tree[ls]+tree[rs];
}
inline ll query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)return tree[k];
	pushdown(k,l,r);
	ll ans=0;
	if(x<=mid)ans+=query(ls,l,mid,x,y);
	if(y>mid)ans+=query(rs,mid+1,r,x,y);
	return ans;
}
int main(){
	rd(n),rd(m);
	for(int i=1;i<=n;i++)rd(a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op,x,y,v;
		rd(op),rd(x),rd(y);
		if(op==1){
			rd(v);
			update(1,1,n,x,y,v);
		}
		else{
			printf("%lld\n",query(1,1,n,x,y));
		}
	}
	return 0;
}

#include<bits/stdc++.h>
using namespace std;
template<typename T>inline void rd(T &s){
	T f=1;char ch=getchar();s=0;
	while(!isdigit(ch))f=(ch=='-')?-1:1,ch=getchar();
	while(isdigit(ch))s=(s<<1)+(s<<3)+ch-'0',ch=getchar();
	s*=f;
}
typedef long long ll;
const int M=100010;
int n,m;
ll tree[M<<2],add[M<<2],a[M];
#define ls k<<1
#define rs k<<1|1
#define mid l+r>>1
inline void build(int k,int l,int r){
	if(l==r){
		tree[k]=a[l];
		return;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	tree[k]=tree[ls]+tree[rs];
}
inline void pushdown(int k,int l,int r){
	if(!add[k])return;
	tree[ls]+=(mid-l+1)*add[k];
	tree[rs]+=(r-mid)*add[k];
	add[ls]+=add[k];
	add[rs]+=add[k];
	add[k]=0;
}
inline void update(int k,int l,int r,int x,int y,int v){
	if(x<=l&&r<=y){
		tree[k]+=(r-l+1)*v;
		add[k]+=v;
		return; 
	}
	pushdown(k,l,r);
	if(x<=mid)update(ls,l,mid,x,y,v);
	if(y>mid)update(rs,mid+1,r,x,y,v);
	tree[k]=tree[ls]+tree[rs];
}
inline ll query(int k,int l,int r,int x,int y){
	if(x<=l&&r<=y)return tree[k];
	pushdown(k,l,r);
	ll ans=0;
	if(x<=mid)ans+=query(ls,l,mid,x,y);
	if(y>mid)ans+=query(rs,mid+1,r,x,y);
	return ans;
}
int main(){
	rd(n),rd(m);
	for(int i=1;i<=n;i++)rd(a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op,x,y,v;
		rd(op),rd(x),rd(y);
		if(op==1){
			rd(v);
			update(1,1,n,x,y,v);
		}
		else{
			printf("%lld\n",query(1,1,n,x,y));
		}
	}
	return 0;
}

为何将 #define mid l+r>>1 改为 #define mid (l+r)/2 代码就对了呢?

2021/6/17 22:48
加载中...