[USACO 2017 Dec Gold] Tutorial

Posted newera

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[USACO 2017 Dec Gold] Tutorial相关的知识,希望对你有一定的参考价值。

Link:

USACO 2017 Dec Gold 传送门

A:

 

B:

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

明显树形$dp$,转移$dp[i][j]=prod_{kin 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的主要内容,如果未能解决你的问题,请参考以下文章

[USACO 13DEC]Vacation Planning(gold)

[USACO 2016 Dec Gold] Tutorial

贪心 洛谷P2870 [USACO07DEC]最佳牛线,黄金Best Cow Line, Gold

洛谷P2840 [USACO20DEC]Moocast(gold)奶牛广播-金

暑期USACO囤题计划

[USACO19DEC] Milk Visits(gold) 题解