P7167 小白有个循环范围搞不懂
查看原帖
P7167 小白有个循环范围搞不懂
724018
exturn楼主2022/8/3 15:54
#include <iostream>
using namespace std;
const int maxn = 100005;
int d[maxn], c[maxn], dpmax[maxn][20], logg2[maxn], f[maxn][20], g[maxn][20];
int n, q;
int rmq(int l, int r)
{
    int k = logg2[r - l + 1];
    return max(dpmax[l][k], dpmax[r - (1 << k) + 1][k]);
}
int main()
{
    cin >> n >> q;
    for (int i = 1; i <= n; i++)
        cin >> d[i] >> c[i];
    d[n + 1] = 1000000001;
    c[n + 1] = 1000000001;
    for (int i = 2; i <= n; i++)
        logg2[i] = logg2[i >> 1] + 1;
    for (int i = 1; i <= n; i++)
        dpmax[i][0] = d[i];
    for (int j = 1; (1 << j) <= n; j++)
        for (int i = 1; i + (1 << j) - 1 <= n; i++)
        {
            dpmax[i][j] = max(dpmax[i][j - 1], dpmax[i + (1 << j - 1)][j - 1]);
        }
    for (int i = 1; i <= n; i++)
    {
        int l = i + 1, r = n + 1;
        while (l < r)
        {
            int mid = (l + r) >> 1;
            if (rmq(l, mid) > d[i])
            {
                r = mid;
            }
            else
                l = mid + 1;
        }
        f[i][0] = l;
        g[i][0] = c[f[i][0]];
    }
    f[n][0] = n + 1;
    g[n][0] = c[f[n][0]];
    for (int j = 1; (1 << j) <= n; j++)
        for (int i = 1; i + (1 << j) - 1 <= n; i++)
            //此处循环条件改为i<=n就可以了   但想了好久也不知道为什么i+(1<<j)-1不可
        {
            f[i][j] = f[f[i][j - 1]][j - 1];
            g[i][j] = g[i][j - 1] + g[f[i][j - 1]][j - 1];
        }
    while (q--)
    {
        int r, v;
        cin >> r >> v;
        if (v > c[r])
        {
            v -= c[r];
            for (int i = 16; i >= 0; i--)
            {
                if (g[r][i]&&g[r][i] < v)
                {
                    v -= g[r][i];
                    r = f[r][i];
                }
            }
                r = f[r][0];
        }
        if (r == n + 1)
            r = 0;
        cout << r << endl;
    }
    return 0;
}
2022/8/3 15:54
加载中...