题解:CF479D Long Jumps
显然的,答案至多为
当差有
若只有
否则
考虑是否有间隔长度为
否则就是类似这种(红色为原有点,蓝色为新加的点):
此时就是判断有没有长度为
#include <bits/stdc++.h>
using namespace std;
int n, l, x, y;
int a[100010];
map<int, int> ma;
int main() {
scanf("%d%d%d%d", &n, &l, &x, &y);
for (int i = 1; i <= n; ++i) scanf("%d", &a[i]), ma[a[i]] = 1;
int cntx = 0, cnty = 0;
for (int i = 1; i <= n; ++i) {
if (ma[a[i] + x]) ++cntx;
if (ma[a[i] + y]) ++cnty;
}
cntx = min(cntx, 1);
cnty = min(cnty, 1);
if (cntx + cnty == 2) puts("0");
else if (cntx + cnty == 1) {
if (cntx == 1) {
puts("1");
printf("%d\n", y);
} else {
puts("1");
printf("%d\n", x);
}
}
else {
for (int i = 1; i <= n; ++i) if (ma[a[i] + x + y]) {
puts("1");
printf("%d\n", a[i] + x);
return 0;
} else if (ma[a[i] + y - x] && a[i] + y <= l) {
puts("1");
printf("%d\n", a[i] + y);
return 0;
} else if (ma[a[i] + y - x] && a[i] - x >= 0) {
puts("1");
printf("%d\n", a[i] - x);
return 0;
}
puts("2");
printf("%d %d\n", x, y);
}
return 0;
}