题意:
![在这里插入图片描述](https://img-blog.csdnimg.cn/20210313165828626.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NDE3ODczNg==,size_16,color_FFFFFF,t_70)
解法:
先考虑构造出一个直径,显然直径为ma=max(a[i]),
为了构造出这个直径,我们对于[0,ma]的每个i,都需要一个a[i]=max(i,ma-i)的点,
如果没有的话,就没办法构造出直径.
构造出直径后,考虑将剩下的点插入,当还存在a[i]<(ma+1)/2时,不管这个点插在直径上的哪个位置,
都会出现这个点到直径两端的最小距离>a[i]的情况,那么久没办法插入这个点,此时无解.
参考:
https://www.luogu.com.cn/blog/ltzlInstallBl/solution-at2061
code:
#include <bits/stdc++.h>
#define int long long
using namespace std;
const int maxm=2e6+5;
int need[maxm];
int cnt[maxm];
int n;
void solve(){
cin>>n;
int ma=0;
for(int i=1;i<=n;i++){
int x;cin>>x;
ma=max(ma,x);
cnt[x]++;
}
for(int i=0;i<=ma;i++){
int t=max(i,ma-i);
need[t]++;
}
for(int i=0;i<=ma;i++){
if(cnt[i]<need[i]){
cout<<"Impossible"<<endl;
return ;
}
}
for(int i=1;i<=(ma+1)/2;i++){
if(cnt[i]>need[i]){
cout<<"Impossible"<<endl;
return ;
}
}
cout<<"Possible"<<endl;
}
signed main(){
ios::sync_with_stdio(0);
solve();
return 0;
}