Southeastern European Regional Programming Contest Bucharest, Romania – Vinnytsya, Ukraine October 21, 2017
K - Escape Room
题目链接:http://codeforces.com/gym/101669/attachments
解题心得:
- 其实仔细观察一下就很容易发现规律,先从小到大将递增子序列指数给排序,然后从指数为1的开始将1-n从大到小分别安排进去就行了。
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5+100;
struct Node {
int va, num, pos;
}node[maxn];
int n;
priority_queue <int> qu;
vector <Node> ve[maxn];
set <int> se;
void init() {
scanf("%d", &n);
for(int i=1;i<=n;i++) {
scanf("%d", &node[i].va);
node[i].pos = i;
ve[node[i].va].push_back(node[i]);
se.insert(node[i].va);
qu.push(i);
}
}
int main() {
//freopen("1.in", "r", stdin);
//freopen("1.out", "w", stdout);
init();
set <int> :: iterator iter;
for(iter=se.begin();iter!=se.end();iter++) {
int k = *iter;
for(int i=0;i<ve[k].size();i++) {
node[ve[k][i].pos].num = qu.top();
qu.pop();
}
}
for(int i=1;i<=n;i++)
printf("%d ", node[i].num);
return 0;
}