哪路神仙帮我 C++ 转 C(悬 3 关)
查看原帖
哪路神仙帮我 C++ 转 C(悬 3 关)
571147
zhlzt楼主2024/9/20 22:09

对 C 不是很熟悉,哪路神仙帮我转好了,在这个帖子里发给我,万分感谢!!

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e4+10;
int tree[maxn<<2],id,n;
int dfn[maxn],siz[maxn],dep[maxn];
int fath[maxn],son[maxn],head[maxn];
int du[maxn],dv[maxn],dw[maxn];
vector<int>edge[maxn];
inline void pushup(int p){
	tree[p]=max(tree[p<<1],tree[p<<1|1]);
}
inline void build(int p,int pl,int pr){
	tree[p]=0; if(pl==pr) return;	
	int mid=(pl+pr)>>1;
	build(p<<1,pl,mid); build(p<<1,mid+1,pr);
	return;
}
inline void update(int d,int p,int pl,int pr,int k){
	if(pl==pr){tree[p]=k;return;}
	int mid=(pl+pr)>>1;
	if(d<=mid) update(d,p<<1,pl,mid,k);
	else update(d,p<<1|1,mid+1,pr,k);
	return pushup(p);
}
inline int query(int l,int r,int p,int pl,int pr){
	if(l<=pl and pr<=r) return tree[p];
	int mid=(pl+pr)>>1,ans=0;
	if(l<=mid) ans=max(ans,query(l,r,p<<1,pl,mid));
	if(r>mid) ans=max(ans,query(l,r,p<<1|1,mid+1,pr));
	return ans;
}
inline void dfs1(int u,int dad){
	fath[u]=dad; siz[u]=1;
	dep[u]=dep[dad]+1;
	for(int v:edge[u]){
		if(v==dad) continue;
		dfs1(v,u); siz[u]+=siz[v];
		if(siz[v]>siz[son[u]]) son[u]=v;
	}
	return;
}
inline void dfs2(int u,int hd){
	head[u]=hd; dfn[u]=++id;
	if(son[u]) dfs2(son[u],hd);
	for(int v:edge[u]){
		if(v!=fath[u] and v!=son[u]) dfs2(v,v);
	}
	return;
}
inline int qry(int u,int v){
	int ans=0;
	while(head[u]!=head[v]){
		if(dep[head[u]]<dep[head[v]]) swap(u,v);
		ans=max(ans,query(dfn[head[u]],dfn[u],1,1,n));
		u=fath[head[u]];
	}
	if(dep[u]<dep[v]) swap(u,v);
	if(u!=v) ans=max(ans,query(dfn[v]+1,dfn[u],1,1,n));
	return ans;
}
int main(){
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	int t; cin>>t;
	while(t--){
		cin>>n;
		for(int i=1;i<n;i++){
			cin>>du[i]>>dv[i]>>dw[i];
			edge[du[i]].push_back(dv[i]);
			edge[dv[i]].push_back(du[i]);
		} 
		dfs1(1,0); dfs2(1,1);
		build(1,1,n);
		for(int i=1;i<n;i++){
			if(dep[du[i]]>dep[dv[i]]) swap(du[i],dv[i]);
			update(dfn[dv[i]],1,1,n,dw[i]);
		}
		string opt; int u,v;
		while(cin>>opt and opt!="DONE"){
			cin>>u>>v;
			if(opt=="QUERY") cout<<qry(u,v)<<"\n";
			else update(dfn[dv[u]],1,1,n,v);
		}
	}
	return 0;
}
2024/9/20 22:09
加载中...