外星人给我出来!把我AC的abc218g代码改成了WA,求大佬调
  • 板块灌水区
  • 楼主Zq_water
  • 当前回复6
  • 已保存回复6
  • 发布时间2024/8/5 15:10
  • 上次更新2024/8/5 15:57:24
查看原帖
外星人给我出来!把我AC的abc218g代码改成了WA,求大佬调
895435
Zq_water楼主2024/8/5 15:10

rt

#include<bits/stdc++.h>
#define INF 2e18
#define endl '\n'
#define PI acos(-1)
#define pb push_back
#define fi first
#define se second
#define int long long
#define mem(x,v) memset(x,v,sizeof x)
using namespace std;
const int N = 3e6+5;
const int V = 1e9;

int n,rt,tot;
int a[N],f[N],pre[N];
struct Tree{int ls,rs,siz;}t[N];
vector <int> g[N];

void pushup(int u){t[u].siz=t[t[u].ls].siz+t[t[u].rs].siz;}
void modify(int &u,int pos,int k,int tl,int tr){
	if(pos<tl||tr<pos)return;
	if(!u)u=++tot;
	if(tl==tr){t[u].siz+=k;return;}
	int mid=tl+tr>>1;
	modify(t[u].ls,pos,k,tl,mid);
	modify(t[u].rs,pos,k,mid+1,tr);
	pushup(u);
}
int rnk(int u,int k,int tl,int tr){
	if(tl==tr)return tl;
	int mid=tl+tr>>1;
	if(k<=t[t[u].ls].siz)return rnk(t[u].ls,k,tl,mid);
	else return rnk(t[u].rs,k-t[t[u].ls].siz,mid+1,tr);
}
void dfs1(int u,int fa){
	modify(rt,a[u],1,1,V);
	if(t[u].siz&1)pre[u]=rnk(rt,(t[rt].siz+1)/2,1,V);
	else pre[u]=(rnk(rt,t[rt].siz/2,1,V)+rnk(rt,t[rt].siz/2+1,1,V))/2;
	for(int v:g[u]){
		if(v==fa)continue;
		dfs1(v,u);
	}
	modify(rt,a[u],-1,1,V);
}
void dfs2(int u,int fa,int op){
	if(op==1)f[u]=INF;
	if(g[u].size()==1&&fa)f[u]=pre[u];
	for(int v:g[u]){
		if(v==fa)continue;
		dfs2(v,u,op^1);
		if(op==1)f[u]=min(f[u],f[v]);
		else f[u]=max(f[u],f[v]);
	}
}
signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++)cin>>a[i];
	for(int i=1,u,v;i<n;i++)cin>>u>>v,g[u].pb(v),g[v].pb(u);
	dfs1(1,0),dfs2(1,0,0),cout<<f[1];
	return 0;
}
2024/8/5 15:10
加载中...