为什么这道题题解里没人写尺取法呢?
查看原帖
为什么这道题题解里没人写尺取法呢?
636411
xdzfxl2012楼主2024/8/31 17:16

看了一眼题解,没有题解写尺取法(截至2024.8.31)
首先献上我丑陋的代码:

#include <iostream>
#include <algorithm>
using namespace std;
int n, m, b[100005], t[100005], cur;
struct P {int id, x;} a[100005], ans[100005];
bool cmp1(P x, P y) {return x.x < y.x;}
bool cmp2(P x, P y) {return x.id < y.id;}
int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i].x;
		a[i].id = i;
	}
	for (int i = 1; i <= m; ++i) cin >> b[i];
	sort(a + 1, a + n + 1, cmp1);
	sort(b + 1, b + m + 1);
	int j = 1;
	for (int i = 1; i <= n; ++i) {
		while (j < m && a[i].x > b[j]) ++j;
		if (a[i].x == b[j]) ans[++cur] = a[i];
	}
	sort(ans + 1, ans + cur + 1, cmp2);
	for (int i = 1; i <= cur; ++i) cout << ans[i].x << ' ';
	return 0;
}

因为排序是O(nlogn)的,所以这种方法相对于二分来说没什么优势(好像还更绕一些)但24篇题解中没有一篇使用这个方法写,我还挺吃惊的。


彩蛋:
如果题目要求按编号顺序输出,还可以简化成这样:

#include <iostream>
#include <algorithm>
using namespace std;
int n, m, a[100005], b[100005];
int main() {
	cin >> n >> m;
	for (int i = 1; i <= n; ++i) cin >> a[i];
	for (int i = 1; i <= m; ++i) cin >> b[i];
	sort(a + 1, a + n + 1);
	sort(b + 1, b + m + 1);
	int j = 1;
	for (int i = 1; i <= n; ++i) {
		while (j < m && a[i] > b[j]) ++j;
		if (a[i] == b[j]) cout << a[i] << ' ';
	}
	return 0;
}

悄悄说一句,我一开始就是这样WA的(逃

2024/8/31 17:16
加载中...