咋卡s了
查看原帖
咋卡s了
1094797
Myl100313楼主2025/2/3 21:59

代码如下:

#include<bits/stdc++.h>
using namespace std;
const int inf=2147483647;
int n,m,a[114514];
int opt,x,y,k;
struct node
{
	int left,right;
	int data;
	int add;
};
node xianduan_tree[114514*4];
void spread(int p)
{
	if(xianduan_tree[p].add)
	{
		xianduan_tree[p*2].data+=xianduan_tree[p].add*(xianduan_tree[p*2].right-xianduan_tree[p*2].left+1);
		xianduan_tree[p*2+1].data+=xianduan_tree[p].add*(xianduan_tree[p*2+1].right-xianduan_tree[p*2+1].left+1);
		xianduan_tree[p*2].add+=xianduan_tree[p].data;
		xianduan_tree[p*2+1].add+=xianduan_tree[p].data;
		xianduan_tree[p].add=0;
	}
}
void build(int p,int l,int r)
{
	xianduan_tree[p].left=l;
	xianduan_tree[p].right=r;
	if(l==r) xianduan_tree[p].data=a[l];
	  else
	  {
	  	int mid=(l+r)>>1;
	  	build(p*2,l,mid);
	  	build(p*2+1,mid+1,r);
	  	xianduan_tree[p].data=xianduan_tree[p*2].data+xianduan_tree[p*2+1].data;
	  }
}
void change_data(int p,int l,int r,int d)
{
	if(l<=xianduan_tree[p].left&&r>=xianduan_tree[p].right)
	{
	  xianduan_tree[p].data+=(long long) d*(xianduan_tree[p].right-xianduan_tree[p].left+1);
	  xianduan_tree[p].add+=d;
    }
    else
    {
    	spread(p);
    	int mid=(xianduan_tree[p].left+xianduan_tree[p].right)>>1;
    	if(l<=mid) change_data(p*2,l,r,d);
    	if(r>mid) change_data(p*2+1,l,r,d);
    	xianduan_tree[p].data=xianduan_tree[p*2].data+xianduan_tree[p*2].data;
	}
}
int ask(int p,int l,int r)
{
	if(l<=xianduan_tree[p].left&&r>=xianduan_tree[p].right) return xianduan_tree[p].data;
	spread(p);
	int mid=(xianduan_tree[p].left+xianduan_tree[p].right)>>1;
	int ans=0;
	if(l<=mid) ans=ans+ask(p*2,l,mid);
	if(r>mid) ans=ans+ask(p*2,mid+1,r);
	return ans;
}
int main()
{
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
	  scanf("%d",&a[i]);
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d%d",&opt,&x,&y);
		if(opt==1)
		{
			scanf("%d",&k);
			change_data(1,x,y,k);
		}
		if(opt==2)
		  cout<<ask(1,x,y)<<endl;
	}
	return 0;
}

输到 22 xx yy时代码卡S, Why?

2025/2/3 21:59
加载中...