
思路:
因为根据等比数列求和公式, n k > n 1 + n 2 + n 3 + … + n k − 1 n^k>n^1+n^2+n^3+…+n^{k-1} nk>n1+n2+n3+…+nk−1,所以从后往前,考虑当前最大没有选择过的数连着后面的所有部分全部移走。
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <iostream>
#include <vector>using namespace std;
typedef long long ll;
const int maxn = 1e5 + 7;
int pos[maxn],a[maxn];int main() {int T;scanf("%d",&T);while(T--) {int n;scanf("%d",&n);for(int i = 1;i <= n;i++) {scanf("%d",&a[i]);pos[a[i]] = i;}int pre = n + 1;vector<pair<int,int>>ans;for(int i = n;i >= 1;i--) {if(pos[i] < pre) {ans.push_back({pos[i],pre});pre = pos[i];}}for(int i = 0;i < ans.size();i++) {for(int j = ans[i].first;j < ans[i].second;j++) {printf("%d ",a[j]);}}printf("\n");}return 0;
}