题目:
http://codeforces.com/contest/534/problem/D
好水的D题=.=
vecotr大法,加递推.
AC.
#include <iostream>
#include <cstdio>
#include <vector>
using namespace std;
const int maxn = 2e5+5;
vector<int> v[maxn];
int ans[maxn];
int main()
{
//freopen("in", "r", stdin);
int n;
while(~scanf("%d", &n)) {
for(int i = 0; i < n; ++i) v[i].clear();
for(int i = 1; i <= n; ++i) {
int a;
scanf("%d", &a);
v[a].push_back(i);
}
int cnt = 0, s = 0;
while(1) {
int tmp = s;
if(v[cnt].size()) {
ans[s++] = v[cnt][v[cnt].size()-1];
v[cnt].pop_back();
cnt++;
}
else if(cnt - 3 >= 0) {
while(v[cnt].empty()) cnt -= 3;
if(cnt >= 0 && v[cnt].size()) {
ans[s++] = v[cnt][v[cnt].size()-1];
v[cnt].pop_back();
cnt++;
}
}
//printf("%d %d\n", cnt, ans[s-1]);
if(tmp == s || s == n || cnt < 0) break;
}
if(s == n) {
printf("Possible\n");
printf("%d", ans[0]);
for(int i = 1; i < s; ++i) {
printf(" %d", ans[i]);
}
printf("\n");
}
else printf("Impossible\n");
}
return 0;
}