1 条题解

  • 0
    @ 2022-8-25 21:11:42
    #include <cstdio>
    #include <cstring>
    #include <algorithm>
    #define fo(i,a,b) for(int i=a;i<=b;i++)
    #define fd(i,a,b) for(int i=a;i>=b;i--)
    #define rep(i,a) for(int i=lst[a];i;i=nxt[i])
    using namespace std;
    
    int read() {
    	char ch;
    	for(ch=getchar();ch<'0'||ch>'9';ch=getchar());
    	int x=ch-'0';
    	for(ch=getchar();ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0';
    	return x;
    }
    
    const int N=4e5+5;
    int t[N<<1],nxt[N<<1],lst[N],l;
    void add(int x,int y) {
    	t[++l]=y;nxt[l]=lst[x];lst[x]=l;
    }
    int n,m,sz[N],dfn[N],w[N],son[N],cnt[N],a[N],b[N],an[N][2],tot,mx,id;
    void dfs(int x,int y) {
    	sz[x]=1;
    	dfn[x]=++tot;
    	w[tot]=x;
    	int k=0;
    	rep(i,x) 
    		if (t[i]!=y) {
    			dfs(t[i],x);
    			sz[x]+=sz[t[i]];
    			if (sz[t[i]]>k) 
    				k=sz[t[i]],son[x]=t[i];
    		}
    }
    void ins(int x) {
    	cnt[a[x]] += b[x];
    	if (cnt[a[x]]>mx||cnt[a[x]]==mx&&a[x]<id) 
    		mx=cnt[a[x]],id=a[x];
    }
    void solve(int x,int y) {
    	rep(i,x)
    		if (t[i]!=y&&t[i]!=son[x]) {
    			solve(t[i],x);
    			fo(j,dfn[t[i]],dfn[t[i]]+sz[t[i]]-1) 
    				cnt[a[w[j]]] -= b[w[j]];
    		}
    	id=0;mx=0;
    	if (son[x]) solve(son[x],x);
    	rep(i,x) 
    		if (t[i]!=y&&t[i]!=son[x])
    			fo(j,dfn[t[i]],dfn[t[i]]+sz[t[i]]-1) 
    				ins(w[j]);
    	ins(x);
    	an[x][0]=id;an[x][1]=mx;
    }
    int main() {
    	n=read();m=read();
    	fo(i,1,n-1) {
    		int x=read(),y=read();
    		add(x,y);add(y,x);
    	}
    	dfs(1,0);
    	fo(i,1,n) 
    		a[i]=read(),b[i]=read();
    	solve(1,0);
    	fo(i,1,n) 
    		printf("%d %d\n",an[i][0],an[i][1]);
    	return 0;
    }
    
    • 1

    信息

    ID
    2708
    时间
    1000ms
    内存
    256MiB
    难度
    8
    标签
    递交数
    15
    已通过
    6
    上传者