zoukankan      html  css  js  c++  java
  • AtCoder Grand Contest 010 C:Cleaning

    题目传送门:https://agc010.contest.atcoder.jp/tasks/agc010_c

    题目翻译

    给你一棵树,每个点有个权值,每次操作可以选择两个度数为(1)的结点,然后让这两点之间的简单路径上的所有点权值减一,允许操作无数次,问是否可以使得所有点权变成(0)(nleqslant 10^5)

    题解

    一开始题意看错了,以为是边上有权值,然后想了想可以从下往上确定每个点被经过多少次,感觉有点思路的时候发现是点上有权值。那么同样的,我可以从下往上确定每条边被经过多少次。我们选择一个度数不为一的点作为根,对于每个叶子结点,它头上那条边会被经过叶子节点上权值次。对于每个非叶子节点,因为会进来一次出去一次,所以经过邻边的次数加起来就应该会等于这个点上的权值的两倍。所以我们可以自下而上推出所有的边被经过多少次,如果存在一个点有邻边需要经过的次数比它点权还大,或者存在某条边被经过负数次就无解,否则有解。当只有两个点的时候需要特判。

    时间复杂度:(O(n))

    空间复杂度:(O(n))

    代码如下:

    #include <cstdio>
    #include <algorithm>
    using namespace std;
    typedef long long ll;
    
    const int maxn=1e5+5;
    
    int n,rt,tot,deg[maxn];
    int A[maxn],now[maxn],pre[maxn*2],son[maxn*2];
    
    int read() {
    	int x=0,f=1;char ch=getchar();
    	for(;ch<'0'||ch>'9';ch=getchar())if(ch=='-')f=-1;
    	for(;ch>='0'&&ch<='9';ch=getchar())x=x*10+ch-'0';
    	return x*f;
    }
    
    void add(int a,int b) {
    	pre[++tot]=now[a];
    	now[a]=tot,son[tot]=b;
    }
    
    ll dfs(int fa,int u) {
    	if(deg[u]==1)return A[u];
    	ll remain=A[u]<<1;
    	for(int p=now[u],v=son[p];p;p=pre[p],v=son[p])
    		if(v!=fa) {
    			ll tmp=dfs(u,v);
    			if(tmp>A[u]) {puts("NO");exit(0);}
    			remain-=tmp;
    		}
    	if(remain<0||remain>A[u]) {puts("NO");exit(0);}
    	return remain;
    }
    
    int main() {
    	n=read();
    	for(int i=1;i<=n;i++)
    		A[i]=read();
    	if(n==2) {
    		if(A[1]==A[2])puts("YES");
    		else puts("NO");return 0;
    	}
    	for(int i=1;i<n;i++) {
    		int x=read(),y=read();
    		add(x,y),add(y,x);deg[x]++,deg[y]++;
    		if(deg[x]>1)rt=x;if(deg[y]>1)rt=y;
    	}
    	if(dfs(0,rt))puts("NO");
    	else puts("YES");
    	return 0;
    }
    
  • 相关阅读:
    Kafka 生产者 自定义分区策略
    同步互斥
    poj 1562 Oil Deposits(dfs)
    poj 2386 Lake Counting(dfs)
    poj 1915 KnightMoves(bfs)
    poj 1664 放苹果(dfs)
    poj 1543 Perfect Cubes (暴搜)
    poj 1166 The Clocks (暴搜)
    poj 3126 Prime Path(bfs)
    处理机调度
  • 原文地址:https://www.cnblogs.com/AKMer/p/10056742.html
Copyright © 2011-2022 走看看