CF1857D 题解
思路
先吐槽一下:CF 咋又来诈骗题了啊,一看是到图论题,但实际上咋和图半毛钱关系都没有啊!
这题给的原式是 ,我们可以对原式做点手脚(移一下项),会变成 。所以我们只要按照 从大到小排序就可以了,而到达其它所有点的点就是 最大的几个点了。
代码
# 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;
}

浙公网安备 33010602011771号