WA求调
查看原帖
WA求调
452621
GoldenBeach楼主2022/10/26 00:04

我用构建树+倍增lca,哪里出错了?

#include<bits/stdc++.h>
using namespace std;
//#define int long long
inline int read(){
    int s=0,f=1;
    char ch=' ';
    while(!isdigit(ch)){
		if(ch=='-')f=-1;
		ch=getchar();
	}
    while(isdigit(ch))s=(s<<3)+(s<<1)+(ch^48),ch=getchar();
    return s*f;
}
inline void write(long long x){
    if(x<0)putchar('-'),x=-x;
    if(x<10){
        putchar(x+48);
        return;
    }
    write(x/10);
    putchar((x%10)+48);
}
struct node{
    int d;
    int v;
}a[100005];
int n=read(),m=read(),lg[100005],de[100005],f[100005][20],g[100005][20],s[100005],p,r,top,h[100005],tot,ans;
struct edge{
    int to;
    int nt;
}e[100005];
void add(int from,int to){e[++tot]=(edge){to,h[from]},h[from]=tot;};
void dfs(int fa,int x){
    de[x]=de[fa]+1,f[x][0]=fa,g[x][0]=a[x].v;
    for(int i=1;i<=lg[de[x]];i++)f[x][i]=f[f[x][i-1]][i-1],g[x][i]=g[f[x][i-1]][i-1]+g[x][i-1];
    for(int i=h[x];i;i=e[i].nt)dfs(x,e[i].to);
}
signed main(){
    a[++n]=(node){0x3f3f3f,0x3f3f3f};
	for(int i=1;i<n;i++)a[i].d=read(),a[i].v=read();    
    for(int i=1;i<=n;i++){
        while(top&&a[i].d>a[s[top]].d)lg[s[top--]]=i;
        s[++top]=i;
    }
    for(int i=1;i<=n;i++)add(lg[i],i);
    for(int i=2;i<=n;i++)lg[i]=lg[i>>1]+1;
    dfs(0,n);
    while(m--){
        r=read(),p=read();
        if(a[r].v>=p){
            write(r),putchar(10);
            continue;
        }
        for(int i=lg[de[r]];i>=0;i--)if(g[r][i]<p)p-=g[r][i],r=f[r][i];
        if(r==n)puts("0");
        else write(r),putchar(10);
    }
	return 0;
}
2022/10/26 00:04
加载中...