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. PHP读取超大的excel文件数据的方案

    场景和痛点 说明 今天因为一个老同学找我,说自己公司的物流业务都是现在用excel处理,按月因为数据量大,一个excel差不多有百万数据,文件有接近100M,打开和搜索就相当的慢 联想到场景:要导入数 ...

  2. assert.notDeepStrictEqual()详解

    assert.notDeepStrictEqual(actual, expected[, message]) 深度地严格不相等比较测试,与 assert.deepStrictEqual() 相反. c ...

  3. 76-Bears/Bulls Power,熊力/牛力震荡指标.(2015.7.1)

    Bears/Bulls Power 熊力/牛力震荡指标 Power,熊力/牛力震荡指标.(2015.7.1)" title="76-Bears/Bulls Power,熊力/牛力震 ...

  4. SpringMVC Controller的返回类型

    Controller的三种返回类型中 ModelAndView类型 带数据带跳转页面 String 跳转页面不带数据 void 通常是ajax格式请求时使用 1返回ModelAndView contr ...

  5. cogs1752[boi2007]mokia 摩基亚 (cdq分治)

    [题目描述] 摩尔瓦多的移动电话公司摩基亚(Mokia)设计出了一种新的用户定位系统.和其他的定位系统一样,它能够迅速回答任何形如“用户C的位置在哪?”的问题,精确到毫米.但其真正高科技之处在于,它能 ...

  6. 对Spring框架的理解(转)

    ①  spring框架是一个开源而轻量级的框架,是一个IOC和AOP容器 ② spring的核心就是控制反转(IOC)和面向切面编程(AOP) ③  控制反转(IOC):是面向对象编程中的一种设计原则 ...

  7. 【05】emmet系列之各种缩写

    [01]emmet系列之基础介绍 [02]emmet系列之HTML语法 [03]emmet系列之CSS语法 [04]emmet系列之编辑器 [05]emmet系列之各种缩写 各种缩写   缩写:! & ...

  8. JavaEE JDBC PreparedStatement

    PreparedStatement @author ixenos PreparedStatement工作原理 注意:虽然mysql不支持PreparedStatement优化,但依然有预编译的实现! ...

  9. Linux备份-删除指定日期内文件

    #!/usr/bin/env bash source /etc/profile echo " *************** start filter ***************  &q ...

  10. Python模块:logging、

    logging模块: 很多程序都有记录日志的需求,并且日志中包含的信息既有正常的程序访问日志,还可能有错误.警告等信息输出.Python的logging模块提供了标准的日志接口,你可以通过它存储各种格 ...