// Problem: D. Repetitions Decoding // Contest: Codeforces - Codeforces Round #773 (Div. 2) // URL: https://codeforces.com/contest/1642/problem/D // Memory Limit: 256 MB // Time Limit: 1000 ms // 2022-02-25 13:11:50 // // Powered by CP Editor (https://cpeditor.org) #includeusing namespace std; #define rep(i,l,r) for(int i=(l);i<=(r);i++) #define per(i,l,r) for(int i=(l);i>=(r);i--) #define ll long long #define pii pair #define mset(s,t) memset(s,t,sizeof(t)) #define mcpy(s,t) memcpy(s,t,sizeof(t)) #define fi first #define se second #define pb push_back #define all(x) (x).begin(),(x).end() #define SZ(x) ((int)(x).size()) #define mp make_pair const ll mod = 1e9 + 7; inline ll qmi (ll a, ll b) { ll ans = 1; while (b) { if (b & 1) ans = ans * a%mod; a = a * a %mod; b >>= 1; } return ans; } inline int read () { int x = 0, f = 0; char ch = getchar(); while (!isdigit(ch)) f |= (ch=='-'),ch= getchar(); while (isdigit(ch)) x = x * 10 + ch - '0', ch = getchar(); return f?-x:x; } template void print(T x) { if (x < 0) putchar('-'), x = -x; if (x >= 10) print(x/10); putchar(x % 10 + '0'); } inline ll sub (ll a, ll b) { return ((a - b ) %mod + mod) %mod; } inline ll add (ll a, ll b) { return (a + b) %mod; } inline ll inv (ll a) { return qmi(a, mod - 2); } vector ins; vector a; vector lens; void solve() { a.clear(); ins.clear(); lens.clear(); int n; cin >> n; for (int i = 0; i < n ; i++) { int x; cin >> x; a.pb(x); } while (!a.empty()) { int i = a.size() - 1; int j = i - 1; while (j >= 0 && a[j] != a[i]) j --; if (j == - 1) { puts("-1"); return; } for (int k = 0; k < i - j - 1; k ++) { ins.emplace_back(mp(j + k, a[i - 1 - k])); } lens.pb(2 * (i - j)); reverse(a.begin() + j + 1, a.begin() + i); a.pop_back(); a.erase(a.begin() + j); } reverse(all(lens)); cout << ins.size() << endl; for (auto [p, c] : ins) { cout << p << " " << c << endl; } cout << lens.size() << endl; for (auto t: lens) cout << t<< " n"; puts(""); } int main () { int t; t =1; cin >> t; while (t --) solve(); return 0; }
如何构造 选择两个相同的数,然后删除,接着把两个相同之间的数反转放到后一个数的后面。 这里代码是从大到小实现的 通过找数量规律,实现代码



