【分析】AGC005 Tree Restoring

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_34454069/article/details/82791740

分析:

非常简单的水题

根据树的直径的性质(每个点的最远点为直径的某一端点)

1、 m i n { a i } = m a x { a i } + 1 2 min\{a_i\}=\lfloor \frac {max\{a_i\}+1} {2}\rfloor
2、除了 m i n { a i } min\{a_i\} ,其余所有数必须出现至少2次。
3、当 m a x { a i } max\{a_i\} 为奇数时, m i n { a i } min\{a_i\} 的出现次数必为2次,偶数则必为1次。

满足这三个条件的就是"Possible"

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define PF printf
#define SF scanf
#define MAXN 100010
using namespace std;
int a[MAXN];
int n,cnt[MAXN],minv,maxv;
int main(){
	SF("%d",&n);
	for(int i=1;i<=n;i++)
		SF("%d",&a[i]);
	minv=a[1];
	maxv=a[1];
	for(int i=2;i<=n;i++){
		minv=min(minv,a[i]);
		maxv=max(maxv,a[i]);
	}
	if(minv!=(maxv+1)/2){
		PF("Impossible");
		return 0;
	}
	for(int i=1;i<=n;i++)
		cnt[a[i]]++;
	for(int i=maxv;i>minv;i--){
		if(cnt[i]<2){
			PF("Impossible");
			return 0;
		}
	}
	if(maxv%2==0&&cnt[minv]!=1){
		PF("Impossible");
		return 0;
	}
	if(maxv%2==1&&cnt[minv]!=2){
		PF("Impossible");
		return 0;	
	}
	PF("Possible");
		
}

猜你喜欢

转载自blog.csdn.net/qq_34454069/article/details/82791740