求hack样例。
这是题面
我的思路就是先把b数组消去连续的重复元素,例如【1,1,2,3,3】改为【1,2,3】,设为_b数组,在a数组中依次标记去重后的_b数组元素,记录下标。如果有元素找不到就可以return 输出NO。如果可以的话,我记录b数组每个重复元素的区间。我之前已经在a数组标记了下标,就可以将利用了标记的a数组中的元素在对应区间进行左右滑动操作。使其成为b数组,然后我记录变动操作就好了。但是我有一个问题。
_b 存储压缩后的b数组(去除连续重复元素)
pos 记录_b中每个元素在a数组中的位置
sg 存储b数组中连续相同元素的区间
op 存储最终生成的操作序列
#pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast","inline") #include <bits/stdc++.h> using namespace std; #define endl '\n' #define int long long typedef pair<int, int> pii; const int N = 1e6 + 100; const int inf = LLONG_MAX; const double eps = 1e-6; const int mod = 1e9+7; struct xx { char c; int l, r; }; void miaojiachun() { int n; cin >> n; vector<int> a(n + 1); vector<int> b(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { cin >> b[i]; } vector<int> _b; int las = -1; for (int i = 1; i <= n; i++) { if (b[i] != las) { _b.push_back(b[i]); las = b[i]; } } vector<int> pos(_b.size() + 1);//记录每个元素在a中的位置。 int j = 0; for (int i = 1; i <= n and j < _b.size(); i++) { if (a[i] == _b[j]) { pos[j + 1] = i; j++; } } if (j != _b.size()) { cout << "NO" << endl; return; } // 分个b数组为连续相同元素的区间。 vector<pair<int, int>> sg; for (int i = 1; i <= n;) { int str = i; while (i <= n and b[i] == b[str]) { i++; } sg.emplace_back(str, i - 1); } vector<pair<char, pii>> op; for (int i = 0; i < sg.size(); i++) { int l = sg[i].first; int r = sg[i].second; int pos_a = pos[i + 1]; if (l < pos_a) { op.emplace_back('L', make_pair(l - 1, pos_a - 1)); } } for (int i = sg.size() - 1; i >= 0; i--) { int l = sg[i].first; int r = sg[i].second; int pos_a = pos[i + 1]; if (r > pos_a) { op.emplace_back('R', make_pair(pos_a - 1, r - 1)); } } cout << "YES" << endl; cout << op.size() << endl; for (auto c : op) { cout << c.first << " " << c.second.first << " " << c.second.second << endl; } } signed main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int ING = 1; // cin >> ING; while (ING--) { miaojiachun(); } return 0; } /* YES 2 R 2 3 R 0 1 */
#pragma GCC optimize(1) #pragma GCC optimize(2) #pragma GCC optimize(3,"Ofast","inline") #include <bits/stdc++.h> using namespace std; #define endl '\n' #define int long long typedef pair<int, int> pii; const int N = 1e6 + 100; const int inf = LLONG_MAX; const double eps = 1e-6; const int mod = 1e9+7; struct xx { char c; int l, r; }; void miaojiachun() { int n; cin >> n; vector<int> a(n + 1); vector<int> b(n + 1); for (int i = 1; i <= n; i++) { cin >> a[i]; } for (int i = 1; i <= n; i++) { cin >> b[i]; } vector<int> _b; int las = -1; for (int i = 1; i <= n; i++) { if (b[i] != las) { _b.push_back(b[i]); las = b[i]; } } vector<int> pos(_b.size() + 1);//记录每个元素在a中的位置。 int j = 0; for (int i = 1; i <= n and j < _b.size(); i++) { if (a[i] == _b[j]) { pos[j + 1] = i; j++; } } if (j != _b.size()) { cout << "NO" << endl; return; } // 分个b数组为连续相同元素的区间。 vector<pair<int, int>> sg; for (int i = 1; i <= n;) { int str = i; while (i <= n and b[i] == b[str]) { i++; } sg.emplace_back(str, i - 1); } vector<pair<char, pii>> op; for (int i = 0; i < sg.size(); i++) { int l = sg[i].first; int r = sg[i].second; int pos_a = pos[i + 1]; if (l < pos_a) { op.emplace_back('L', make_pair(l - 1, pos_a - 1)); } if (r > pos_a) { op.emplace_back('R', make_pair(pos_a - 1, r - 1)); } } cout << "YES" << endl; cout << op.size() << endl; for (auto c : op) { cout << c.first << " " << c.second.first << " " << c.second.second << endl; } } signed main() { ios::sync_with_stdio(false), cin.tie(0), cout.tie(0); int ING = 1; // cin >> ING; while (ING--) { miaojiachun(); } return 0; } /* YES 2 R 2 3 R 0 1 */
他们变动的地方只有
这部分。
但这个就错了,能不能告诉我为什么。给个hack样例,或者告诉我为啥错呗。