Time Limit: 20 Sec Memory Limit: 162 MB

Submit: 931 Solved: 509 
[Submit][Status][Discuss] 
Description

  Z国坐落于遥远而又神奇的东方半岛上,在小Z的统治时代公路成为这里主要的交通手段。Z国共有n座城市,一些城市之间由双向的公路所连接。非常神奇的是Z国的每个城市所处的经度都不相同,并且最多只和一个位于它东边的城市直接通过公路相连。Z国的首都是Z国政治经济文化旅游的中心,每天都有成千上万的人从Z国的其他城市涌向首都。为了使Z国的交通更加便利顺畅,小Z决定在Z国的公路系统中确定若干条规划路线,将其中的公路全部改建为铁路。我们定义每条规划路线为一个长度大于1的城市序列,每个城市在该序列中最多出现一次,序列中相邻的城市之间由公路直接相连(待改建为铁路)。并且,每个城市最多只能出现在一条规划路线中,也就是说,任意两条规划路线不能有公共部分。当然在一般情况下是不可能将所有的公路修建为铁路的,因此从有些城市出发去往首都依然需要通过乘坐长途汽车,而长途汽车只往返于公路连接的相邻的城市之间,因此从某个城市出发可能需要不断地换乘长途汽车和火车才能到达首都。我们定义一个城市的“不便利值”为从它出发到首都需要乘坐的长途汽车的次数,而Z国的交通系统的“不便利值”为所有城市的不便利值的最大值,很明显首都的“不便利值”为0。小Z想知道如何确定规划路线修建铁路使得Z国的交通系统的“不便利值”最小,以及有多少种不同的规划路线的选择方案使得“不便利值”达到最小。当然方案总数可能非常大,小Z只关心这个天文数字modQ后的值。注意:规划路线1-2-3和规划路线3-2-1是等价的,即将一条规划路线翻转依然认为是等价的。两个方案不同当且仅当其中一个方案中存在一条规划路线不属于另一个方案。

Input

  第一行包含三个正整数N、M、Q,其中N表示城市个数,M表示公路总数,N个城市从1~N编号,其中编号为1的是首都 
。Q表示上文提到的设计路线的方法总数的模数。接下来M行,每行两个不同的正数ai、bi(1≤ai,bi≤N)表示有一条 
公路连接城市ai和城市bi。输入数据保证一条公路只出现一次。

Output

  包含两行。第一行为一个整数,表示最小的“不便利值”。第二行为一个整数,表示使“不便利值”达到最小时 
不同的设计路线的方法总数modQ的值。如果某个城市无法到达首都,则输出两行-1。

Sample Input

5 4 100
1 2
4 5
1 3
4 1

Sample Output

1
10

********************************分割线********************************
由题目中的构图方式不难看出这是一棵树,题目中让做的事是将这棵树剖分,使得根到路径上轻链最多的点轻链最少。
树链剖分可以使根到路径上轻链最多的点轻链至多有log n个,也就是说最终答案肯定不超过log n。这样就可以从1开始枚举,直到有一个答案的方案数不为零。
将“点a到点b的路径上有多少条轻链”称为“点a到点b的距离”。
设dp(x,y,z)表示点y向它的子树连了x(1或2)条边,而且要想使根到所有点的距离符合要求,就必须让y的子树中所有点到y的距离不超过z。

现在假设要求出dp(0/1/2,u,dep),已经算到了u的第p个儿子v,而且dp(0/1/2,v,dep)和dp(0/1/2,v,dep-1)已经求出。

设tmp1=dp(0,v,dep)+dp(1,v,dep)(这是u有连重链到v的情况),tmp2=dp(0,v,dep-1)+dp(1,v,dep-1)+dp(2,v,dep-1)(这是u没有重链到v的情况)。

当u到子树有两条边时,两条边中的一条可能是到v的,也可能不是。

当u到子树有一条边时,这一条边可能是到v的,也可能不是。

当u没有边到子树时,肯定没有边到v。

这样就能得出转移方程了,并不对劲的人表示代码里有,并不打算写在这里。

需要注意的是,dp的初值是1,而且有可能出现mod q之后恰巧为零的情况,所以取模时如果结果为0,要改成Q。

只有不能构成一棵树时要输出-1。

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<iomanip>
#include<cstdlib>
#define maxn 100010
#define maxm maxn*2
#define ll long long
using namespace std;
ll n,fir[maxn],nxt[maxm],v[maxm],cnt,m,p;
ll dp[][maxn][],f[maxn],son[maxn];
bool vis[maxn][];
ll read(){
ll x=,f=;
char ch=getchar();
while(isdigit(ch)== && ch!='-')ch=getchar();
if(ch=='-')f=-;
while(isdigit(ch))x=x*+ch-'',ch=getchar();
return x*f;
}
ll log2(ll x){
for(ll tmp=,i=;;tmp<<=,i++){
if(tmp*>x||tmp>=x)return i;
}
}
void addedge(ll u1,ll v1){v[cnt]=v1,nxt[cnt]=fir[u1],fir[u1]=cnt++;}
ll getf(ll u){return f[u]<?u:(f[u]=getf(f[u]));}
void add(ll u,ll v){
ll fu=getf(u),fv=getf(v);
if(fu==fv)return;
if(fu>fv)swap(fu,fv);
f[fu]+=f[fv];
f[fv]=fu;
}
ll mod(ll x){
return (x%p== && x!=)?p:x%p;
}
void solve(ll u,ll dep){
if(vis[u][dep])return;
vis[u][dep]=;
for(ll k=fir[u];k!=-;k=nxt[k]){
ll vv=v[k];
if(vv!=f[u]){
f[vv]=u;
solve(vv,dep);solve(vv,dep-);
ll x=dp[][vv][dep]+dp[][vv][dep],//One road to tree vv.
y=dp[][vv][dep-]+dp[][vv][dep-]+dp[][vv][dep-];//No roads to tree vv.
x=mod(x),y=mod(y);
dp[][u][dep]=mod(dp[][u][dep]*y+dp[][u][dep]*x);
dp[][u][dep]=mod(dp[][u][dep]*y+dp[][u][dep]*x);
dp[][u][dep]=mod(dp[][u][dep]*y);
}
}
}
int main(){
//freopen(".in","r",stdin);
//freopen(".out","w",stdout);
n=read(),m=read(),p=read();
memset(f,-,sizeof(f));
memset(fir,-,sizeof(fir));
for(ll i=;i<=m;i++){
ll x=read(),y=read();
addedge(x,y);
addedge(y,x);
add(x,y);
}
if(f[]!=-n)cout<<-<<endl<<-;
else{
memset(f,-,sizeof(f));
ll lim=log2(n);
for(ll i=;i<=n;i++){
for(ll j=;j<=lim;j++){
dp[][i][j]=;dp[][i][j]=dp[][i][j]=;
}
}
for(ll i=;i<=lim;i++){
solve(,i);
if(dp[][][i]!= || dp[][][i]!= || dp[][][i]!=){
cout<<i<<endl<<(dp[][][i]%p+dp[][][i]%p+dp[][][i]%p)%p;
break;
}
}
}
return ;
}
/*
5 4 100
1 2
4 5
1 3
4 1
*/

XD

并不对劲的[Noi2008]道路设计的更多相关文章

  1. 1063: [Noi2008]道路设计 - BZOJ

    Description Z 国坐落于遥远而又神奇的东方半岛上,在小Z 的统治时代公路成为这里主要的交通手段.Z 国共有n 座城市,一些城市之间由双向的公路所连接.非常神奇的是Z 国的每个城市所处的经度 ...

  2. [bzoj1063][Noi2008]道路设计

    来自FallDream的博客,未经允许,请勿转载,谢谢. Z国坐落于遥远而又神奇的东方半岛上,在小Z的统治时代公路成为这里主要的交通手段.Z国共有n座城市,一些城市之间由双向的公路所连接.非常神奇的是 ...

  3. BZOJ1063 NOI2008 道路设计 树形DP

    题目传送门: BZOJ 题意精简版:给出一棵树,在一种方案中可以将树的若干链上的所有边的边权改为$0$,但需要保证任意两条链之间没有交点.问最少的一种方案,使得从根节点到其他节点经过的边的边权和的最大 ...

  4. [NOI2008] 道路设计

    link 思维题目,题目描述其实说的就是这是一个树,想到树形$dp$.若两个铁路不向交,则每个点的度都$\leq 2$.所以现在就可以搞dp了. 怎么去维护答案,容易想到设$dp(i,j,k)$为现在 ...

  5. Noip前的大抱佛脚----赛前任务

    赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...

  6. bzoj AC倒序

    Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...

  7. dp专练

    dp练习. codevs 1048 石子归并 区间dp #include<cstdio> #include<algorithm> #include<cstring> ...

  8. 【BZOJ1063】【NOI2008】道路设计(动态规划)

    [BZOJ1063][NOI2008]道路设计(动态规划) 题面 BZOJ 题解 发现每个点最多只能被修一次等价于每个点最多只能和两条铁路相邻 考虑一个\(dp\) 设\(f[i][0/1/2]\)表 ...

  9. BZOJ 1063 道路设计NOI2008

    http://www.lydsy.com/JudgeOnline/problem.php?id=1063 题意:给你一棵树,也有可能是不连通的,把树分成几个链,求每个点到根经过的最大链数最小,而且要输 ...

随机推荐

  1. android 如何从activity跳转到另一个activity下指定的fragment

    思路: 跳转到目标fragment所在的activity,并传递一个flag,来确定要到哪个fragment,根据该flag判断后,跳转到指定的fragment即可. 代码: 当前界面: intent ...

  2. MySQL简单查询和单表查询

    MySQL记录操作 概览 MySQL数据操作: DML 在MySQL管理软件中,可以通过SQL语句中的DML语言来实现数据的操作,包括 使用INSERT实现数据的插入 UPDATE实现数据的更新 使用 ...

  3. mybatis返回map类型数据空值字段不显示(三种解决方法)

    转http://blog.csdn.net/lulidaitian/article/details/70941769 一.查询sql添加每个字段的判断空 IFNULL(rate,'') as rate ...

  4. noi.ac NOIP2018 全国热身赛 第二场 T3 color

    [题解] 我们可以发现每次修改之后叶子结点到根的路径最多分为两段:一段白色或者黑色,上面接另一段灰色的.二分+倍增找到分界点,然后更新答案即可. check的时候只需要判断当前节点对应的叶子结点的区间 ...

  5. Lucene实现全文检索的流程

    [索引和搜索流程图] 对要索引的原始内容进行索引构建一个索引库,索引过程包括:确定原始内容即要搜索的内容->采集文档->创建文档->分析文档->索引文档. 从索引库中搜索内容, ...

  6. stm32 调试时卡在LDR R0, =SystemInit

    网上找到的可能的原因 堆栈空间默认的太小 默认startup_stm32f10x_hd.s中 Stack_Size EQU 0x00000400,如果改大之后,可能调试就可以正常运行. 出现最多的情况 ...

  7. C51 动态数码管 个人笔记

    8段led管构成一个数字. 开发板上共有8个数字. 每个数字有一个使能端(段选引脚) 每个数字的位选端(选择8段led管哪些亮,即构成什么图案)并联在一起 轮流点亮不同数字,速度很快,视觉暂留,从而形 ...

  8. Leetcode 215.数组中的第k个最大元素

    数组中的第k个最大元素 在未排序的数组中找到第 k 个最大的元素.请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素. 示例 1: 输入: [3,2,1,5,6,4] 和 ...

  9. HDU——1285 确定比赛名次

    确定比赛名次 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Subm ...

  10. codevs——1081 线段树练习 2

    1081 线段树练习 2  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 大师 Master 题解       题目描述 Description 给你N个数,有两种操作 1:给 ...