求助,样例2过不了
查看原帖
求助,样例2过不了
207812
Chouquet楼主2022/7/17 19:56

如题,调了几个小时了,全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;
}
2022/7/17 19:56
加载中...