1 条题解

  • 0
    @ 2026-9-15 18:28:01

    赛场最唐操作出现了,以后没想好千万不要开题。。

    大力手模发现每个点只能向自己任意祖先连边,且满足“祖先不能先到该点”的约束,树状数组优化即可。

    #include<bits/stdc++.h>
    typedef long long ll;
    using namespace std;
    
    const int N=2e5+10;
    const int MOD=1e9+7;
    int n,fto[N];
    vector<int>vc[N];
    ll ans=1;
    
    struct Fenwick{
        int tr[N]; 
        #define lb(x) (x&-x)
        inline void Add(int id,int k){while(id<=n)tr[id]+=k,id+=lb(id);}
        inline int Query(int id){
            int res=0;
            while(id)res+=tr[id],id^=lb(id);
            return res;
        }
    }bit;
    inline ll Fpow(ll a,int b)
    {
        ll res=1;
        while(b)
        {
            if(b&1)res=res*a%MOD;
            a=a*a%MOD,b>>=1;
        }
        return res;
    }
    
    void DFS(int u,int f)
    {
        fto[u]=0x3f3f3f3f;
        for(int v:vc[u])
        {
            if(v==f)continue;
            fto[u]=min(fto[u],v);
            DFS(v,u);
        }
    }
    void DFS2(int u,int f)
    {
        ll cnt=bit.Query(u-1);
        cnt=Fpow(2,cnt);
        ans=ans*cnt%MOD;
        for(int v:vc[u])
        {
            if(v==f)continue;
            fto[u]=v;
            bit.Add(fto[u],1);
            DFS2(v,u);
            bit.Add(fto[u],-1);
        }
    }
    
    signed main()
    {
        ios::sync_with_stdio(0);
        cin.tie(0),cout.tie(0);
        // freopen("dfs.in","r",stdin);
        // freopen("dfs.out","w",stdout);
        cin>>n;
        for(int i=1;i<n;++i)
        {
            int u,v;
            cin>>u>>v;
            vc[u].push_back(v);
            vc[v].push_back(u);
        }
        for(int i=1;i<=n;++i)
            sort(vc[i].begin(),vc[i].end());
        DFS(1,0);
        DFS2(1,0);
        cout<<ans<<'\n';
        return 0;
    }
    
    • 1

    信息

    ID
    3672
    时间
    1000ms
    内存
    256MiB
    难度
    7
    标签
    (无)
    递交数
    31
    已通过
    9
    上传者