• HDU5593 ZYB's Tree(树形dp)


    题意:给1棵N(≤500,000)个节点的树,每条边边权为1,求距离每个点距离不超过K(K≤10)的点的个数的xor和。

    思路:由于K很小,可以考虑把距离作为状态的一部分,然后研究父子之间状态的联系。令ans[i][j]表示与i的距离为j的点的个数,那么 ans[i][j]由两部分构成,一部分来源于子树,一部分来源于父亲,那么令f[i][j]表示从子树来的答案,g[i][j]表示从父亲来的答 案,son(i)表示i的儿子,fa(i)表示i的父亲,则有:

     ans[i][j] = f[i][j] + g[i][j]

    f[i][j] = ∑f[son(i)][j-1]

    g[i][j] = ans[fa(i)][j-1] - f[i][j-2]

    具体做法是:先自底向上求解f数组,这里可以利用队列按拓扑序依次访问每个点,然后自顶向下求g数组,这时只要在上一步的队列里面逆着扫一遍就行了。

    #include <iostream>
    #include <algorithm>
    #include <cstring>
    #include <cmath>
    #include <queue>
    #include <map>
    #include <set>
    #include <vector>
    #include <cstdio>
    using namespace std;
    const int N=500010;
    int n,k,a,b,pre[N],dp[N][12],head[N],eid;
    struct wq
    {
        int to,next;
    }eg[N];
    void add(int u,int v)
    {
        eg[eid].to=v;
        eg[eid].next=head[u];
        head[u]=eid++;
    }
    void dfs(int u)
    {
        for(int i=0;i<=k;i++)
            dp[u][i]=1;
        for(int i=head[u];i!=-1;i=eg[i].next)
        {
            int v=eg[i].to;
            dfs(v);
            for(int j=1;j<=k;j++)
                dp[u][j]+=dp[v][j-1];
        }
    }
    int solve()
    {
        int ans=0;
        for(int u=1;u<=n;u++)
        {
            int last=u,now,an=dp[u][k];
            for(int i=1;i<=k;i++)
            {
                now=pre[last];
                if(!now) break;
                if(k==i) an++;
                else an=an+dp[now][k-i]-dp[last][k-i-1];
                last=now;
            }
            ans^=an;
        }
        return ans;
    }
    int main()
    {
        //freopen("in.txt","r",stdin);
        int t;
        scanf("%d",&t);
        while(t--)
        {
            scanf("%d%d%d%d",&n,&k,&a,&b);
            pre[1]=eid=0;
            memset(head,-1,sizeof(head));
            memset(dp,0,sizeof(dp));
            for(int i=2;i<=n;i++)
            {
                int fa=((long long)a*i+b)%(i-1)+1;
                add(fa,i);
                pre[i]=fa;
            }
            dfs(1);
            printf("%d
    ",solve());
        }
        return 0;
    }
  • 相关阅读:
    HDU 1850 Being a Good Boy in Spring Festival
    UESTC 1080 空心矩阵
    HDU 2491 Priest John's Busiest Day
    UVALive 6181
    ZOJ 2674 Strange Limit
    UVA 12532 Interval Product
    UESTC 1237 质因子分解
    UESTC 1014 Shot
    xe5 android listbox的 TMetropolisUIListBoxItem
    xe5 android tts(Text To Speech)
  • 原文地址:https://www.cnblogs.com/d-e-v-i-l/p/5023715.html
Copyright © 2020-2023  润新知