bzoj2004公交线路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004
好美妙的矩阵乘。
思考:
0.在一个序列上。所以考虑dp。
1.p<=10,k<=8,所以考虑状压,1表示这一站正有公交车。
2.n<=1e9,考虑矩阵乘优化dp。
3.因为每一步<=p,所以维护长度为p的区间中的当前状态就行了,其他位置肯定全是0。这样也压得下。
实现:
为了不重不漏,需要指定一个顺序一样的东西。
比如我们可以指定最左边一定得有一辆车,而且每次状态改变一定是这辆车走了。
转移条件就是(当前状态)<<1 与 (目标状态) 只有一位不同,即( (当前状态)<<1 & (目标状态) )==k-1。
对称地,我们也可以指定最右边一定得有一辆车,状态改变时是随便位置的一辆车走到了这个位置。
转移条件略。
因为只能从左往右走,所以这两种方式比指定中间某个位置一定得有一辆车更优。
更妙的是因为每次移动区间之前都有一个 不与之前重复的 指定位置一定有车,而本次更新出来的状态都是建立在该位置有车的前提上的,所以就能保证每一站都被停过!
每一站都只停一次就是通过区间内有k个1来保证。
最后需要乘一下最初的状态,就是开头有k个1的那个。
如果我们把开始的右端看作第k个位置,结束就是在第n个位置;而且这样开始和结束的状态就都是000001111111的样子。
如果从1~(1<<p-1)枚举数字是否合法,则第一个得到的合法状态就是000001111111的样子。
所以最后乘一个只有[1][1]是1的状态矩阵(初始),再输出[1][1]位置的值(最终)就行啦!因为乘状态矩阵对[1][1]的值无影响,所以不乘也行。
代码:
合法状态不用算末位是0但有k个1的,因为没人转移给它们值,所以它们就没用了。
- #include<iostream>
- #include<cstdio>
- #include<cstring>
- using namespace std;
- const int N=,mod=;
- int n,m,p,cnt,lm,list[N];
- struct Matrix{
- int v[N][N];
- void init()
- {
- for(int i=;i<=cnt;i++)v[i][i]=;
- }
- Matrix operator *(const Matrix &b)const
- {
- Matrix tp;memset(tp.v,,sizeof tp.v);
- for(int i=;i<=cnt;i++)
- for(int j=;j<=cnt;j++)
- for(int k=;k<=cnt;k++)
- (tp.v[i][j]+=v[i][k]*b.v[k][j])%=mod;
- return tp;
- }
- }res,tp;
- int num(int x)//很好
- {
- int ct=;
- while(x){x-=(x&-x);ct++;}
- return ct;
- }
- int main()
- {
- scanf("%d%d%d",&n,&m,&p);
- lm=(<<p);
- for(int i=;i<lm;i++)
- if((i&)&&num(i)==m)list[++cnt]=i;
- for(int i=;i<=cnt;i++)
- for(int j=;j<=cnt;j++)
- if(num(list[i]&(list[j]<<))==m-)tp.v[i][j]=;
- int ct=n-m;res.init();
- while(ct)
- {
- if(ct&)res=res*tp;
- tp=tp*tp;ct>>=;
- }
- printf("%d",res.v[][]);
- return ;
- }
bzoj2004公交线路的更多相关文章
- bzoj2004公交线路——DP+矩阵加速递推
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2004 求方案数,想到DP: 因为两个站间距离<=p,所以每p个站中所有车一定都会停靠至 ...
- 【BZOJ2004】公交线路(动态规划,状态压缩,矩阵快速幂)
[BZOJ2004]公交线路(动态规划,状态压缩,矩阵快速幂) 题面 BZOJ 题解 看到\(k,p\)这么小 不难想到状态压缩 看到\(n\)这么大,不难想到矩阵快速幂 那么,我们来考虑朴素的\(d ...
- 【BZOJ2004】[Hnoi2010]Bus 公交线路 状压+矩阵乘法
[BZOJ2004][Hnoi2010]Bus 公交线路 Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距离均为1 ...
- 【BZOJ2004】[HNOI2010]Bus 公交线路
[BZOJ2004][HNOI2010]Bus 公交线路 题面 bzoj 洛谷 题解 $N$特别大$P,K$特别小,一看就是矩阵快速幂+状压 设$f[S]$表示公交车状态为$S$的方案数 这是什么意思 ...
- AMap公交线路查询
<!doctype html> <html> <head> <meta charset="utf-8"> <meta http ...
- Android百度地图开发(五)公交线路详情搜索、多条线路显示
一.公交线路详情检索 获取公交线路的详情主要分来两步,1.获取公交线路的Uid,2.通过Uid获取公交线路详情. 1.获取公交线路的Uid: /* * 获得公交线路图的Uid,并且根据系Uid发起公交 ...
- 济南最新公交线路一览(BRT)
济南最新公交线路一览(BRT) 济南BRT1路 高速公交线路 黄岗路东5:30-21:30 全福立交桥西5:30-21:30 票价1元,刷卡9折,月票有效 高速公交公司 去程:黄岗路东(BRT) - ...
- 公交线路免费api接口代码
描写叙述:本接口主要是依据城市名称 + 线路名称 模糊查找城市公交线路信息. 开源api接口:http://openapi.aibang.com/bus/lines?app_key=keyvalue ...
- 【百度地图API】如何制作公交线路的搜索?如331路
原文:[百度地图API]如何制作公交线路的搜索?如331路 摘要: 从A点到B点的公交导航大家都知道怎么做了,那么单独查询331路公交车的公交路线,如何制作呢?我们一起来学习一下~ --------- ...
随机推荐
- Mindoc搭建流程
1,安装MySql 2,官网下载:https://github.com/lifei6671/mindoc/releases mindoc_windows_amd64.7z 3,如果下载的压缩包中不存在 ...
- MySQL的GTID复制
从mysql5.6开始引入全局事务标识符(GTID),即每个事务都有一个唯一的标识符.服务器上的每个事务都被分配一个唯一的事务标识符,这是一个64位非零的数值,根据事务提交的顺序分配.GTID的构成是 ...
- 20145315 《Java程序设计》第四周学习总结
20145315 <Java程序设计>第四周学习总结 教材学习内容总结 第六章 继承与多态 6.1何谓继承 6.1.1继承共同行为 把相同的程序代码提升为父类 private String ...
- When should I use OWIN Katana?
When should I use OWIN Katana? 解答1 In asp.net WebApi v2, the OWIN pipeline becomes the default. It i ...
- 强连通分量(Korasaju & Tarjan)学习笔记
好久以前学过的东西...现在已经全忘了 很多图论问题需要用到强连通分量,还是很有必要重新学一遍的 强连通分量(Strongly Connected Component / SCC) 指在一个有向图中, ...
- phantomjs学习资料
http://blog.csdn.net/mecho/article/details/45888465 phantomjs的使用说明,尤其是webpage创建,资源加载前后的处理方法.
- TC 配置插件
转载:http://hi.baidu.com/accplaystation/item/07534686f39dc329100ef310 1.插件下载地址:http://www.topcoder.com ...
- http cookie的domain使用
问题描述 最近遇到了一个因cookie domain设置不正确导致公司自研的分布式session组件无法生效的问题. 公司自研的这套分布式session组件依赖于设置在cookie中的sessionI ...
- n人围圈报数,报3出圈
题目:有n个人围成一圈,顺序排号.从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位. Scanner scanner = new Scanner(System. ...
- 使用Jenkins来实现内部的持续集成流程(上)
前言 Jenkins和TeamCity都是大杀器,用于搭建内部持续集成环境都是妥妥的.本篇主要介绍Jenkins的安装,下篇将介绍相关配置和使用. 目录 安装和配置 第一次启动 插件安装,第一次进入时 ...