并不对劲的[Noi2008]道路设计
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[5][maxn][20],f[maxn],son[maxn]; bool vis[maxn][20]; ll read(){ll x=0,f=1;char ch=getchar();while(isdigit(ch)==0 && ch!='-')ch=getchar();if(ch=='-')f=-1;while(isdigit(ch))x=x*10+ch-'0',ch=getchar();return x*f; } ll log2(ll x){for(ll tmp=1,i=0;;tmp<<=1,i++){if(tmp*2>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]<0?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==0 && x!=0)?p:x%p; } void solve(ll u,ll dep){if(vis[u][dep])return;vis[u][dep]=1;for(ll k=fir[u];k!=-1;k=nxt[k]){ll vv=v[k];if(vv!=f[u]){f[vv]=u;solve(vv,dep);solve(vv,dep-1);ll x=dp[0][vv][dep]+dp[1][vv][dep],//One road to tree vv. y=dp[0][vv][dep-1]+dp[1][vv][dep-1]+dp[2][vv][dep-1];//No roads to tree vv.x=mod(x),y=mod(y);dp[2][u][dep]=mod(dp[2][u][dep]*y+dp[1][u][dep]*x);dp[1][u][dep]=mod(dp[1][u][dep]*y+dp[0][u][dep]*x);dp[0][u][dep]=mod(dp[0][u][dep]*y);}} } int main(){//freopen(".in","r",stdin);//freopen(".out","w",stdout);n=read(),m=read(),p=read();memset(f,-1,sizeof(f));memset(fir,-1,sizeof(fir));for(ll i=1;i<=m;i++){ll x=read(),y=read();addedge(x,y);addedge(y,x);add(x,y);}if(f[1]!=-n)cout<<-1<<endl<<-1;else{memset(f,-1,sizeof(f));ll lim=log2(n);for(ll i=1;i<=n;i++){for(ll j=0;j<=lim;j++){dp[0][i][j]=1;dp[1][i][j]=dp[2][i][j]=0;}}for(ll i=0;i<=lim;i++){solve(1,i);if(dp[0][1][i]!=0 || dp[1][1][i]!=0 || dp[2][1][i]!=0){cout<<i<<endl<<(dp[0][1][i]%p+dp[1][1][i]%p+dp[2][1][i]%p)%p;break;}}}return 0; } /* 5 4 100 1 2 4 5 1 3 4 1 */
View Code
XD
转载于:https://www.cnblogs.com/xzyf/p/8074735.html
并不对劲的[Noi2008]道路设计相关推荐
- BZOJ1063:道路设计(树形dp)
1063: [Noi2008]道路设计 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 1147 Solved: 619 [ Submit][ ...
- Noip前的大抱佛脚----赛前任务
赛前任务 tags:任务清单 前言 现在xzy太弱了,而且他最近越来越弱了,天天被爆踩,天天被爆踩 题单不会在作业部落发布,所以可(yi)能(ding)会不及时更新 省选前的练习莫名其妙地成为了Noi ...
- 并不对劲的概率与期望
并不觉得今天学到了什么东西-感觉像上了数学课一样- 很对劲的太刀流-> 一.枚举法 初二数学就有提到的.不过,有时算出的概率和直觉并不相符,所以并不能直接凭感性认识,并不对劲的人有时还得理性分析 ...
- [BZOJ1061][Noi2008]志愿者招募
[BZOJ1061][Noi2008]志愿者招募 试题描述 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难 题:为即将启动的奥运新项目招募一批短期志愿 ...
- BZOJ1061: [Noi2008]志愿者招募
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1061 1061: [Noi2008]志愿者招募 Time Limit: 20 Sec M ...
- 图论 公约数 找环和链 BZOJ [NOI2008 假面舞会]
BZOJ 1064: [Noi2008]假面舞会 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 1655 Solved: 798 [Submit] ...
- 【费用流】BZOJ1061: [Noi2008]志愿者招募(这题超好)
1061: [Noi2008]志愿者招募 Time Limit: 20 Sec Memory Limit: 162 MB Submit: 5291 Solved: 3173 [Submit][St ...
- 【CASS精品教程】CASS7.1 道路设计参数文件打开无响应,提示roadpara解决办法,权威解决办法汇总
目录 第一种方法:Win+R 第二种方法:选择打开方式 第三种方法:cmd 在用CASS7.1 软件进行断面法土方量计算,在生成断面图后,需要进行道路设计参数文件的设计,打开断面设计参数文件的时候,无 ...
- 【做题记录】[NOI2008] 假面舞会—有向图上的环与最长链
luogu 1477 [NOI2008] 假面舞会 容易发现: 如果图中没有环,那么面具种数一定是所有联通块内最长链之和,最少为 \(3\) . 如果有环,则面具种数一定是所有环的大小的最大公约数. ...
最新文章
- 平均年薪35W,2018年大数据AI发展趋势分析
- tomcat源码运行
- IPSEC的NAT兼容性
- SAP UI5 DatePicker setDateValue(tempString)
- 2018-2019-1 20165211 实验四 外设驱动程序设计
- 使用代码片段的正确姿势,打造高效的vscode开发环境
- 野生前端的数据结构基础练习(7)——二叉树
- 微软程骉:智能医疗产业化应用的挑战和解决之道
- 6425C-Lab3 管理用户与服务帐户(1)
- 初学UML之-------用例图
- Java实现的各种排序算法
- Jmeter的基本功能使用方法
- c++设计某小型公司的 employee(人员)类
- 5G无线关键技术 — 灵活频谱共享技术
- matlab 中值滤波 medifit,基于多级中值滤波-提升小波技术的图像去噪
- 蓝桥杯2020年第十届C/C++省赛A组第4题-迷宫(bfs)
- 无法访问eclipse官网?镜像源可以帮你
- webpack 热更新
- 小米12pro天玑版和小米12pro哪个值得买 两者配置对比
- 新年快乐(用软件去祝你的好朋友新年快乐,有亿点简陋)C语言
热门文章
- 物联网安全系列 - 非对称加密算法 ECDH
- 安装智能消费机服务器连接,消费一卡通系统/消费机布线安装方法
- GPFS和Lustre之后,还有谁来统接盘?
- 录像中那个距离他们停泊的港口不远的武汉玛歌堡服饰有限公司商场正是早前反追踪信号捕获到的坐标所在
- 软件测试人员正在逐步被自动化所替代
- HTML5 网页端年会抽奖源码,导入名单列表即可使用
- 树莓派CSI摄像头的使用及OpenCV的简单测试
- office文件用wps打开变形_Office2019怎么打开WPS文件?Office打开WPS文件格式的方法...
- D3D12渲染技术之帧资源
- 起点中文网月票等字体数据爬取Python