WA 32 求助(悬 3 关)
  • 板块P4115 Qtree4
  • 楼主zhlzt
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/9/24 18:00
  • 上次更新2024/9/24 20:32:26
查看原帖
WA 32 求助(悬 3 关)
571147
zhlzt楼主2024/9/24 18:00

Only AC #1, 2, 20, 21.

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> pi;
const int maxn=1e5+10;
int dpu[maxn<<2],dpv[maxn<<2];
int dep[maxn],dfn[maxn],ver[maxn],fath[maxn];
int dp[maxn][20],ans[maxn],id;
vector<pi>edge[maxn];
inline void dfs(int u,int dad){
	int v,w; 
	dep[u]=dep[dad]+1; fath[u]=dad;
	dfn[u]=++id,ver[id]=u;
	for(pi cur:edge[u]){
		v=cur.first,w=cur.second;
		if(v==dad) continue;
		ans[v]=ans[u]+w; dfs(v,u);
	}
	return;
}
inline int dis(int u,int v){
	if(u==v) return 0;
	if(dfn[u]>dfn[v]) swap(u,v);
	int k=log2(dfn[v]-dfn[u]);
	int ans1=dp[dfn[u]+1][k],ans2=dp[dfn[v]-(1<<k)+1][k];
	if(dep[ans1]>dep[ans2]) swap(ans1,ans2);
	return ans[u]+ans[v]-(ans[fath[ans1]]<<1);
}
inline void pushup(int p){
	int ls=(p<<1),rs=(p<<1|1);
	if(!dpu[ls] or !dpv[ls]){
		dpu[p]=dpu[rs],dpv[p]=dpv[rs]; return;
	}
	if(!dpu[rs] or !dpv[rs]){
		dpu[p]=dpu[ls],dpv[p]=dpv[ls]; return;
	}
	int dist=-1e9;
	int disll=dis(dpu[ls],dpv[ls]),disrr=dis(dpu[rs],dpv[rs]);
	int disuu=dis(dpu[ls],dpu[rs]),disuv=dis(dpu[ls],dpv[rs]);
	int disvu=dis(dpv[ls],dpu[rs]),disvv=dis(dpv[ls],dpv[rs]);
	if(disll>dist) dpu[p]=dpu[ls],dpv[p]=dpv[ls],dist=disll;
	if(disrr>dist) dpu[p]=dpu[rs],dpv[p]=dpv[rs],dist=disrr;
	if(disuu>dist) dpu[p]=dpu[ls],dpv[p]=dpu[rs],dist=disuu;
	if(disuv>dist) dpu[p]=dpu[ls],dpv[p]=dpv[rs],dist=disuv;
	if(disvu>dist) dpu[p]=dpv[ls],dpv[p]=dpu[rs],dist=disvu;
	if(disvv>dist) dpu[p]=dpv[ls],dpv[p]=dpv[rs],dist=disvv;
	return;
}
inline void build(int p,int pl,int pr){
	if(pl==pr){dpu[p]=dpv[p]=ver[pl];return;}
	int mid=(pl+pr)>>1;
	build(p<<1,pl,mid); build(p<<1|1,mid+1,pr);
	return pushup(p);
}
inline void update(int d,int p,int pl,int pr){
	if(pl==pr){
		if(dpu[p]) dpu[p]=dpv[p]=0;
		else dpu[p]=dpv[p]=ver[pl];
		return;
	}
	int mid=(pl+pr)>>1;
	if(d<=mid) update(d,p<<1,pl,mid);
	else update(d,p<<1|1,mid+1,pr);
	return pushup(p);
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int n;cin>>n;
	char opt; int u,v,w;
	for(int i=1;i<n;i++){
		int u,v,w;cin>>u>>v>>w;
		edge[u].emplace_back(v,w);
		edge[v].emplace_back(u,w);
	}
	dfs(1,0);
	for(int i=1;i<=n;i++) dp[dfn[i]][0]=i;
	for(int k=1;k<=log2(n);k++){
		int top=n-(1<<k)+1;
		for(int i=1,j=((1<<k-1)|1);i<=top;i++,j++){
			if(dep[dp[i][k-1]]<dep[dp[j][k-1]]){
				dp[i][k]=dp[i][k-1];
			}
			else dp[i][k]=dp[j][k-1];
		}
	}
	build(1,1,n);
	int q;cin>>q;
	for(int i=1;i<=q;i++){
		cin>>opt;
		if(opt=='A'){
			if(dpu[1]) cout<<dis(dpu[1],dpv[1])<<"\n";
			else cout<<"They have disappeared.\n";
		}
		else cin>>u,update(dfn[u],1,1,n);
	}
	return 0;
}
2024/9/24 18:00
加载中...