10pts求条
查看原帖
10pts求条
1058570
tzhengqing楼主2025/7/19 08:48

1AC9WA,时间卡过,目测错误极小(在10000+行出错),求条

#include<bits/stdc++.h>
using namespace std;
#define ls (p<<1)
#define rs (p<<1|1)
#define mid ((pl+pr)>>1)
const int N=100005;
int n,m,fa[N],dep[N],son[N],top[N],siz[N],dfn[N],pw[N],a[N],cnt=0,root;
vector<int>e[N];
int tag[N<<2],tree[N<<2];
void dfs1(int f,int x)
	{
	fa[x]=f;dep[x]=dep[f]+1;siz[x]=1;
	for(int i=0;i<e[x].size();i++)
		{
		int d=e[x][i];
		if(d==f)continue;
		dfs1(x,d);siz[x]+=siz[d];
		if(siz[d]>siz[son[x]])son[x]=d;
		}
	}
void dfs2(int tp,int x)
	{
	top[x]=tp;dfn[x]=++cnt;pw[cnt]=x;
	if(!son[x])return;
	dfs2(tp,son[x]);
	for(int i=0;i<e[x].size();i++)
		{
		int d=e[x][i];
		if(d==fa[x]||d==son[x])continue;
		dfs2(d,d);
		}
	}
inline void pushup(int p){tree[p]=min(tree[ls],tree[rs]);}
void build(int p,int pl,int pr)
	{
	if(pl==pr){tree[p]=a[pw[pl]];tag[p]=0;return;}
	build(ls,pl,mid);build(rs,mid+1,pr);
	pushup(p);
	}
inline void pushdown(int p)
	{
	if(!tag[p])return;
	tag[ls]=tag[rs]=tag[p];
	tree[ls]=tree[rs]=tag[p];
	tag[p]=0;
	}
void upd(int p,int pl,int pr,int l,int r,int d)
	{
	if(l<=pl&&pr<=r){tree[p]=tag[p]=d;return;}
	pushdown(p);
	if(l<=mid)upd(ls,pl,mid,l,r,d);
	if(r>mid)upd(rs,mid+1,pr,l,r,d);
	pushup(p);
	}
inline void update(int x,int y,int d)
	{
	while(top[x]!=top[y])
		{
		if(dep[top[x]]<dep[top[y]])swap(x,y);
		upd(1,1,n,dfn[top[x]],dfn[x],d);
		x=fa[top[x]];
		//cout<<x<<' '<<y<<' '<<dfn[top[x]]<<' '<<dfn[x]<<' '<<d<<'\n';
		}
	if(dep[x]<dep[y])swap(x,y);
	upd(1,1,n,dfn[y],dfn[x],d);
	//cout<<x<<' '<<y<<' '<<dfn[y]<<' '<<dfn[x]<<' '<<d<<'\n';
	}
int query(int p,int pl,int pr,int l,int r)
	{
	if(l>r)return 2147483647;
	if(l<=pl&&pr<=r)return tree[p];
	pushdown(p);int ans=2147483647;
	if(l<=mid)ans=min(ans,query(ls,pl,mid,l,r));
	if(r>mid)ans=min(ans,query(rs,mid+1,pr,l,r));
	return ans;
	}
inline int qry(int x)
	{
	int ans=2147483647;
	if(x==root)return query(1,1,n,1,n);
	if(dfn[x]+siz[x]>dfn[root]&&dfn[x]<=dfn[root])
		{
		int now=root;
		while(dep[x]<dep[now]-1)now=fa[now];
		ans=min(ans,query(1,1,n,dfn[x],dfn[now]-1));
		ans=min(ans,query(1,1,n,dfn[now]+siz[now],dfn[x]+siz[x]-1));
		}
	else ans=query(1,1,n,dfn[x],dfn[x]+siz[x]-1);
	return ans;
	}
int main()
	{
	//ios::sync_with_stdio(0);
	//cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<n;i++)
		{
		int x,y;cin>>x>>y;
		e[x].push_back(y);
		e[y].push_back(x);
		}
	dfs1(0,1);dfs2(1,1);
	for(int i=1;i<=n;i++)cin>>a[i];
	build(1,1,n);
	cin>>root;
	while(m--)
		{
		int op,x;cin>>op>>x;
		if(op==1)root=x;
		if(op==2)
			{
			int y,z;cin>>y>>z;
			update(x,y,z);
			}
		if(op==3)cout<<qry(x)<<'\n';
		}
	return 0;
	}
2025/7/19 08:48
加载中...