首页 > 其他 > 详细

[USACO 2017 Dec Gold] Tutorial

时间:2018-09-04 10:19:12      阅读:173      评论:0      收藏:0      [点我收藏+]

Link:

USACO 2017 Dec Gold 传送门

A:

 

B:

将无根树转化为有根树方便计数

明显树形$dp$,转移$dp[i][j]=\prod_{k\in son} dp[k][(j+1)mod3]+dp[k][(j+2)mod3]$

技术分享图片
#include <bits/stdc++.h>

using namespace std;
#define X first
#define Y second
typedef long long ll;
typedef pair<int,int> P;
const int MAXN=1e5+10,MOD=1e9+7;
struct edge{int nxt,to;}e[MAXN<<2];
int n,k,x,y,head[MAXN],tot;ll dp[MAXN][3];

void add_edge(int x,int y)
{e[++tot].nxt=head[x];e[tot].to=y;head[x]=tot;}
void dfs(int x,int anc)
{
    for(int i=head[x];i;i=e[i].nxt)
    {
        if(e[i].to==anc) continue;
        dfs(e[i].to,x);
        for(int j=0;j<3;j++)
            (dp[x][j]*=dp[e[i].to][(j+1)%3]+dp[e[i].to][(j+2)%3])%=MOD;
    }
}

int main()
{
    scanf("%d%d",&n,&k);
    for(int i=1;i<n;i++)
        scanf("%d%d",&x,&y),add_edge(x,y),add_edge(y,x);
    for(int i=1;i<=n;i++) 
        dp[i][0]=dp[i][1]=dp[i][2]=1;
    for(int i=1;i<=k;i++)
        scanf("%d%d",&x,&y),y--,dp[x][(y+1)%3]=dp[x][(y+2)%3]=0;
    
    dfs(1,0);
    printf("%lld",(dp[1][0]+dp[1][1]+dp[1][2])%MOD);
    return 0;
}
Problem B

 

C:

 

[USACO 2017 Dec Gold] Tutorial

原文:https://www.cnblogs.com/newera/p/9582489.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!