---
# System prepended metadata

title: '[CODEFORCES 892D Gluttony](https://codeforces.com/contest/892/problem/D)'

---

[CODEFORCES 892D Gluttony](https://codeforces.com/contest/892/problem/D)
=

## 題目大意
給 $n$ 個**不重複**數 $a_1, a_2, \cdots, a_n$，構造一個 $a$ 數列的[排列](https://zh.wikipedia.org/wiki/%E7%BD%AE%E6%8F%9B) $b$，
使得對任意順序 $\forall k < n. x_1, x_2, \cdots, x_k$ 有 $\sum_{i=1}^k a_{x_i} \not= \sum_{i=1}^k b_{x_i}$

## 輸入
$n$
$a_1, a_2, \cdots, a_n$
## 輸出
$b_1, b_2, \cdots, b_n$

## 解法
令 $\begin{cases}
A = \sum_{i=1}^k a_{x_i} \\
B = \sum_{i=1}^k b_{x_i}
\end{cases}$ 以及 $\begin{cases}
C = \sum_{i=k+1}^n a_{x_i} \\
D = \sum_{i=k+1}^n b_{x_i}
\end{cases}$

$A = B$ 若且唯若 $C = D$，因為 $A+C = B+D$
為了使得 $A \not= B$，要設法保證 $C \not= D$

最直接的方式就是讓 $\forall i > k. b_{x_i} > a_{x_i}$
這樣一來，任意的 $D$ 都會大於 $C$ 了
> 也就是說有 $C \not= D$

做法是先將 $a$ 由小至大**排序**，接著讓 $b_i = a_{i+1}$
但這有個問題，從 $b_1$ 到 $b_{n-1}$ 設定完後，最終 $b_n$ 只能選擇 $a_1$

幸好，題目要求選擇 $x$ 的方式是**對稱**的
就是說若發生 $\exists i > k. b_{x_i} = b_n < a_{x_i}$ 則 $\forall i \le k. b_{x_i} > a_{x_i}$
那麼 $B$ 一定大於 $A$，這樣一來 $C \not= D$ 因為 $A+C = B+D$

```cpp
#include<bits/stdc++.h>
using namespace std;

int constexpr maxn = 25;

int n, a[maxn], c[maxn];

int main()
{
  cin >> n;
  for(int i = 0; i < n; i++) cin >> a[i], c[i] = a[i];
  sort(c, c+n);

  for(int i = 0; i < n; i++) {
    int p = lower_bound(c, c+n, a[i]) - c;
    cout << c[(p+1)%n] << ' '; // b_i
  }
  cout << endl;

  return 0;
}
```