写的吉司机线段树(废话),WA 而且输出基本上是比答案大 1 或 2。
快调疯了qwq调几天了
#include<bits/stdc++.h>
#define pf printf
#define sf scanf
#define rep(x,y,z) for(int z=x;z<=y;z++)
#define int ll
using namespace std;
typedef long long ll;
const int N=2e5+7,inf=1e9+7;
int n,a[N],b[N],_a[N],_b[N];
struct tree{
int sum,ch[2],len[2],tag,tagadd,cnt;
tree():tag(inf){}
};
struct jsj{
tree tr[N<<2];
int s[N];
void _add(int x,int val){
for(;x<=n;x+=x&(-x)) s[x]+=val;
}
int _ask(int x){
int ans=0;
for(;x;x-=x&(-x)) ans+=s[x];
return ans;
}
void pushup(int u){
tr[u].sum=tr[u<<1].sum+tr[u<<1|1].sum;
tr[u].cnt=tr[u<<1].cnt+tr[u<<1|1].cnt;
int opls=0,oprs=0;
rep(0,1,i){
if(tr[u<<1].ch[opls]==tr[u<<1|1].ch[oprs]){
tr[u].ch[i]=tr[u<<1].ch[opls];
tr[u].len[i]=tr[u<<1].len[opls]+tr[u<<1|1].len[oprs];
opls++,oprs++;
}else if(tr[u<<1].ch[opls]>tr[u<<1|1].ch[oprs]){
tr[u].ch[i]=tr[u<<1].ch[opls];
tr[u].len[i]=tr[u<<1].len[opls];
opls++;
}else {
tr[u].ch[i]=tr[u<<1|1].ch[oprs];
tr[u].len[i]=tr[u<<1|1].len[oprs];
oprs++;
}
}
}
void pushdown(int u){
// dfs(u,tr[u].tag);
if(tr[u].tag<tr[u<<1].ch[0])
tr[u<<1].sum+=(-tr[u<<1].ch[0]+tr[u].tag)*tr[u<<1].len[0],
tr[u<<1].ch[0]=tr[u].tag,
tr[u<<1].tag=tr[u].tag;
if(tr[u].tag<tr[u<<1].ch[0])
tr[u<<1|1].sum+=(-tr[u<<1|1].ch[0]+tr[u].tag)*tr[u<<1|1].len[0],
tr[u<<1|1].ch[0]=tr[u].tag,
tr[u<<1|1].tag=tr[u].tag;
tr[u].tag=inf;
tr[u<<1].tagadd+=tr[u].tagadd;
tr[u<<1|1].tagadd+=tr[u].tagadd;
if(tr[u<<1].tag!=inf) tr[u<<1].tag+=tr[u].tagadd;
if(tr[u<<1|1].tag!=inf) tr[u<<1|1].tag+=tr[u].tagadd;
if(tr[u<<1].ch[0]) tr[u<<1].ch[0]+=tr[u].tagadd;
if(tr[u<<1].ch[1]) tr[u<<1].ch[1]+=tr[u].tagadd;
if(tr[u<<1|1].ch[0]) tr[u<<1|1].ch[0]+=tr[u].tagadd;
if(tr[u<<1|1].ch[1]) tr[u<<1|1].ch[1]+=tr[u].tagadd;
tr[u<<1].sum+=tr[u].tagadd*tr[u<<1].cnt;
tr[u<<1|1].sum+=tr[u].tagadd*tr[u<<1|1].cnt;
tr[u].tagadd=0;
}
void change(int u,int l,int r,int x,int val){
if(l==r&&l==x){
tr[u].ch[0]=val;
tr[u].len[0]=1;
tr[u].sum=val;
tr[u].cnt=1;
return;
}
int mid=(l+r)>>1;
pushdown(u);
if(x<=mid) change(u<<1,l,mid,x,val);
else change(u<<1|1,mid+1,r,x,val);
pushup(u);
}
void add(int u,int l,int r,int L,int R,int x){
if(l>=L&&r<=R){
tr[u].sum+=x*tr[u].cnt;
if(tr[u].ch[0]) tr[u].ch[0]+=x;
if(tr[u].ch[1]) tr[u].ch[1]+=x;
tr[u].tagadd+=x;
if(tr[u].tag!=inf) tr[u].tag+=x;
return;
}
int mid=(l+r)>>1;
pushdown(u);
if(mid>=L) add(u<<1,l,mid,L,R,x);
if(mid+1<=R) add(u<<1|1,mid+1,r,L,R,x);
pushup(u);
}
void qmin(int u,int l,int r,int L,int R,int x){
// pf("%d %d %d %d %d %d\n",u,l,r,L,R,x);
if(l>=L&&r<=R&&x>tr[u].ch[1]){
// pf("dfs\n");
if(x<tr[u].ch[0])
tr[u].sum+=(-tr[u].ch[0]+x)*tr[u].len[0],
tr[u].tag=tr[u].ch[0]=x;
return;
}
int mid=(l+r)>>1;
pushdown(u);
if(mid>=L) qmin(u<<1,l,mid,L,R,x);
if(mid+1<=R) qmin(u<<1|1,mid+1,r,L,R,x);
pushup(u);
}
void insert(int x,int id){
_add(id,1);
// pf("change\n");
change(1,1,n,id,x+1);
if(id+1<=n)
add(1,1,n,id+1,n,1);
if(id-1>=1)
qmin(1,1,n,1,id-1,_ask(id));
}
int ask(){
return tr[1].sum;
}
}Ta,Tb;
signed main(){
// freopen("scar.in","r",stdin);
// freopen("scar.out","w",stdout);
sf("%lld",&n);
rep(1,n,i){
sf("%lld",&a[i]);
b[n-i+1]=a[i];
_a[a[i]]=i;
_b[a[i]]=n-i+1;
}
rep(1,n,i){
// pf(" i %d\n",i);
// pf("Ta\n");
Ta.insert(i,_a[i]);
// pf("Tb\n");
Tb.insert(i,_b[i]);
int aa=Ta.ask(),bb=Tb.ask();
int ans=aa+bb-i*(i+2);
pf("%lld\n",ans);
}
}