奇怪全 MLE 求助悬一关
查看原帖
奇怪全 MLE 求助悬一关
906856
A2_Zenith楼主2024/4/8 13:55

本机测 3000 的样例完全没问题,交上去就寄掉了,非常的不理解啊。

#include<bits/stdc++.h>
#define pii pair<int,int>
#define int unsigned long long
#define doub long double
#define m_p make_pair
using namespace std;
const signed maxn=250007;
//-----------------------------------------------
struct Tg{
	int a,b,c,ca,cb,cl;
	Tg(int ta=0,int tb=0,int tc=0,int tca=0,int tcb=0,int tcl=0){
		a=ta,b=tb,c=tc,ca=tca,cb=tcb,cl=tcl;
	}
	inline bool empty(){
		return !(a||b||c||ca||cb||cl);
	}
	inline void add(const Tg &t){
		int abl=(a==0),bbl=(b==0);
		c+=(abl*bbl*t.c);
		ca+=(abl*b*t.c+abl*t.ca);
		cb+=(bbl*a*t.c+bbl*t.cb);
		cl+=(a*b*t.c+a*t.ca+b*t.cb+t.cl);
		if(t.a)a=t.a;
		if(t.b)b=t.b;
		/*本质上一切的tag啊,向量啊都是线性变换。
		只是把t的那个tag当做向量,然后依据现在这个节点的tag对应的矩阵进行线性变换。*/
	}
}tg[maxn*4];

inline int lc(int p){
	return p<<1;
}
inline int rc(int p){
	return p<<1|1;
}

struct node{
	int s,sa,sb,len,c;
	node add(Tg t){
		int ss=s,ssa=sa,ssb=sb,sl=len,sc=c;
		bool abl=(t.a==0),bbl=(t.b==0);
		s=abl*bbl*ss+abl*ssa*t.b+bbl*ssb*t.a+t.a*t.b*sl;
		sa=abl*ssa+t.a*len;
		sb=bbl*ssb+t.b*len;
		len=sl;
		c=t.c*ss+t.ca*ssa+t.cb*ssb+t.cl*sl+sc;
	}
	int Hsum(int t){
		return c+s*t;
	}
}d[maxn*4];

node operator+(const node A,const node B){
	return (node){A.s+B.s,A.sa+B.sa,A.sb+B.sb,A.len+B.len,A.c+B.c};
}

void pu(int p){
	d[p]=d[lc(p)]+d[rc(p)];
}

void pd(int p,int l,int r){
	if(tg[p].a||tg[p].b){
		tg[lc(p)].add(tg[p]);
		tg[rc(p)].add(tg[p]);
		d[lc(p)].add(tg[p]);
		d[rc(p)].add(tg[p]);
		tg[p]=Tg();
	}
}

void build(int p,int l,int r){
	if(l==r){
		d[p]=(node){0,0,0,1,0};
		return;
	}
	d[p]=(node){0,0,0,r-l+1,0};
	int mid=l+r>>1;
	build(lc(p),l,mid);
	build(rc(p),mid+1,r);
}

void upd(int L,int R,int p,int l,int r,Tg t){
	if(L>R)return;
	if(l>r)return;
	if(L<=l&&r<=R){
		tg[p].add(t);
		d[p].add(t);
		return;
	}
	pd(p,l,r);
	int mid=l+r>>1;
	if(L<=mid)upd(L,R,lc(p),l,mid,t);
	if(R>mid)upd(L,R,rc(p),mid+1,r,t);
	pu(p);
}

node qry(int L,int R,int p,int l,int r){
	if(L<=l&&r<=R)return d[p];
	pd(p,l,r);
	int mid=l+r>>1;
	node B=d[0];
	if(L<=mid)B=B+qry(L,R,lc(p),l,mid);
	if(R>mid)B=B+qry(L,R,rc(p),mid+1,r);
	return B;
}
//-----------------------------------------------
int a[maxn];
int b[maxn];
struct P{
	int v,p;
};
vector<pii> qq[maxn];
int qa[maxn];
stack<P>SA,SB;
int T;
int n,q;
signed main(){
	cin>>T>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int j=1;j<=n;j++)cin>>b[j];
	cin>>q;
	for(int i=1;i<=q;i++){
		int l,r;
		cin>>l>>r;
		qq[r].push_back(m_p(l,i));
	}
	SA.push((P){(int)1e18,0});
	SB.push((P){(int)1e18,0});
	build(1,1,n);
	for(int r=1;r<=n;r++){
		while(a[r]>SA.top().v)SA.pop();
		while(b[r]>SB.top().v)SB.pop();
		upd(SA.top().p+1,r,1,1,n,(Tg){a[r],0,(r-1),0,-(r-1)*a[r],0});
		upd(SB.top().p+1,r,1,1,n,(Tg){0,b[r],(r-1),-(r-1)*b[r],0,0});
		for(int i=0;i<qq[r].size();i++){
			pii t=qq[r][i];
			qa[t.second]=qry(t.first,r,1,1,n).Hsum(r);
		}
		SA.push((P){a[r],r});
		SB.push((P){b[r],r});
	}
	for(int i=1;i<=q;i++){
		cout<<qa[i]<<endl;
	}
}
2024/4/8 13:55
加载中...