bzoj1063

仔细观察可以发现,这个规划路径很像树链剖分

树链剖分的经典定理:任意一个点到根的所经过轻边不超过logn

而这个规划路径所走公路相当于轻边,也就是说,不便利度不会很大

那么直接dp即可,设f[x,i,k]表示以x为根的子树,不便利度不超过i,且x向下连了k[0,2]条边的方案数

根据增量法的思想,不难从孩子转移到父亲

注意这里取模等于0和没有方案的区别要注意一下

 1 type node=record
 2        po,next:longint;
 3      end;
 4
 5 var e:array[0..400010] of node;
 6     f:array[0..100010,-1..12,0..2] of int64;
 7     p:array[0..100010] of longint;
 8     v:array[0..100010] of boolean;
 9     mo,n,m,i,x,y,len:longint;
10
11 procedure add(x,y:longint);
12   begin
13     inc(len);
14     e[len].po:=y;
15     e[len].next:=p[x];
16     p[x]:=len;
17   end;
18
19 function get(x:int64):int64;
20   begin
21     if (x>0) and (x mod mo=0) then exit(mo)
22     else exit(x mod mo);
23   end;
24
25 procedure dfs(x:longint);
26   var i,y,j:longint;
27       s1,s0:int64;
28   begin
29     for i:=0 to 12 do
30       f[x,i,0]:=1;
31     i:=p[x];
32     v[x]:=true;
33     while i<>0 do
34     begin
35       y:=e[i].po;
36       if not v[y] then
37       begin
38         dfs(y);
39         for j:=0 to 12 do
40         begin
41           s1:=f[y,j,0]+f[y,j,1];
42           s0:=f[y,j-1,0]+f[y,j-1,1]+f[y,j-1,2];
43           f[x,j,2]:=get(f[x,j,2]*s0+f[x,j,1]*s1);
44           f[x,j,1]:=get(f[x,j,1]*s0+f[x,j,0]*s1);
45           f[x,j,0]:=get(f[x,j,0]*s0);
46         end;
47       end;
48       i:=e[i].next;
49     end;
50   end;
51
52 begin
53   readln(n,m,mo);
54   for i:=1 to m do
55   begin
56     readln(x,y);
57     add(x,y);
58     add(y,x);
59   end;
60   if m<n-1 then
61   begin
62     writeln(-1);
63     writeln(-1);
64     halt;
65   end;
66   dfs(1);
67   for i:=0 to 12 do
68     if f[1,i,0]+f[1,i,1]+f[1,i,2]>0 then
69     begin
70       writeln(i);
71       writeln((f[1,i,0]+f[1,i,1]+f[1,i,2]) mod mo);
72       halt;
73     end;
74   writeln(-1);
75   writeln(-1);
76 end.

时间: 2024-08-26 15:42:32

bzoj1063的相关文章

bzoj1063【Noi2008】道路设计

题意:http://www.lydsy.com/JudgeOnline/problem.php?id=1063 用一种划分方式将树划为重链和轻链,使得所有点到根节点的路径经过的轻链最大值最小 sol:  先判定图是否联通,若不连通输出-1 考虑树形dp,f[i][j]表示以i为根的字树中到i的最大不便利值为j的方案数 然而这时空都是O(n^2)的QAQ,而且没法转移 考虑运用树链剖分的思想可证明,j之多为O(log2(n))的 事实上,j在图为完全二叉树时取最大值O(log3(n)) 对于转移,

bzoj1063: [Noi2008]道路设计

树形dp. 这道题的划分方式和树链剖分类似,但是重路径能经过根节点,而且要求方案数,所以不能用树链剖分. 但是由这种关系可以知道答案很小为log n级别(翻看数据后,确认了答案最大为4..但应该有能使答案更大的数据)   用f[i][j][0/1/2]分别表示,以i为子树的节点中,不便利值最大的点不便利值为j. 0代表i节点不在任何一条儿子构成的链中,1表示在一条和儿子构成的链中,2代表2条儿子构成的链经过了i节点. (这个很难说明白的感觉..)   他们之间的递推关系...然后我不会在这个框下

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

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

bzoj 1061~1065【Noi2008】解题报告

这次Noi好像格外喜欢树形DpQAQ P.S.好像这次的题有4道都与图有关QAQ bzoj1061[Noi2008]志愿者招募:上下界可行最小费用流 bzoj1062[Noi2008]糖果雨:数形结合&二维树状数组 bzoj1063[Noi2008]道路设计:树形Dp bzoj1064[Noi2008]假面舞会:分类讨论&图上Dfs bzoj1065[Noi2008]奥运物流:树形Dp&背包优化Dp

省选/NOI刷题Day1

bzoj4864 Splay乱搞 bzoj3669 正解LCT,考虑上下界的spfa可过 bzoj3668 位运算 暴力 bzoj3670 KMP DP bzoj3671 含有最小的一个数的路径一定比不含的优 贪心 bzoj1564 按数值排序,就得到了那个Treap的中序遍历,用dp(l,r,k)表示l~r区间根节点权值不小于k的答案 ZOJ3201 树上背包 乱搞 bzoj1063 心疼NOI2008的同学们,两道树d...dp(i,j,k)表示以i为根的子树,不方便值最大为j,i向儿子连了