本机测 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;
}
}