为什么用C语言也UKE了???
查看原帖
为什么用C语言也UKE了???
1045879
cheng2010楼主2024/1/18 21:25
#include<stdio.h>
#include<string.h>
#define LL p<<1
#define RR p<<1|1
#define ls LL,l,mid
#define rs RR,mid+1,r
#define N 20007
int T;
int n;
int tree[N<<1];
int max(int x,int y)
{
    if(x>y) return x;
    return y;
}
void update(int p,int l,int r,int x,int k)
{
	if(l==r)
	{
		tree[p]=k;
		return;
	}
	int mid=(l+r)>>1;
	if(mid>=x) update(ls,x,k);
	if(mid<x) update(rs,x,k);
	tree[x]=max(tree[RR],tree[LL]);
}
int query(int p,int l,int r,int L,int R)
{
	if(l==r) return tree[p];
	int mid=(l+r)>>1,ans=-1e9;
	if(mid>=L) ans=max(ans,query(ls,L,R));
	if(mid<R) ans=max(ans,query(rs,L,R));
	return ans;
}
int x[N],y[N],z[N];
struct EDGE
{
	int frm,to,head;
}edge[N<<1];
int tot;
void add(int x,int y)
{
	edge[++tot].to=y;
	edge[tot].frm=edge[x].head;
	edge[x].head=tot;
    return;
}
int siz[N],son[N],dep[N],fa[N],top[N],dfn[N],cnt;
void dfs1(int x)
{
	son[x]=-1;
	siz[x]=1;
	for(int i=edge[x].head;i;i=edge[i].frm)
	{
		int v=edge[i].to;
		if(dep[v]) continue;
		dep[v]=dep[x]+1;
		fa[v]=x;
		dfs1(v);
		siz[x]+=siz[v];
		if(son[x]==-1||siz[v]>siz[son[x]])
			son[x]=v;
	}
}
void dfs2(int x,int t)
{
	cnt++;
	top[x]=t;
	dfn[x]=cnt;
	if(son[x]==-1) return;
	dfs2(son[x],t);
	for(int i=edge[x].head;i;i=edge[i].frm)
	{
		int v=edge[i].to;
		if(v==fa[x]||v==son[x]) continue;
		dfs2(v,v);
	}
}
int MAX(int x,int y)
{
	int ans=-1e9;
	if(top[x]!=top[y])
	{
		if(dep[top[x]]>dep[top[y]])
		{
			int t=x;x=y;y=t;
		}
		ans=max(ans,query(1,1,n,dfn[top[x]],dfn[x]));
		x=fa[top[x]];
	}
	if(dep[x]>dep[y])
	{int t=x;x=y;y=t;} 
    ans=max(ans,query(1,1,n,dfn[son[x]],dfn[y]));
	return ans;
}
main()
{
	scanf("%d",&T);
	while(T--)
	{
        cnt=tot=0;
        memset(edge,0,sizeof(edge));
        memset(tree,0,sizeof(tree));
		scanf("%d",&n);
		for(int i=1;i<n;i++)
		{
			scanf("%d %d %d",&x[i],&y[i],&z[i]);
			add(x[i],y[i]);
			add(y[i],x[i]);
		}
		dep[1]=1;
		dfs1(1);
		dfs2(1,1);
		for(int i=1;i<n;i++)
		{
			if(dep[x[i]]>dep[y[i]])
			{
				int t=x[i];
				x[i]=y[i];
				y[i]=t;
			}
			update(1,1,n,dfn[y[i]],z[i]);
		}
		char s[10];
        int a,b;
		while(1)
		{
			scanf("%s",s);
			if(s[0]=='D') break;
			if(s[0]=='C')
			{
				scanf("%d%d",&a,&b);
				update(1,1,n,dfn[y[a]],b);
			}
			else
			{
				scanf("%d%d",&a,&b);
				if(a==b)
					puts("0");
				else
					printf("%d\n",MAX(a,b));
			}
		}
	}
   return 0;
}
```
2024/1/18 21:25
加载中...