P3372 WA10pts求调
查看原帖
P3372 WA10pts求调
226629
Starfog楼主2023/10/7 16:38

除了第一个点和样例能过,其他都过不了QwQ

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int MAXN=100001;
struct node{
	int l;
	int r;
	ll dat;
	ll tag;
}st[MAXN+1];
ll a[MAXN];
void build(int node_num,int l,int r)
{
	st[node_num].l=l;
	st[node_num].r=r;
	st[node_num].tag=0;
	if(l==r)
	{
		st[node_num].dat=a[l];
		return;
	}
	build(node_num*2,l,(l+r)/2);
	build(node_num*2+1,(l+r)/2+1,r);
	st[node_num].dat=st[node_num*2].dat+st[node_num*2+1].dat;
}
void push_down(int node_num)
{
	if(st[node_num].tag==0) return;
	int mid=(st[node_num].l+st[node_num].r)/2;
	st[2*node_num].dat+=st[node_num].tag*(mid-st[node_num].l+1);
	st[2*node_num].tag+=st[node_num].tag;
	st[2*node_num+1].dat+=st[node_num].tag*(mid-st[node_num].r-mid);
	st[2*node_num+1].tag+=st[node_num].tag;
	st[node_num].tag=0;
}
ll ask(int node_num,int tar_l,int tar_r)
{
	
	int mid=(st[node_num].l+st[node_num].r)/2;
	if(st[node_num].l>=tar_l&&st[node_num].r<=tar_r)
	{
		return st[node_num].dat;
	}
	push_down(node_num);
	ll res=0;
	if(mid>=tar_l)
		res+=ask(node_num*2,tar_l,tar_r);
	if(mid<tar_r)
		res+=ask(node_num*2+1,tar_l,tar_r);
	return res;
}
void add(int node_num,int tar_l,int tar_r,ll val)
{
	if(st[node_num].l>=tar_l&&st[node_num].r<=tar_r)
	{
		st[node_num].dat+=val*(st[node_num].r-st[node_num].l+1);
		st[node_num].tag+=val;
		return;
	}
	int mid=(st[node_num].l+st[node_num].r)/2;
	push_down(node_num);
	if(mid>=tar_l)
		add(node_num*2,tar_l,tar_r,val);
	if(mid<tar_r)
		add(node_num*2+1,tar_l,tar_r,val);
	st[node_num].dat=st[node_num*2].dat+st[node_num*2+1].dat;
}
int main()
{
	int m,n;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		cin>>a[i];
    build(1,1,n);
    while(m--)
    {
    	ll x,y,k,a1;
        scanf("%d",&a1);
        if(a1==1)
        {
            scanf("%lld%lld%lld",&x,&y,&k);
            add(1,x,y,k);
		}
		else
		{
            scanf("%lld%lld",&x,&y);
            printf("%lld\n",ask(1,x,y));
		}
    }
	return 0;
}
2023/10/7 16:38
加载中...