求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样例,或者告诉我为啥错呗。

全部评论

相关推荐

我的名字是句号:接好运
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务