题目链接

luogu P1623 [CEOI2007]树的匹配Treasury

题解

f[i][0/1]表示当前位置没用/用了

转移暴力就可以了

code

// luogu-judger-enable-o2
#include<vector>
#include<cstdio>
#include<cstring>
#include<algorithm>
using std::vector;
using std::max;
using std::min;
inline int read() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {if(c=='-') f=-1;c=getchar() ;}
while(c<='9'&&c>='0') x=x*10+c-'0',c=getchar() ;
return x*f;
}
const int maxn = 1007;
struct node{
int v,next;
}edge[maxn];
int dp[maxn][2],head[maxn],num=0;
inline void add_edge(int u,int v) {
edge[++num].v=v;edge[num].next=head[u];head[u]=num;
}
int n;
void init() {
n=read();
for(int num,k,i=1;i<=n;++i) {
k=read(),num=read();
for(int j=1;j<=num;++j)
add_edge(k,read());
}
}
struct Int {
static const int Bit=1e4;//压3位
int a[107],size;
inline void operator = (const int &x) {
memset(a,0,sizeof a) ;a[size=1]=x;
}
inline Int operator + (const Int t ) {
Int c=*this;
int sz =max(c.size,t.size);
for(int i=1;i<=sz;++i)
c.a[i]+=t.a[i],c.a[i+1]+=c.a[i]/Bit,c.a[i]%=Bit;
if(c.a[sz+1])sz++;
c.size=sz;
return c;
}
inline Int operator * (const Int t) {
int sz=size+t.size-1;
Int c;c=0;
for(int i=1;i<=size;++i)
for(int j=1;j<=t.size;++j)
c.a[i+j-1]+=a[i]*t.a[j];
for(int i=1;i<=sz;++i)
c.a[i+1]+=c.a[i]/Bit,c.a[i]%=Bit;
if(c.a[sz+1])sz++;c.size=sz;
return c;//XD
}
inline void print() {
printf("%d",a[size]);
for(int i=size-1;i;--i)
printf("%04d",a[i]);
}
}cnt[maxn][2];
inline void operator *= (Int &a,Int b) {a=a*b;}
inline void operator += (Int &a,Int b) {a=a+b;}
void dfs(int x) {
//int num = vec[x].size();
cnt[x][0]=1;cnt[x][1]=1;
for(int i=head[x];i;i=edge[i].next) {
int v=edge[i].v;
dfs(v);
if(dp[x][1]) {
dp[x][1]+=dp[v][1];
if(dp[v][0]!=dp[v][1]) cnt[x][1]*=cnt[v][1];
else cnt[x][1]*=cnt[v][0]+cnt[v][1];
}
if(dp[x][0]+dp[v][0]+1 > dp[x][1]) dp[x][1] = dp[x][0]+dp[v][0]+1,cnt[x][1]=cnt[x][0]*cnt[v][0];
else if(dp[x][0]+dp[v][0]+1 == dp[x][1]) cnt[x][1] += cnt[x][0]*cnt[v][0];
dp[x][0]+=dp[v][1];
if(dp[v][0]!=dp[v][1]) cnt[x][0]*=cnt[v][1];
else cnt[x][0]*=cnt[v][0]+cnt[v][1];
}
if(!dp[x][1]) cnt[x][1]=0;
}
int main() {
init();
dfs(1);
printf("%d\n",dp[1][1]);
if(dp[1][1]!=dp[1][0]) cnt[1][1].print();
else cnt[1][1]+=cnt[1][0],cnt[1][1].print();
return 0;
}

luogu P1623 [CEOI2007]树的匹配Treasury的更多相关文章

  1. [CEOI2007] 树的匹配Treasury

    类型:树形 DP 传送门:>Here< 题意:给一棵树,你可以匹配有边相连的两个点,问你这棵树的最大匹配是多少,并且计算出有多少种最大匹配. 解题思路 首先树形Dp是很明显的,$f[i][ ...

  2. [CEOI2007]树的匹配Treasury(树形DP+高精)

    题意 给一棵树,你可以匹配有边相连的两个点,问你这棵树的最大匹配时多少,并且计算出有多少种最大匹配. N≤1000,其中40%的数据答案不超过 108 题解 显然的树形DP+高精. 这题是作为考试题考 ...

  3. Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树)

    Luogu 2590 [ZJOI2008]树的统计 / HYSBZ 1036 [ZJOI2008]树的统计Count (树链剖分,LCA,线段树) Description 一棵树上有n个节点,编号分别 ...

  4. [luogu P3384] [模板]树链剖分

    [luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点 ...

  5. bzoj5123 [Lydsy12月赛]线段树的匹配

    题意: 线段树是这样一种数据结构:根节点表示区间 [1, n]:对于任意一个表示区间 [l, r] 的节点,若 l < r, 则取 mid = ⌊l+r/2⌋,该节点的左儿子为 [l, mid] ...

  6. 【bzoj5123】[Lydsy12月赛]线段树的匹配 树形dp+记忆化搜索

    题目描述 求一棵 $[1,n]$ 的线段树的最大匹配数目与方案数. $n\le 10^{18}$ 题解 树形dp+记忆化搜索 设 $f[l][r]$ 表示根节点为 $[l,r]$ 的线段树,匹配选择根 ...

  7. [Luogu 2590] ZJOI2008 树的统计

    [Luogu 2590] ZJOI2008 树的统计 裸树剖不解释. 比板子还简单. #include <algorithm> #include <cstdio> #inclu ...

  8. 【luogu P2590 [ZJOI2008]树的统计】 题解

    题目链接:https://www.luogu.org/problemnew/show/P2590 我想学树剖QAQ #include <cstdio> #include <cstri ...

  9. 【luogu P3372 线段树1】 模板

    线段树的模板题 题目链接:https://www.luogu.org/problemnew/show/P3372 update区间修改,query区间求和 #include <iostream& ...

随机推荐

  1. 【BZOJ 2822】[AHOI2012]树屋阶梯 卡特兰数+高精

    这道题随便弄几个数就发现是卡特兰数然而为什么是呢? 我们发现我们在增加一列时,如果这一个东西(那一列)他就一格,那么就是上一次的方案数,并没有任何改变,他占满了也是,然后他要是占两格呢,就是把原来的切 ...

  2. sshd_conf配置

    #    $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $   # This is the sshd server system-w ...

  3. nodejs是用来做什么的?

    有些人说“这是一种通过javascript语言开发web服务端的东西”.更直白的可以理解为:node.js有非阻se塞,事件驱动/O等特性,从而让高并发(high concurrency)在的轮询和c ...

  4. 关于flume的几道题

    1,要求:监听一个tcp,udp端口41414将数据打印在控制台 # example.conf: A single-node Flume configuration # Name the compon ...

  5. python的tuple()

    描述 Python 元组 tuple() 函数将列表转换为元组. 语法 tuple()方法语法: tuple( seq ) 参数 seq -- 要转换为元组的序列. 返回值 返回元组. 实例 以下实例 ...

  6. MDIO/MDC(SMI)接口-leonwang202

    ChinaUnix博客 http://blog.chinaunix.net/uid-24148050-id-132863.html

  7. HDU1267 下沙的沙子有几粒? 基础DP

    题目链接 题意:给定m个H和n个D(1<=n,m<=20),问这些字母构成的序列中,对于任意位置,从左开始数H的累积个数总是不比D的累计数少的排列有多少种. 题解:二维DP,画一个正方形, ...

  8. andriod开发增加一个菜单

      第一步: E:\01.prj\pyscrapy\Cet4\res\menu\main.xml <menu xmlns:android="http://schemas.android ...

  9. mysql七:数据备份、pymysql模块

    阅读目录 一 IDE工具介绍 二 MySQL数据备份 三 pymysql模块 一 IDE工具介绍 生产环境还是推荐使用mysql命令行,但为了方便我们测试,可以使用IDE工具 下载链接:https:/ ...

  10. [ Openstack ] Openstack-Mitaka 高可用之 环境初始化

    目录 Openstack-Mitaka 高可用之 概述    Openstack-Mitaka 高可用之 环境初始化    Openstack-Mitaka 高可用之 Mariadb-Galera集群 ...