BZOJ 1063 道路设计NOI2008

http://www.lydsy.com/JudgeOnline/problem.php?id=1063

题意:给你一棵树,也有可能是不连通的,把树分成几个链,求每个点到根经过的最大链数最小,而且要输出方案数。

思路:考虑dp,f[i][j]代表第i个节点,最大链数是j,那么有

f[i][j][0]代表已经向子树连接了0个链

f[i][j][1]代表已经向子树连接了1个链

f[i][j][2]代表已经向子树连接了2个链

这样转移就是

f1=f[pur][b][0]+f[pur][b][1]

f2=f[pur][b-1][0]+f[pur][b-1][1]+f[pur][b-1][2]

f[x][b][2]=f2*f[x][b][2]+f1*f[x][b][1]

f[x][b][1]=f1*f[x][b][0]+f2*f[x][b][1]

f[x][b][0]=f[x][b][0]*f2

pur代表x的儿子

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<iostream>
 4 #include<cstring>
 5 #include<algorithm>
 6 #define ll long long
 7 ll Mod;
 8 int first[200005],next[200005],go[200005],tot;
 9 int n,m,fa[200005];
10 ll f[100005][12][3];
11 int read(){
12     int t=0,f=1;char ch=getchar();
13     while (ch<‘0‘||ch>‘9‘) {if (ch==‘-‘) f=-1;ch=getchar();}
14     while (‘0‘<=ch&&ch<=‘9‘) {t=t*10+ch-‘0‘;ch=getchar();}
15     return t*f;
16 }
17 void insert(int x,int y){
18         tot++;
19         go[tot]=y;
20         next[tot]=first[x];
21         first[x]=tot;
22 }
23 void add(int x,int y){
24         insert(x,y);insert(y,x);
25 }
26 int find(int x){
27     if (fa[x]==x) return x;else return fa[x]=find(fa[x]);
28 }
29 ll get(ll x){
30     if (x%Mod!=0) return x%Mod;
31     if (x!=0) return Mod;
32     return 0;
33 }
34 void dfs(int x,int b,int fa){
35     f[x][b][0]=1;
36     f[x][b][1]=0;
37     f[x][b][2]=0;
38     for (int i=first[x];i;i=next[i]){
39         int pur=go[i];
40         if (pur==fa) continue;
41         dfs(pur,b,x);
42         ll f1=(f[pur][b][0]+f[pur][b][1]);
43         ll f2;
44         if (b) f2=f[pur][b-1][0]+f[pur][b-1][1]+f[pur][b-1][2];else f2=0;
45         f[x][b][2]=get(f2*f[x][b][2]+f1*f[x][b][1]);
46         f[x][b][1]=get(f1*f[x][b][0]+f2*f[x][b][1]);
47         f[x][b][0]=get(f[x][b][0]*f2);
48     }
49 }
50 int main(){
51     n=read();m=read();Mod=read();
52     for (int i=1;i<=n;i++) fa[i]=i;
53     for (int i=1;i<=m;i++){
54         int x=read(),y=read();
55         add(x,y);
56         int p=find(x),q=find(y);
57         if (p!=q) fa[q]=p;
58     }
59     for (int i=2;i<=n;i++)
60         if (find(i)!=find(1)){printf("-1\n-1\n");return 0;}
61     for (int i=0;;i++){
62         dfs(1,i,0);
63         if (f[1][i][0]+f[1][i][1]+f[1][i][2]){
64              printf("%d\n",i);
65              printf("%lld\n",((f[1][i][0]+f[1][i][1])%Mod+f[1][i][2])%Mod);
66              return 0;
67             }
68     }
69 }
时间: 2024-08-03 09:47:36

BZOJ 1063 道路设计NOI2008的相关文章

[BZOJ]1063 道路设计(Noi2008)

省选一试后的第一篇blog! Description Z国坐落于遥远而又神奇的东方半岛上,在小Z的统治时代,公路成为这里主要的交通手段.Z国共有n座城市,一些城市之间由双向的公路所连接.非常神奇的是Z国的每个城市所处的经度都不相同,并且最多只和一个位于它东边的城市直接通过公路相连.Z国的首都是Z国政治经济文化旅游的中心,每天都有成千上万的人从Z国的其他城市涌向首都.为了使Z国的交通更加便利顺畅,小Z决定在Z国的公路系统中确定若干条规划路线,将其中的公路全部改建为铁路.我们定义每条规划路线为一个长

【BZOJ 1063】 [Noi2008]道路设计

1063: [Noi2008]道路设计 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 691  Solved: 387 [Submit][Status] Description Z 国坐落于遥远而又神奇的东方半岛上,在小Z 的统治时代公路成为这里主要的交通手段.Z 国共有n 座城市,一些城市之间由双向的公路所连接.非常神奇的是Z 国的每个城市所处的经度都不相同,并且最多只和一个位于它东边的城市直接通过公路相连.Z 国的首都是Z 国政治经济文化旅

【NOI题解】【bzoj题解】NOI2008 bzoj1063 道路设计

@ACMLCZH学长出的毒瘤题T3.再也不是"善良"的出题人了. 题意:bzoj. 题解: 经典的树形DP题目,屡见不鲜了,然而我还是没有写出来. 这一类的题目有很多,例如这里的C题. 主要套路是把对儿子的枚举变成一个类似背包的转移方式,实现降复杂度. 需要注意的是某一个地方的DP值不能直接拿来判断是否有解,例如mod=1时,DP值全为0就没法判断了. 这里比较骚的操作是把mod的倍数变成mod,而0变成0,这样就不会漏判. #include<bits/stdc++.h>

【BZOJ 1061】 [Noi2008]志愿者招募

1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MB Submit: 2066  Solved: 1282 [Submit][Status] Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i 天至少需要Ai 个人. 布布通过了解得知,一共有M 类志愿者可以招募.其中

【BZOJ】1061: [Noi2008]志愿者招募

1061: [Noi2008]志愿者招募 Time Limit: 20 Sec  Memory Limit: 162 MBSubmit: 3752  Solved: 2298[Submit][Status][Discuss] Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完成,其中第i 天至少需要 Ai 个人. 布布通过了解得知,一共有M 类志

【BZOJ 1064】 [Noi2008]假面舞会

1064: [Noi2008]假面舞会 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 988  Solved: 507 [Submit][Status] Description 一年一度的假面舞会又开始了,栋栋也兴致勃勃的参加了今年的舞会.今年的面具都是主办方特别定制的.每个参加舞会的人都可以在入场时选择一 个自己喜欢的面具.每个面具都有一个编号,主办方会把此编号告诉拿该面具的人.为了使舞会更有神秘感,主办方把面具分为k (k≥3)类,并使用特

【BZOJ】1064: [Noi2008]假面舞会(判环+gcd+特殊的技巧)

http://www.lydsy.com/JudgeOnline/problem.php?id=1064 表示想到某一种情况就不敢写下去了.... 就是找环的gcd...好可怕.. 于是膜拜了题解.. 和我想的差不多.. 首先发现这3几种情况: 1.一条或多条单链,那么最多有sum{单链长度}个面具,最少有3个面具 2.环.主要是大环套小环QAQ,显然我们只要小环就行了QAQ环的长度为标号差,gcd能满足这个性质,因此不管它.找出所有的环即可. 3.链相交.此时最大为相交链的长度差的gcd,最小

bzoj 1064【noi2008】假面舞会

题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1064 给一个有向图染色,每个点的后继必须相同,问至少&至多有多少种染色方案 sol:  图由多个联通块组成,对于每个联通块,考虑以下3种情况: 如果有环,分为3类讨论 对于第一种简单环,答案一定是环长的约数 对于第二种有反向边的环,答案一定是两条链长差的约数 trick:将有向边化为无向边,正向边权为1,反向为-1 这样1,2可以一起做 对于第三种大环套小环,将小环缩点即可(gcd(a,b)

11月刷题总结

这是11月的坑...现在来填... noip考跪...希望省选rp++ (11月刷了不少水题... 动态规划+递推: [BZOJ]1072: [SCOI2007]排列perm(状压dp+特殊的技巧) [BZOJ]1068: [SCOI2007]压缩(dp) [BZOJ]1088: [SCOI2005]扫雷Mine(递推) [BZOJ]1096: [ZJOI2007]仓库建设(dp+斜率优化) [BZOJ]1037: [ZJOI2008]生日聚会Party(递推+特殊的技巧) [BZOJ]1009