CF1857D 题解

洛谷传送门 & CF 传送门

思路

先吐槽一下:CF 咋又来诈骗题了啊,一看是到图论题,但实际上咋和图半毛钱关系都没有啊!

这题给的原式是 aiajbibja_i-a_j\ge b_i-b_j,我们可以对原式做点手脚(移一下项),会变成 aibiajbja_i-b_i\ge a_j-b_j。所以我们只要按照 aibia_i-b_i 从大到小排序就可以了,而到达其它所有点的点就是 aibia_i-b_i 最大的几个点了。

代码

# include <bits/stdc++.h> //万能头
using namespace std;
int t, n, x, sum;
struct node {
	int v, id;
	bool operator < (const node& x) const { //重载运算符,当然也可以用 cmp 代替
		if (v != x.v)
			return v > x.v;
		return id < x.id;
	}
} a[200005];
int main () {
	cin >> t;
	while (t --) {
		cin >> n;
		sum = 0; //多组数据要清空!
		for (int i = 0; i < n; ++ i)
			cin >> a[i].v, a[i].id = i + 1;
		for (int i = 0; i < n; ++ i)
			cin >> x, a[i].v -= x; //a[i]-b[i]
		sort (a, a + n); //排序
		for (int i = 0; i < n; ++ i)
			if (a[i].v == a[0].v) //和最大值相同
				++ sum;
			else
				break ;
		cout << sum << '\n';
		for (int i = 0; i < n; ++ i)
			if (a[i].v == a[0].v)
				cout << a[i].id << ' ';
			else
				break ;
		cout << '\n'; //别忘了换行!
	}
	return 0;
}
posted @ 2023-08-08 16:46  Vitamin_B  阅读(7)  评论(0)    收藏  举报  来源