求助:35pts,莫名 WA
查看原帖
求助:35pts,莫名 WA
365751
Mr_罗楼主2022/9/8 22:01

我也不知道为什么就

#include <bits/stdc++.h>
using namespace std;

#define ll long long

const int N = 100010;
int n, m, x0, da, db;
int a[N], k[N], x[N];
int f[18][N][2];
int ga[18][N][2];
int gb[18][N][2];
int ans;
double mn;

struct node
{
    int id, h;
    friend bool operator <(node a, node b)
    {
        return a.h < b.h;
    }
};
multiset<node> s;

void calc (int s, int x)
{
    int i = s;
    da = db = 0;
    for (int k = 17; k >= 0; k--)
    {
        if (f[k][i][0] && da + ga[k][i][0] + db + gb[k][i][0] <= x)
        {
            da += ga[k][i][0];
            db += gb[k][i][0];
            i = f[k][i][0];
        }
    }
}

int main()
{
    cin >> n;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    cin >> x0 >> m;
    for (int i = 1; i <= m; i++)
        cin >> k[i] >> x[i];
    a[0] = INT_MAX;
    a[n + 1] = INT_MIN;
    s.insert ({0, a[0]});
    s.insert ({0, a[0]});
    s.insert ({n + 1, a[n + 1]});
    s.insert ({n + 1, a[n + 1]});
    for (int i = n; i; i--)
    {
        int p, q;
        node t = {i, a[i]};
        s.insert (t);
        auto it = s.lower_bound (t);
        it--;
        int lt = (*it).id;
        int lh = (*it).h;
        it++;
        it++;
        int nt = (*it).id;
        int nh = (*it).h;
        it--;
        if (abs (nh - a[i]) >= abs (lh - a[i]))
        {
            q = lt;
            it--;
            it--;
            if (abs (nh - a[i]) >= abs ((*it).h - a[i]))
                p = (*it).id;
            else
                p = nt;
        }
        else
        {
            q = nt;
            it++;
            it++;
            if (abs ((*it).h - a[i]) >= abs (lh - a[i]))
                p = lt;
            else
                p = (*it).id;
        }
        f[0][i][0] = p;
        f[0][i][1] = q;
        ga[0][i][0] = abs (a[i] - a[p]);
        gb[0][i][1] = abs (a[i] - a[q]);
    }
    for (int i = 1; i <= n; i++)
    {
        for (int j = 0; j < 2; j++)
        {
            f[1][i][j] = f[0][f[0][i][j]][1 - j];
            ga[1][i][j] = ga[0][i][j] + ga[0][f[0][i][j]][1 - j];
            gb[1][i][j] = gb[0][i][j] + gb[0][f[0][i][j]][1 - j];
        }
    }
    for (int k = 2; k < 18; k++)
    {
        for (int i = 1; i <= n; i++)
        {
            for (int j = 0; j < 2; j++)
            {
                f[k][i][j] = f[k - 1][f[k - 1][i][j]][j];
                ga[k][i][j] = ga[k - 1][i][j] + ga[k - 1][f[k - 1][i][j]][j];
                gb[k][i][j] = gb[k - 1][i][j] + gb[k - 1][f[k - 1][i][j]][j];
            }
        }
    }
    mn = INT_MAX * 1.0;
    for (int i = 1; i <= n; i++)
    {
        calc (i, x0);
        double k = 1.0 * da / db;
        if (mn > k)
        {
            mn = k;
            ans = i;
        }
        else if (mn == k && a[i] > a[ans])
        {
            ans = i;
        }
    }
    cout << ans << endl;
    for (int i = 1; i <= m; i++)
    {
        calc (k[i], x[i]);
        cout << da << ' ' << db << endl;
    }
    return 0;
}
2022/9/8 22:01
加载中...