1 条题解

  • 0
    @ 2024-6-1 18:39:47
    #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
    上传者