如题,调了几个小时了,全WA。
#include <cstdio>
#include <set>
#define MAXN 100000
#define abs(x) ((x) < 0 ? -(x) : (x))
#define INF (1 << 30)
typedef long long ll;
struct Node {
ll x; int id;
bool operator<(const Node &rhs) const{
if (x == rhs.x) return id < rhs.id;
return x < rhs.x;
}
};
std::multiset<Node> S;
int n, mnpos[MAXN + 3][2], m;//0:the nearest, 1:the second nearest
ll h[MAXN + 3], fa[2][23][MAXN + 3], fb[2][23][MAXN + 3], g[2][23][MAXN + 3];
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%lld", &h[i]);
S.insert((Node){h[0] = 2000000000, 0}), S.insert((Node){h[n + 1] = -2000000000, n + 1});
//S.insert((Node){h[n], n}), mnpos[n][0] = mnpos[n][1] = INF;
for (int i = n; i >= 1; i--) {
std::multiset<Node>::iterator it = S.lower_bound((Node){h[i], i});
// printf("%d:%lld %d\n", i, it->x, it->id);
Node mn1 = *it, mn2 = *it;
--it;
// printf("%d:%lld %d\n", i, it->x, it->id);
if (abs(mn1.x - h[i]) > abs(it->x - h[i])) mn2 = mn1, mn1 = *it;
else if (abs(mn1.x - h[i]) == abs(it->x - h[i]) && h[it->id] < h[mn1.id])
mn2 = mn1, mn1 = *it;
else
mn2 = *it;
mnpos[i][0] = mn1.id, mnpos[i][1] = mn2.id;
//printf("%d:%d %d %lld %lld\n", i, mnpos[i][0], mnpos[i][1], abs(h[i] - h[mnpos[i][0]]), abs(h[i] - h[mnpos[i][1]]));
S.insert((Node){h[i], i});
g[0][0][i] = mnpos[i][1];
g[1][0][i] = mnpos[i][0];
fa[0][0][i] = abs(h[i] - h[mnpos[i][1]]);
fb[1][0][i] = abs(h[i] - h[mnpos[i][0]]);
}
// for (int i = 1; i <= n; i++)
// printf("%d %d\n", mnpos[i][0], mnpos[i][1]);
for (int j = 1; j <= 20; j++)
for (int i = 1; i <= n; i++)
for (int k = 0; k < 2; k++) {
if (j > 1) {
g[k][j][i] = g[k][j - 1][g[k][j - 1][i]];
fa[k][j][i] = fa[k][j - 1][i] + fa[k][j - 1][g[k][j - 1][i]];
fb[k][j][i] = fb[k][j - 1][i] + fb[k][j - 1][g[k][j - 1][i]];
}
else {
g[k][j][i] = g[k ^ 1][j - 1][g[k][j - 1][i]];
fa[k][j][i] = fa[k][j - 1][i] + fa[k ^ 1][j - 1][g[k][j - 1][i]];
fb[k][j][i] = fb[k][j - 1][i] + fb[k ^ 1][j - 1][g[k][j - 1][i]];
}
}
int x0, anss0 = 0; scanf("%d", &x0);
ll ansa = -1, ansb = -1;
for (int s0 = 1; s0 <= n; s0++) {
ll a = 0, b = 0;
int pos = s0;
for (int i = 20; i >= 0; i--)
if (g[0][i][pos] && a + b + fa[0][i][pos] + fb[0][i][pos] <= x0)
a += fa[0][i][pos], b += fb[0][i][pos], pos = g[0][i][pos];
if (ansa == -1 && ansb == -1) ansa = a, ansb = b, anss0 = s0;
else {
if (ansa * b > a * ansb) ansa = a, ansb = b, anss0 = s0;
else if (ansa * b == a * ansb && h[anss0] < h[s0] && (a || b))
anss0 = s0;
}
}
printf("%d\n", anss0);
scanf("%d", &m);
while (m--) {
int s, x; scanf("%d%d", &s, &x);
ll a = 0, b = 0;
int pos = s;
for (int i = 20; i >= 0; i--)
if (g[0][i][pos] && a + b + fa[0][i][pos] + fb[0][i][pos] <= x)
a += fa[0][i][pos], b += fb[0][i][pos], pos = g[0][i][pos];
printf("%lld %lld\n", a, b);
}
return 0;
}