为什么把define 里面的(l+r)/2改为l+r>>1为出现玄学错误
查看原帖
为什么把define 里面的(l+r)/2改为l+r>>1为出现玄学错误
363669
hwwqy楼主2023/8/24 20:06
#include<bits/stdc++.h>
#define int long long
#define ls x<<1
#define rs x<<1|1
#define mid (l+r)/2
#define MAXN 10010
using namespace std;
int n,m;
int sum[MAXN<<2],tag[MAXN<<2],a[MAXN];
void init()
{
	memset(sum,0,sizeof(sum));
	memset(a,0,sizeof(a));
	memset(tag,0,sizeof(tag));
}
void update(int x,int l,int r)
{
	if(l-r)
	{
		sum[x]=sum[ls]+sum[rs];
	}		
}
void pushdown(int x,int l,int r)
{
	if(tag[x]==0)return;
	sum[ls]+=tag[x]*(mid-l+1);
	sum[rs]+=tag[x]*(r-mid);
	tag[ls]+=tag[x];
	tag[rs]+=tag[x];
	tag[x]=0;
	return;
}
void build(int x,int l,int r)
{
	//cout<<x<<" "<<l<<" "<<r<<" "<<(mid)<<endl;
	if(l==r)
	{
		sum[x]=a[l];
		return;
	}
	build(ls,l,mid);
	build(rs,mid+1,r);
	update(x,l,r);
	return;
}

void add(int x,int l,int r,int ql,int qr,int k)
{
	if(ql<=l&&r<=qr)
	{
		sum[x]+=(r-l+1)*k;
		tag[x]+=k;
		return;
	}
	pushdown(x,l,r);
	int res=0;
	if(mid>=ql)add(ls,l,mid,ql,qr,k);
	if(mid<qr)add(rs,mid+1,r,ql,qr,k);
	update(x,l,r);
}
int query(int x,int l,int r,int ql,int qr)
{
	//cout<<x<<" "<<l<<" "<<r<<endl;
	if(ql<=l&&r<=qr)
	{
		return  sum[x];
	}
	pushdown(x,l,r);
	int res=0;
	if(mid>=ql)res+=query(ls,l,mid,ql,qr);
	if(mid<qr)res+=query(rs,mid+1,r,ql,qr);
	return res;
}
inline int read()
{
	int f=1,x=0;
	char c=getchar();
	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
	while(c=='-') f=-f,c=getchar();
	while(c>='0'&&c<='9') x=(x<<3)+(x<<1)+(c^48),c=getchar();
	return f*x;
}
signed main()
{
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	cout<<sum[1]<<endl;
	while(m--)
	{
		int type=read(),x=read(),y=read(),k;
		if(type==1) k=read(),add(1,1,n,x,y,k);
		else printf("%lld\n",query(1,1,n,x,y));
	}
	return 0;
}
2023/8/24 20:06
加载中...