c++转c求助
查看原帖
c++转c求助
578590
Inui_Sana楼主2023/2/7 16:35

rt,c++版能过,c本地没问题,交上去TLE

#include<stdio.h>
#define mems(x,y) memset(x,y,sizeof x)
typedef long long ll;
#define N 100007
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b)
#define swap(a,b) a^=b^=a^=b;
int inf=0x3f3f3f3f;
int n,id[N],c[N];
int fa[N],dep[N],siz[N],wt[N];
int cnt,dfn[N],top[N],rk[N];
int tr[N<<2];
char str[7];
int tot=1,head[N];
struct node{
	int to,nxt,cw;
}e[N<<1];
inline void add(int u,int v,int w){
	tot++;
	e[tot].to=v;
	e[tot].nxt=head[u];
	e[tot].cw=w;
	head[u]=tot;
}
void dfs1(int u,int f){
	fa[u]=f;
	dep[u]=dep[f]+1;
	siz[u]=1;
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==f){
			continue;
		}
		c[v]=e[i].cw;
		id[i>>1]=v;
		dfs1(v,u);
		siz[u]+=siz[v];
		if(siz[v]>siz[wt[u]]){
			wt[u]=v;
		}
	}
}
void dfs2(int u,int t){
	top[u]=t;
	dfn[u]=++cnt;
	rk[cnt]=u;
	if(wt[u]==0){
		return;
	}
	dfs2(wt[u],t);
	for(int i=head[u];i;i=e[i].nxt){
		int v=e[i].to;
		if(v==fa[u]||v==wt[u]){
			continue;
		}
		dfs2(v,v);
	}
}
inline void pushup(int o){
	tr[o]=max(tr[o<<1],tr[o<<1|1]);
}
void build(int l,int r,int o){
	if(l==r){
		tr[o]=c[rk[l]];
		return;
	}
	int mid=(l+r)>>1;
	build(l,mid,o<<1);
	build(mid+1,r,o<<1|1);
	pushup(o);
}
void update(int l,int r,int o,int x,int y){
	if(l==r){
		tr[o]=y;
		return;
	}
	int mid=(l+r)>>1;
	if(x<=mid){
		update(l,mid,o<<1,x,y);
	}else{
		update(mid+1,r,o<<1|1,x,y);
	}
	pushup(o);
}
int query(int l,int r,int o,int x,int y){
	if(l>=x&&r<=y){
		return tr[o];
	}
	int mid=(l+r)>>1,ret=0;
	if(x<=mid){
		ret=max(ret,query(l,mid,o<<1,x,y));
	}
	if(y>mid){
		ret=max(ret,query(mid+1,r,o<<1|1,x,y));
	}
	return ret;
}
int ask(int u,int v){
	int ret=0;
	while(top[u]!=top[v]){
		if(dep[top[u]]<dep[top[v]]){
			swap(u,v);
		}
		ret=max(ret,query(1,n,1,dfn[top[u]],dfn[u]));
		u=fa[top[u]];
	}
	if(dfn[u]>dfn[v]){
		swap(u,v);
	}
	//	printf("%d %d\n",c[v],dfn[v]);
	if(u!=v){
		ret=max(ret,query(1,n,1,dfn[u]+1,dfn[v]));
	}
	return ret;
}
void solve(){
	scanf("%d",&n);
	tot=1;
	cnt=0;
	for(int i=1;i<=n;i++){
		head[i]=0;
		wt[i]=0;
	}
	for(int i=1,u,v,w;i<n;i++){
		scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);
		add(v,u,w);
	}
	dep[1]=0;
	dfs1(1,0);
	dfs2(1,0);
	build(1,n,1);
	while(scanf("%s",str)){
		if(str[0]=='D'){
			break;
		}
		int x,y;
		scanf("%d%d",&x,&y);
		if(str[0]=='C'){
			update(1,n,1,dfn[id[x]],y);
		}else{
			printf("%d\n",ask(x,y));
		}
	}
}
signed main(){
	int t=1;
	scanf("%d",&t);
	while(t--)solve();
}
2023/2/7 16:35
加载中...