萌新点分治求助 WA #50
查看原帖
萌新点分治求助 WA #50
610557
shinzanmonoszm 妹妹楼主2023/7/12 14:58

提交寄录

#include<iostream>
#include<algorithm>
const int sz=1e5+10;
int n,l,w;
struct BIT{
    long long arr[sz];
    int lowbit(int x){
        return x&-x;
    }
    void add(int p,int x){
        for(int i=p;i<=n;i+=lowbit(i))arr[i]+=x;
    }
    long long query(int p){
        if(p<=0)return 0;
        long long res=0;
        for(int i=p;i;i-=lowbit(i))res+=arr[i];
        return res;
    }
}bit;
struct edge{
    int nxt,to,w;
}graph[sz<<1];
int head[sz],hpp;
void addEdge(int from,int to,int w){
    graph[++hpp]=edge{head[from],to,w};
    head[from]=hpp;
}
int size[sz],max[sz],rt;
bool vis[sz];
void dfs(int u,int fau,int psz){
    size[u]=1,max[u]=0;
    for(int p=head[u];p;p=graph[p].nxt){
        int v=graph[p].to;
        if(vis[v]||v==fau)continue;
        dfs(v,u,psz);
        max[u]=std::max(max[u],size[v]);
        size[u]+=size[v];
    }
    max[u]=std::max(max[u],psz-size[u]);
    if(max[u]<max[rt])rt=u;
}
struct ver{
    int dep,dis;
    bool operator<(const ver &a)const{
        return dis<a.dis;
    }
};
ver qq[sz];
int tail;
void dist(int u,int fau,int dis,int dep){
    qq[++tail]=ver{dep,dis},size[u]=1;
    for(int p=head[u];p;p=graph[p].nxt){
        int v=graph[p].to;
        if(vis[v]||v==fau)continue;
        dist(v,u,dis+graph[p].w,dep+1);
        size[u]+=size[v];
    }
}
long long count(int u,int dis,int dep){
    long long res=0;
    tail=0;
    dist(u,0,dis,dep);
    std::sort(qq+1,qq+tail+1);
    for(int i=1;i<=tail;i++)bit.add(qq[i].dep+1,1);
    for(int i=1,j=tail;i<=j;i++){
        while(i<j&&qq[i].dis+qq[j].dis>w)bit.add(qq[j].dep+1,-1),j--;
        bit.add(qq[i].dep+1,-1);
        res+=bit.query(l-qq[i].dep+1);
    }
    return res;
}
long long ans=0;
void solve(int u){
    vis[u]=true;
    ans+=count(u,0,0);
    for(int p=head[u];p;p=graph[p].nxt){
        int v=graph[p].to;
        if(vis[v])continue;
        ans-=count(v,graph[p].w,1);
        rt=0,dfs(v,0,size[v]),solve(rt);
    }
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cin>>n>>l>>w;
    for(int i=2,f,w;i<=n;i++)
        std::cin>>f>>w,addEdge(i,f,w),addEdge(f,i,w);
    max[0]=1e9,dfs(1,0,n),solve(rt);
    std::cout<<ans<<"\n";
    return 0;
}
2023/7/12 14:58
加载中...