刚学OI $10^{-998244353}$ms,线段树WA求助
查看原帖
刚学OI $10^{-998244353}$ms,线段树WA求助
307453
云浅知处はなび楼主2020/7/9 18:07

(别跟我提什么普朗克时间)

自己写了几组数据,和题解对拍,也没有问题....../kk/kk

代码如下:

#pragma GCC optimize(3)
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<iostream>

#define MAXN 500005
#define lson(o) (o<<1)
#define rson(o) (o<<1|1)
#define LL long long

using namespace std;

LL a[MAXN],n,m;

struct Node{

	LL p,q,r,sum;

	Node(LL _p,LL _q,LL _r,LL _s)
		:p(_p),q(_q),r(_r),sum(_s){}
	Node(){}
};

struct SMT{

	Node d[MAXN<<2];

	inline void pushup(LL o){
		d[o].sum=d[lson(o)].sum+d[rson(o)].sum;
		d[o].p=max(max(d[lson(o)].p,d[rson(o)].p),d[lson(o)].r+d[rson(o)].q);
		d[o].q=max(d[lson(o)].q,d[lson(o)].sum+d[rson(o)].q);
		d[o].r=max(d[rson(o)].r,d[rson(o)].sum+d[lson(o)].r);
	}

	inline void build(LL l,LL r,LL o){
		if(l==r){
			d[o]=Node(a[l],a[l],a[l],a[l]);
			return ;
		}
		LL mid=(l+r)>>1;
		build(l,mid,lson(o));
		build(mid+1,r,rson(o));
		pushup(o);
	}

	inline void modify(LL pos,LL k,LL ql,LL qr,LL o){
		if(ql==qr){
			if(ql==pos){
				d[o]=Node(k,k,k,k);
			}
			return ;
		}
		LL mid=(ql+qr)>>1;
		if(pos<=mid)modify(pos,k,ql,mid,lson(o));
		else modify(pos,k,mid+1,qr,rson(o));
		pushup(o);
	}

	inline Node query(LL l,LL r,LL ql,LL qr,LL o){
		if(l<=ql&&qr<=r){
			return d[o];
		}
		LL mid=(ql+qr)>>1;
		Node tmp=Node(-2333333333,-2333333333,-2333333333,-2333333333),t1=Node(-2333333333,-2333333333,-2333333333,-2333333333),t2=Node(-2333333333,-2333333333,-2333333333,-2333333333);
		if(l<=mid){
			t1=query(l,r,ql,mid,lson(o));
		}
		if(r>mid){
			t2=query(l,r,mid+1,qr,rson(o));
		}
		tmp.p=max(max(t1.p,t2.p),t1.r+t2.q);
		tmp.q=max(t1.q,t1.sum+t2.q);
		tmp.r=max(t2.r,t2.sum+t1.r);
		tmp.sum=t1.sum+t2.sum;
		return tmp;
	}

};

SMT tree;

int main(void){

	scanf("%lld",&n);

	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
	}

    scanf("%lld",&m);

	tree.build(1,n,1);

	while(m--){
		LL opt,l,r;
		scanf("%lld%lld",&l,&r);
//		if(opt==1){
			if(l>=r){
				swap(l,r);
			}
			printf("%lld\n",tree.query(l,r,1,n,1).p);
//		}
//		else{
//			tree.modify(l,r,1,n,1);
//		}
	}

	return 0;
}
2020/7/9 18:07
加载中...