社区讨论

2分RE求调教

P3521[POI 2011] ROT-Tree Rotations参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@mje3vamd
此快照首次捕获于
2025/12/20 17:38
2 个月前
此快照最后确认于
2025/12/22 20:15
2 个月前
查看原帖
CPP
#include<bits/stdc++.h>
using namespace std;
int const N=200005;
struct p{
	long long l, r, cnt;
}tree[N*4];
long long last=0, root[N*4], sum, cnt[N*4], n, o, cnt1[N*4], cnt2[N*4];
pair<long long, long long> a[N*4];
void build(long long pos, long long l, long long r, long long &x){
	x=++sum;
	if(l==r){
		tree[x].cnt=1;
		return ;
	}
	long long mid=(l+r)>>1;
	if(pos<=mid) build(pos, l, mid, tree[x].l);
	else build(pos, mid+1, r, tree[x].r);
	tree[x].cnt=tree[tree[x].l].cnt+tree[tree[x].r].cnt;
}
long long update(long long u, long long v, long long l, long long r, long long &cnt1, long long &cnt2){
	if(!u) return v;
	if(!v) return u;
	if(l==r){
		tree[u].cnt+=tree[v].cnt;
		return u;
	}
	long long mid=(l+r)>>1;
	cnt1+=tree[tree[v].l].cnt*tree[tree[u].r].cnt;
	cnt2+=tree[tree[v].r].cnt*tree[tree[u].l].cnt;
	tree[u].l=update(tree[u].l, tree[v].l, l, mid, cnt1, cnt2);
	tree[u].r=update(tree[u].r, tree[v].r, mid+1, r, cnt1, cnt2);
	tree[u].cnt=tree[tree[u].l].cnt+tree[tree[u].r].cnt;
	return u;
}
void f(long long x){
	cin>>o;
	if(o){
		cnt[x]=o;
		return ;
	}else{
		a[x]={x<<1, x<<1|1};
		f(x<<1);
		f(x<<1|1);
	}
}
void dfs(long long x){
	if(cnt[x]){
		build(cnt[x], 1, n, root[x]);
		cnt1[x]=0, cnt2[x]=0;
		return ;
	}
	dfs(a[x].first);
	dfs(a[x].second);
	update(root[a[x].first], root[a[x].second], 1, n, cnt1[x], cnt2[x]);
	if(cnt1[x]>cnt2[x]) swap(cnt1[x], cnt2[x]);
	root[x]=root[a[x].first];
}
int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>n;
	f(1);
	dfs(1);
	cout<<cnt1[1];
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...