单调栈+倍增 TLE求调
查看原帖
单调栈+倍增 TLE求调
1569976
SpeedNoclippers楼主2025/2/7 18:38
#include<bits/stdc++.h>
using namespace std;
const int MAXN=100005;
int d[MAXN],c[MAXN],n,q,nxt[MAXN][20];

void pre(int n){
    stack<int> st;
    for(int i=n;i>=1;i--){
        while(!st.empty()&&d[st.top()]<=d[i])st.pop();
        nxt[i][0]=st.empty()?0:st.top();
        st.push(i);
    }
    for(int j=1;j<20;j++){
        for(int i=1;i<=n;i++){
            if(nxt[i][j-1]!=0){nxt[i][j]=nxt[nxt[i][j-1]][j-1];}
            else{nxt[i][j]=0;}
        }
    }
}

int qu(int r,int v){
    int cur=r;
    while(v>c[cur]){
        v-=c[cur];
        if(nxt[cur][0]==0)return 0;
        for(int j=19;j>=0;j--){
            if(nxt[cur][j]!=0&&d[nxt[cur][j]]<=d[r]){cur=nxt[cur][j];}
        }
        cur=nxt[cur][0];
    }
    return cur;
}

int main(){
    cin>>n>>q;
    for(int i=1;i<=n;i++){cin>>d[i]>>c[i];}
    pre(n);
    for(int i=1;i<=q;i++){
        int r,v;cin>>r>>v;
        cout<<qu(r,v)<<endl;
    }
    return 0;
}

提交结果:(https://www.luogu.com.cn/record/201834039)

2025/2/7 18:38
加载中...