题外话
今天的题,极大地打击了我,一开始的思路被自己hack之后,就完全没思路了
TAT
题意
n个人,每个人有一个有颜色的帽子~有可能是绿色(滑稽)~,然后他们知道有多少人和自己帽子颜色不同,设为ai(他们知道的有可能不对),询问如果每个ai都能满足输出Possible(有解就行)否则就是Impossible
思路
网上的思路都是倒着想,就是n-ai,的想法, 然后通过看ai 和 n-ai的关系来判断
- 同一个ai的个数==n-ai,那么是符合的
- 同一个ai的个数<n-ai, 一定不符合
- 同一个ai的个数>n-ai
- 我们通过 2 2 2 2,这个例子发现, 如果同一个ai的个数是(n-a[i])的倍数也是可以满足的所以
- 同一个ai的个数%(n-a【i】)==0 ,可以
- 否则不行
- 我们通过 2 2 2 2,这个例子发现, 如果同一个ai的个数是(n-a[i])的倍数也是可以满足的所以
代码
///*
//正在播放《フリージア》
//1:21 ━━━━━━●───── 5:35
// ? ? ?? ? ?
//```````'`...```````''`````````````'````````````````'`.`''
//```````''..`';;'```''```'''''''''''''`````````````````'':
//.````''''':;;!!:````'````'''''''''''``````````````````'':
//``''''''':;;;;;'```'``````''```````````____________```'':
//`````````:;;!;'```````````'```````'```| 所以说 |'``'':
//```````'|$&$%:````````````'```````````|不要停下来啊|''''':
//````'''!$&&&|'```````````'''::''::''''/ (指AC) |':'':::
//````'':|&&&$!'`````'''''''::.....`;!;'/_________|''``'::
// ....'|&&@$!'........```:!;'....`:;:```````````````````'
//..````;$&&&$!:''``````'':|%%!::;|%$$!::::::::''::::::::::
//``````!&&@&&|:'````````':|$$$$$$$$$|:':::::::::::::::::::
//`````:%&@@@@@@@@&&&@@@@&&&&@@@@@@@&&&|::::::::':::::::::;
//`````.```':|$@@@@@@@@@@@@@@@@@@@@@@@@###@@&&$|;:::'::::::
//````````````';|$&@@@@@@@@@###@@@@@@########@@@@$!''''::::
//`````````..````:|%$@@@@@#########@#########@@@@&!''''::::
//`````````````````:|&########################@@@$;::::::::
//``````````````````:!$@########################@%;:::'::::
//``````````..``````':|&#######################@@&!''''''::
//''''::'''`.`''''''':|@#######################@@&|:'`.`';!
//:::::::::``'''''';%@######################@@##@@&!::'';;;
//::;::::::`.''''';%@@@@####################$%@##@@%;:'':;!
//:;;;;::::``':;%@@@#########################&%&##@@|:'';;!
//;;!;;;;;;'`::;%@#############################@@##@$!'';!!
//;;;;;;;;:``':::::;|$@############################@$!'`;!!
//::;;;;;;:'`'::::::;!$@#######################&&@$$$;``:;;
//`````````..````````'|@#####################$;!$$$&@@|''':
//'''''''''''''':'''''|@#########@&@##########@@####@@&%|!!
//''''''''':'''::'':''!&########&!|&@##########&&####&%|!||
//:::::'''::::::::::::!&########|:;|$@#########@&###&%||||!
//:::::::'''''':::::::!&#######@!:;!!$@########@$&##@%||||!
//
// だからよ...止まるじゃねえぞ
// */
#include <vector>
#include <algorithm>
#include <string>
#include<cstring>
#include <iostream>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <unordered_map>
#include <bitset>
#include <cassert>
#include <chrono>
#include <random>
#include <iomanip>
#include <unordered_set>
#include <ctime>
#include <chrono>
using namespace std;
// #define ll long long
const int N =1e6+10;
#define PII pair<int , int >
#define all(x) (x).begin(),(x).end()
#define rall(x) (x).rbegin(),(x).rend()
#define pb push_back
#define sz(x) (int)(x).size()
typedef long long ll;
typedef long double ld;
mt19937 rnd(chrono::high_resolution_clock::now().time_since_epoch().count());
int n , m ,t ;
#define __i __int128
//ll mod = 1e9+7;
string manacher(string s){
if(s.size()<2)return s;
string t ;t+='$';
for(int i=0;i<s.size();i++)
t +='#'+s[i];
t+='@';
int num = t.size();
int p[num];
int id =0 , mx= 0;
int maxl = -1;
int index =0;
for(int j=1 ;j<num-1;j++){
p[j] = mx>j?min(p[2*id-j],mx - j):1;
while(t[j+p[j]]==t[j-p[j]])p[j]++;
if(mx<p[j]+j){
mx = p[j]+j;
id = j;
}
if(maxl < p[j]+ 1){
maxl = p[j]-1 ;
index = j;
}
}
int start = (index - maxl)/2;
//cout <<start<<endl;
return s.substr(start ,start+maxl);
}
int ar[100010];int br[100010];
vector<int >v[100010];
int main(){
ios::sync_with_stdio(0);
cin.tie(0), cout.tie(0);
cin>>n;int cnt =0 ;int sum =0;
for(int i=0 ;i<n;i++){
cin >>ar[i];
v[n-ar[i]].push_back(i);
}
int num = 1 ;
for(int i=1;i<=n;i++){
if(v[i].size()%i )return cout<<"Impossible"<<endl,0 ;
for(int j = 0;j<v[i].size();j++){
br[v[i][j]] = num ;
if((j+1)%i==0)num ++ ;
}
}
cout<<"Possible"<<endl;
for(int i=0;i<n;i++)cout<<br[i]<<" ";cout<<endl;
return 0;
}