全TLE了是什么个情况
查看原帖
全TLE了是什么个情况
817825
linminmohan楼主2024/10/25 01:39
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define il inline

const int maxn=1e5+5;
int a[maxn], tr[maxn<<2], lazy[maxn<<2];
int n, m, t, b, c, d;
il int read()
{
	int num=0, f=1;
	char c=getchar();
	while(c<'0'||c>'9') {if(c=='-') f=-1, c=getchar();}
	while(c>='0'&&c<='9') {num=(num<<3)+(num<<1)+(c^48), c=getchar();}
	return num*f;
} 
il void build(int fa,int l,int r)
{
	if(l==r)
	{
	    tr[fa]=a[l];
		return;	
	}
	int mid=(l+r)>>1;
	build(fa<<1,l,mid);
	build(fa<<1|1,mid+1,r);
	tr[fa]=tr[fa<<1]+tr[fa<<1|1];
}
il void push_down(int fa,int l,int r)
{
	int mid=(l+r)>>1;
	tr[fa<<1]+=lazy[fa]*(mid-l+1);
	lazy[fa<<1]+=lazy[fa];
	tr[fa<<1|1]+=lazy[fa]*(r-mid);
	lazy[fa<<1|1]+=lazy[fa];
	lazy[fa]=0;
}
int query(int ql,int qr,int fa,int l,int r)
{
	int ans=0;
	if(ql<=l&&qr>=r) return tr[fa];
	int mid=(l+r)>>1;
	push_down(fa,l,r);
	if(ql<=mid) ans+=query(ql,qr,fa<<1,l,mid);
	if(qr>mid) ans+=query(ql,qr,fa<<1|1,mid+1,r);
	return ans;
}
il void chang(int ql,int qr,int fa,int l,int r,int sum)
{
	if(ql<=l&&qr>=r)
	{
		lazy[fa]+=sum;
	    tr[fa]+=sum*(r-l+1);
		return;
	}
	push_down(fa,l,r);
	int mid=(l+r)>>1;
	if(ql<=mid) chang(ql,qr,fa<<1,l,mid,sum);
	if(qr>mid) chang(ql,qr,fa<<1|1,mid+1,r,sum);
	tr[fa]=tr[fa<<1]+tr[fa<<1|1];
}
signed main()
{
	n=read(), m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	while(m--)
	{
		t=read();
		if(t==1)
		{
			b=read(), c=read(), d=read();
			chang(b,c,1,1,n,d);
		}
		if(t==2)
		{
			b=read(), c=read();
			printf("%lld\n",query(b,c,1,1,n));
		}
	}
	return 0;
} 
2024/10/25 01:39
加载中...