求助大佬 ST表综合题目
查看原帖
求助大佬 ST表综合题目
246331
mystic_qwq楼主2024/4/1 14:12

基本照抄身入浅出的,没想到才30分。。我还是太菜了吗

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+1;
int n,q,d[N],c[N],f[N][17],g[N][17],Max[N][17];
int qry(int l,int r){
  int k=log2(r-l+1);
  return max(Max[l][k],Max[r-(1<<k)+1][k]);
}
main(){
  cin>>n>>q;
  for(int i=1;i<=n;++i)cin>>d[i]>>c[i],*Max[i]=d[i];
  for(int j=1;(1<<j)<=n;++j)
    for(int i=1;i+(1<<j)-1<=n;++i)
      Max[i][j]=max(Max[i][j-1],Max[i+(1<<j-1)][j-1]);
  c[n+1]=1e9;
  for(int i=1;i<n;++i){
    int l=i+1,r=n+1,mid;
    while(l<=r){
      mid=l+r>>1;
      if(qry(i+1,mid)<=d[i])l=mid+1;
      else r=mid-1;
    }
    f[i][0]=r+1;
    g[i][0]=c[r+1];
  }
  f[n][0]=n+1,g[n][0]=1e9;
  //f[n+1][0]=n+1;
  //for(int j=1;(1<<j)<=n;++j)
    //for(int i=1;i+(i<<j)-1<=n;++i){
  for(int j=1;(1<<j-1)<=n;++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];
    }
  for(int r,v;q--;){
    cin>>r>>v;
    if(v>c[r])v-=c[r];
    else {cout<<r<<'\n';continue;}
    //for(int i=log2(n);~i;--i)
    for(int i=log2(n)+1;~i;--i)
      if(v>g[r][i])
        v-=g[r][i],r=f[r][i];//类似二分 
    r=f[r][0];//再来一次
    cout<<(r==n+1?0:r)<<'\n';
  }
}
2024/4/1 14:12
加载中...