只过了两个点求助!!!!!!!!!
查看原帖
只过了两个点求助!!!!!!!!!
824941
bsjsaikou10楼主2023/8/13 10:28
#include <iostream>
using namespace std;
const int MAXN = 2e5 + 10;
int a[MAXN];
int c[MAXN];
int n,q;
int log_2[MAXN];
int st_max[MAXN][30],st_min[MAXN][30];
int f[MAXN][30],g[MAXN][30];
void program_st(){
    for(int i = 2;i <= MAXN;i++){
        log_2[i] = log_2[i >> 2] + 1;
    }
    for(int i = 1;i <= n;i++){
        st_max[i][0] = st_min[i][0] = a[i];
    }
    for(int j = 1;(1 << j) <= n;j++){
        for(int i = 1;i + (1 << j) - 1 <= n;i++){
            st_max[i][j] = max(st_max[i][j - 1],st_max[i + (1 << (j - 1))][j - 1]);
            st_min[i][j] = min(st_min[i][j - 1],st_min[i + (1 << (j - 1))][j - 1]);
        }
    }
}
int query_max(int l,int r){
    int k = log_2[r - l + 1];
    return max(st_max[l][k],st_max[r - (1 << k) + 1][k]);
}
int query_min(int l,int r){
    int k = log_2[r - l + 1];
    return min(st_min[l][k],st_min[r - (1 << k) + 1][k]);
}
void program_binary(){
    for(int i = 1;i <= n;i++){
        int l = i + 1;
        int r = n + 1;
        while(l < r){
            int mid = (l + r) >> 1;
            if(query_max(i + 1,mid) <= a[i]){
                l = mid + 1;
            }
            else{
                r = mid;
            }
            f[i][0] = l;
            g[i][0] = c[l];
        }
    }
}
void program_fg(){
    for(int i = 1;i<=n;i++){
        for(int j = 1;i + (1 << j) - 1<= n;j++){
            f[i][j] = f[f[i][j-1]][j-1];
            g[i][j] = g[i][j - 1] + g[f[i][j - 1]][j - 1];
        }
    }
}
void program(){
    c[n + 1] = 1e9;
    program_st();
    program_binary();
    f[n][0] = n + 1;
    g[n][0] = c[n + 1];
    program_fg();
}
int main(){
    cin>>n>>q;
    for(int i = 1;i<=n;i++){
        cin>>a[i]>>c[i];
    }
    program();
    while(q--){
        int r,v;
        cin>>r>>v;
        if(c[r] < v){
            v -= c[r];
            int lg = log_2[n + 1];
            for(int k = lg;k >= 0;k--){
                if(g[r][k] < v){
                    v -= g[r][k];
                    r = f[r][k];
                }
            }
            if((1 << lg) != n + 1){
                r = f[r][0];
            }
        }
        if(r == n + 1){
            cout<<0<<endl;
            continue;
        }
        cout<<r<<endl;
    }
}

2023/8/13 10:28
加载中...