1 条题解
-
0
#include <bits/stdc++.h> #define ll long long using namespace std; const int N=100005; int n,m,k,s,t,Q,f[N][21];//f[u][i]表示u往下走2^i步走到哪个盘 int sta[N],top,d[N],c[N],R,V; ll g[N][21];//g[u][i]表示u往下走2^i步至少要多少水 int main(){ freopen("in.txt","r",stdin); cin>>n>>Q; for (int i=1;i<=n;++i) cin>>d[i]>>c[i];//d直径,c容量 d[n+1]=c[n+1]=0x3f3f3f3f; for (int i=1;i<=n+1;++i){ g[i][0]=c[i]+1; while (top && d[sta[top]]<d[i]){ f[sta[top]][0]=i; --top; } sta[++top]=i; } f[n+1][0]=n+1; for (int j=1;j<=20;++j) for (int i=1;i<=n+1;++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]-1; } for (int i=1;i<=Q;++i){ cin>>R>>V;//第R个圆盘倒入V的水 for (int j=20;j>=0;--j) if (V>=g[R][j]){ V-=(g[R][j]-1); R=f[R][j]; } if (R==n+1) cout<<0<<"\n"; else cout<<R<<"\n"; } }
- 1
信息
- ID
- 781
- 时间
- 1500ms
- 内存
- 512MiB
- 难度
- 10
- 标签
- 递交数
- 3
- 已通过
- 2
- 上传者