2020 ICPC 亚洲区域赛(南京)L Let’s Play Curling
思路分析:
其实这个题,一开始的思路拐进了一个很奇怪的角落,因为是绝对值嘛,所以总想着平方去掉绝对值,然后就是很长一段时间的无功而返,后来因为队友说了句数轴,思路开始转向了将这些数据转换到数轴上,然后就发现了这个题用数轴来理解非常好理解,其实就是找相邻两蓝色点内,红色点最多的个数
,如果没有则输出Impossible。
建议动手画一下数轴,这里就不再画了。
所以说这个题,告诉我,绝对值,不一定非要平方(诶,感觉有点高中思维的影子),将问题可视化的转换为一个数学问题不失为一个好方法,数轴的转变就特别巧妙,绝对值也变成了点与点之间的距离,然后加上自己的理解,就能快乐AC啦~
AC代码:
#include <bits/stdc++.h>
#define ll long long
const ll N = 1e5 + 10;
using namespace std;
int a[N];
int b[N];
int main() {
int t;
scanf("%d", &t);
ll n, m;
while (t--) {
scanf("%lld%lld", &n, &m);
for (ll i = 0; i < n; i++) {
scanf("%lld", &a[i]);
}
for (ll i = 0; i < m; i++) {
scanf("%lld", &b[i]);
}
sort(a, a + n);
sort(b, b + m);
b[m] = 1e9 + 10;
ll k;
for (k = 0; k < n; k++) {
if (a[k] >= b[0])
break;
}
ll ans = k;
for (int i = 0, j = k; j < n && i < m; i++) {
while (j < n && a[j] <= b[i])
j++;
if (j >= n)
break;
ll rec = j;
while (j < n && a[j] < b[i + 1])
j++;
ans = max(ans, j - rec);
}
if (ans == 0) {
printf("Impossible\n");
} else
printf("%lld\n", ans);
}
return 0;
}