P7167求助
查看原帖
P7167求助
734379
Shadow_T楼主2023/2/5 12:30
#include <bits/stdc++.h>
using namespace std;
const int N=100001;
int n,d[N],next[N],rmax[N][21],c[N],log_2[N],f[N][21],g[N][21],q,ans[N];
void init()
{
    for(int i=1;i<=n;i++)
    rmax[i][0]=d[i];
    for(int j=1;(1<<j)<=n;j++)
    for(int i=1;i<=n-(1<<j)+1;i++)
    rmax[i][j]=max(rmax[i][j-1],rmax[i+(i<<j-1)][j-1]);
}
int RMQ(int l,int r)
{
    int k=log_2[r-l+1];
    return max(rmax[l][k],rmax[r-(1<<k)+1][k]);
}
int main()
{
    scanf("%d%d",&n,&q);
    for(int i=1;i<=n;i++)
    scanf("%d%d",&d[i],&c[i]);
    for(int i=2;i<=n;i++)
    log_2[i]=log_2[i>>1]+1; 
    init();
    c[n+1]=1000000000;
    for(int i=1;i<n;i++)
    {
        int l=i+1,r=n+1,mid;
        while(l<r)
        {
            mid=l+r>>1;
            if(RMQ(i+1,mid)<=d[i])
            l=mid+1;
            else r=mid;
        }
        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;j<=16;j++)
    for(int i=1;i<=n;i++)
    {
        f[i][j]=f[f[i][j-1]][j-1];
        g[i][j]=g[i][j-1]+g[f[i][j-1]][j-1];
    }
    int cnt=0;
    while(q--)
    {
        int r,v;
        scanf("%d%d",&r,&v);
        if(v>c[r])
        {
            v-=c[r];
            for(int i=16;i>=0;i--)
            if(v>g[r][i])
            {
                v-=g[r][i];
                r=f[r][i];
            }
            r=f[r][0];
        }
        if(r==n+1) r=0;
        ans[++cnt]=r;
    }
    for(int i=1;i<=cnt;i++)
    printf("%d\n",ans[i]);
}

0分,[哭] 样例输出:5 0 5 4 2

我的输出:0 0 5 4 2

一字之差,到底错在哪里?求神犇指点

2023/2/5 12:30
加载中...