RE怎么我了
查看原帖
RE怎么我了
540177
wyf_sinon楼主2023/7/8 16:20

蒟蒻N开大十倍还RE1~4 没看出来问题

#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=1e6;
LL n,m;
LL data[N+10],a[N+10];
void read(LL &a)
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
    a=x*f;
}
void write(LL x) 
{
    if(x<0) {putchar('-'),x=-x;}
    if(x>9) write(x/10);
    putchar(x%10+'0');
}
struct Segment_Tree
{
	int l,r;
	LL sum,add;
	#define l(x) tree[x].l
	#define r(x) tree[x].r
	#define sum(x) tree[x].sum
	#define add(x) tree[x].add
}tree[N*4+10];
void update(LL pos)
{
	sum(pos)=sum(pos*2)+sum(pos*2+1);
	return;
}
void build(LL pos,LL l,LL r)
{
	l(pos)=l;r(pos)=r;
	if(l==r) { sum(pos)=a[l];return; }
	int mid=( l+r )>>1;
	build( pos*2,l,mid);
	build( pos*2+1,mid+1,r);
	update(pos);
	return;
}
void push_down(LL p)
{
	if(add(p))
	{
		sum(p*2) += add(p)*(r(p*2)-l(p*2)+1);
		sum(p*2+1) += add(p)*(r(p*2+1)-l(p*2+1)+1);
		add(p*2) += add(p);
		add(p*2+1) += add(p);
		add(p)=0;
	}
	return;
}
void ChangeAdd(LL p,LL l,LL r,LL d)
{
	if(l<=l(p)&&r>=r(p))
	{
		sum(p)+=(LL)d*(r(p)-l(p)+1);
		add(p)+=d;
		return;
	}
	push_down(p);
	int mid=(l(p)+r(p))>>1;
	if(l<=mid) ChangeAdd(p*2,l,r,d);
	if(r>mid) ChangeAdd(p*2+1,l,r,d);
	update(p);
}
LL query(LL p,LL l,LL r)
{
	if(l<=l(p)&&r>=r(p)) return sum(p);// be totally covered
	push_down(p);
	int mid=(l(p)+r(p))>>1;
	LL val=0;
	if(l<=mid) val+=query(p*2,l,r);// left_child.search
	if(r>mid) val+=query(p*2+1,l,r);// right_child.search
	return val;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) read(data[i]);
	for(int i=1;i<=n;i++) a[i]=data[i]-data[i-1];
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		LL opt;
		read(opt);
		if(opt==1)
		{
			LL l,r,K,D;
			read(l);read(r);read(K);read(D);
			ChangeAdd(1,l,l,K);
			ChangeAdd(1,l+1,r,D);
			ChangeAdd(1,r+1,r+1,-(K+D*(r-l)));
		}
		else
		{
			LL n;
			read(n);
			write(query(1,1,n));
			printf("\n");
		}
	}	
}
2023/7/8 16:20
加载中...