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路公交车的公交路线,如何制作呢?我们一起来学习一下~ --------- ...
随机推荐
- mongodb的分片(2)
在上一片博客,详细说明了mongodb的分片搭建的详细过程:分片搭建 在这里会说一些分片的维护与操作! 在集群搭建完,我们使用了sh.status()查看分片之后的数据,如下: #连接的是mongos ...
- office 2010 安装时出错 MSXML版本6.10.1129.0
微软下载网址:https://www.microsoft.com/zh-cn/download/details.aspx?id=6276&751be11f-ede8-5a0c-058c-2ee ...
- # 20145106 《Java程序设计》第3周学习总结
教材学习内容总结 在本周的学习中,我看到了这样一句话:"使用java撰写程序几乎都是在使用对象(object),要产生对象必须先定义类(class),类是对象的设计图,对象是类的实例(ins ...
- enum SQLiteDateFormats
DateTimeFormatInfo.CurrentInfo https://msdn.microsoft.com/en-us/library/system.globalization.datetim ...
- UVa 11732 strcmp()函数(左孩子右兄弟表示法)
#include<iostream> #include<algorithm> #include<string> #include<cstring> #i ...
- eclipse中导入maven项目:org.apache.maven.archiver.MavenArchiver.getManifest(org.apache.maven.project.Maven
org.codehaus.plexus.archiver.jar.Manifest.write(java.io.PrintWriter) 解决方法为:更新eclipse中的maven插件 1.help ...
- TC SRM 584 DIV2
250pt: 水题set处理. 500pt: 题意: 给你一个图,每条边关联的两点为朋友,题目要求假设x的金钱为y,则他的左右的朋友当中的钱数z,取值为y - d <= z <= y + ...
- php 二维数组
<?php // 一个二维数组 $cars=array ( array(,), array(,), array(,) ); ?>
- 【Android】冷门常用 ADB
清除应用缓存adb shell pm clear 包名 获取手机中安装的包名,加上部分包名可以做筛选 adb shell pm list package adb shell pm list packa ...
- <<网络是怎样连接的>>笔记第6章 request到达Web server, return response to browser
短短漫长旅程迎来终点. 概览.整体结构. 服务器的协议栈如何接收数据. 服务器解释request message并respond browser 接收response message并显示内容. 6. ...