玄关求调
查看原帖
玄关求调
542128
liyixin0514楼主2024/7/20 11:16

写的吉司机线段树(废话),WA 而且输出基本上是比答案大 11 或 22。

快调疯了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);
	}
}
2024/7/20 11:16
加载中...