我的代码只有1k
查看原帖
我的代码只有1k
531653
Xor273楼主2023/9/5 10:53

其它点最慢只有52ms,但是T了第一和最后一个点,嘤qwq

#include<bits/stdc++.h>
#define pb push_back
using namespace std;
typedef long long ll;
const int N=2e5+5,M=105,S=2e5;
int val[N*40],ls[N*40],rs[N*40],L[N],R[N],rt[N],ans[N],RT,cnt,tot,lcnt,acnt,bcnt,n,psiz;
void psu(int p){val[p]=val[ls[p]]+val[rs[p]];}
void upd(int l,int r,int &p,int cp){
	if(!p)p=++tot;
	if(l==r){
		val[p]++;
		return;
	}
	int mid=(l+r)>>1;
	if(cp<=mid)upd(l,mid,ls[p],cp);
	else upd(mid+1,r,rs[p],cp);
	psu(p);
}

int Merge(int u,int v,int l,int r){
	if(!u){
		acnt+=lcnt*val[v];
		bcnt+=(psiz-lcnt)*val[v];
		return v;
	} 
	if(!v){
		lcnt+=val[u];
		return u;
	}
	int mid=(l+r)>>1;
	ls[u]=Merge(ls[u],ls[v],l,mid);
	rs[u]=Merge(rs[u],rs[v],mid+1,r);
	psu(u);
	return u;
}

void dfs(int &u){
	if(!u)u=++cnt; 
	int x; cin>>x; //info
	if(x==0){
		dfs(L[u]); 
		dfs(R[u]);
		ans[u]=ans[L[u]]+ans[R[u]];
		psiz=val[rt[L[u]]]; acnt=0; bcnt=0; lcnt=0;
		rt[u]=Merge(rt[L[u]],rt[R[u]],1,n);
		ans[u]+=min(acnt,bcnt);
	}
	else upd(1,n,rt[u],x);
}

int main(){
	ios::sync_with_stdio(false);
	cin>>n;
	dfs(RT);
	cout<<ans[RT];
	return 0;
}
2023/9/5 10:53
加载中...