小R与排列

题目大意:小 R 有 n 和一个 1~n 的排列,想求它的下一个排列(下一个排列的定义是:1~n 的所有全排列按字典序排好后,排在 A 后面的那个叫做 A 的下一个排列。字典序中最后一个排列的下一个排列认为是字典序中第一个排列)。

一眼题,从后往前找到第一个递减的,然后从这个递减的下标开始到结束找第一个大于it的

前边的不用管,直接输出就可以

代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 1e5 + 66;

int n, top, tag;
set<int>s;
int a[N], sta[N];

signed main()
{
int i; n = read();
for (i = 1; i <= n; ++ i) a[i] = read();
sta[++ top] = a[n], s.insert(a[n]);
for (i = n - 1; i >= 1; -- i)
{
s.insert(a[i]);
if (a[i] > sta[top]) sta[++ top] = a[i];
else {tag = i; break;}
}

for (i = 1; i < tag; ++ i) put(a[i]);
for (set<int>::iterator it = s.begin(); it != s.end(); ++ it)
if (*it > a[tag]) {put(*it), s.erase(it); break;}

for (set<int>::iterator it = s.begin(); it != s.end(); ++ it) put(*it);
puts("");

fclose(stdin), fclose(stdout);
return 0;
}