[HNOI2010] 公交线路 bus
标签:状态压缩+矩阵快速幂。
题解:
首先看范围,p<=10,那么我们可以想到状态压缩。我们把从一个长度为10的区间进行压缩,1代表可以,那么当值一个区间的1的个数为k个,我们就认为他是合法的。要注意这里所定义的区间,是有起点的,但是没有记下来,因为没有必要。然后我们就可以想一下状态是怎么转移的。那么可行的状态有多少种呢?C(9,4)种。
然后两种状态是否能够转移是需要我们判断的,我们每次转移时只能移动一个公共汽车,并且是移动最前面的汽车,这样就可以避免重复统计的情况了前面说道区间是有起点的,那么这一区间的最前的汽车向后移动,对于后面的下一个状态来说,他的起点是向后移动了一格的,所以只需把后一个状态向前左移一位,再去判断是否有且仅有一个不同即可。
(这里有一个小技巧,那就是我们众所周知的树状数组的lowbit,(X & -X)代表的是X从右往左数的第一个1的位置,如100100就是位置3,那么返回2^2。所以利用这一点可以很好的判断一个数有多少个1,以及两个数是否仅仅相差一位不同。)
然后我们想想怎么办。我们每转移一个状态,就是移动一个汽车,那么初始时到结束时的状态就应该要移动n-k次。第一次汽车在起始站不要移动,后面要覆盖所有的车站就是n-k次,那么我们如过把状态看成一个点,能否转移看成一条边的话,一个很美妙的结论我们就可以使用了。
对于一个无权DAG,他的邻接矩阵的p次方就是两点直接距离为p的方案数。我们就这样使用矩阵快速幂,就可以统计出答案了。
终点状态:第n-k个车站为压缩状态的第一位,后面k位都是1。所以是1111110000(k个1,p-k个0)。起始状态是1000000000(其实按道理是1111110000,和终点状态一样,只是前面的i不同,省略了。)最后再使用初始矩阵去乘以转移矩阵的n-k次方就行了。
其实来说,对于初始矩阵×转移矩阵,这里是很鬼畜的,初始矩阵s[1][End]。最后查询s[1][End]。稍微算一算就可以发现,起始就是转移矩阵中的s[End][End]吧!所以也可以直接输出转移矩阵,这也是合情合理的。
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN=,mod=;
int n,p,k,top,END;
int que[MAXN];
struct ed
{
int s[MAXN][MAXN];
ed operator *(ed a)
{
ed b;
for(int i=;i<=top;i++)
for(int j=;j<=top;j++)
{
b.s[i][j]=;
for(int k=;k<=top;k++)
b.s[i][j]=(b.s[i][j]+s[i][k]*a.s[k][j])%mod;
}
return b;
}
}T,A;
ed pow(ed x,int p)
{
ed base=x;
p--;
while(p>)
{
if(p&)x=x*base;
base=base*base;
p/=;
}
return x;
}
bool can(int x,int y)
{
y=(y-(<<(p-)))<<;
int z=x^y;
if(z==(z&-z))return ;
return ;
}
int cal(int x)
{
int tot=;
while(x>)
{
x-=(x&-x);
tot++;
}
return tot;
}
int main()
{
cin>>n>>k>>p;
int L=<<(p-),R=(<<p)-,End=(<<p)--(((<<(p-k))-));
for(;L<=R;L++)
{
if(cal(L)==k) que[++top]=L;
if(L==End) END=top;
}
for(int i=;i<=top;i++)
for(int j=;j<=top;j++)
if(can(que[i],que[j]))
T.s[i][j]=;
T=pow(T,n-k);
A.s[][END]=;
A=A*T;
cout<<A.s[][END]<<endl;
return ;
}
[HNOI2010] 公交线路 bus的更多相关文章
- bzoj2004 [Hnoi2010]公交线路
Description 小Z所在的城市有N个公交车站,排列在一条长(N-1)km的直线上,从左到右依次编号为1到N,相邻公交车站间的距 离均为1km. 作为公交车线路的规划者,小Z调查了市民的需求,决 ...
- BZOJ2004 HNOI2010公交线路(状压dp+矩阵快速幂)
由数据范围容易想到矩阵快速幂和状压. 显然若要满足一辆公交车的相邻站台差不超过p,则每相邻p个站台中每辆车至少经过一个站台.可以发现这既是必要的,也是充分的. 开始的时候所有车是相邻的.考虑每次把一辆 ...
- [HNOI2010]公交线路
题目 发现\(n\)比较大,但是\(k,p\)都很小,考虑矩乘使得复杂度倾斜一下 发现所有车的最大间隔都是\(p\),还保证\(k<p\),于是我们可以考虑压下最后\(p\)位的情况 于是设\( ...
- 洛谷 P3204 [HNOI2010]公交线路
题面 luogu 题解 矩阵快速幂\(+dp\) 其实也不是很难 先考虑朴素状压\(dp\) \(f[i][S]\) 表示最慢的车走到了\(i\),\([i, p+i-1]\)的覆盖情况 状态第一位一 ...
- 【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$的方案数 这是什么意思 ...
- [LeetCode] Bus Routes 公交线路
We have a list of bus routes. Each routes[i] is a bus route that the i-th bus repeats forever. For e ...
- [HNOI 2010]Bus 公交线路
Description 题库链接 有 \(N\) 个车站, \(K\) 条公交线路.第 \(1\) 到 \(K\) 站是这 \(K\) 线路的起点站.第 \(N-K+1\) 到 \(N\) 是终点站. ...
- 公交线路免费api接口代码
描写叙述:本接口主要是依据城市名称 + 线路名称 模糊查找城市公交线路信息. 开源api接口:http://openapi.aibang.com/bus/lines?app_key=keyvalue ...
随机推荐
- input光标位置
兼容谷歌火狐-input光标位置 input框在没有添加任何效果的情况下,输入文字后光标始终在最后的位置,谷歌||火狐效果一样 但是在给input加入点击事件后 谷歌:input框插入文字后,光标会自 ...
- difference between http get and post
1 用get的地方 在浏览器中输入url直接访问资源时,用get.get是通过url传参的. 2 用post的地方 2.1 url长度超限时 post是将参数放在http body中的,因此对参数的长 ...
- ora-12170 与 Oracle lsnrctl
在startup 启动数据库后,使用plsql去连接数据库时, 出现ora-12170 错误: 在启动.关闭或者重启oracle监听器之前确保使用lsnrctl status命令检查oracle监 ...
- ios怎样在一个UIImageButton的里面加一些自己定义的箭头
能够採用例如以下方法,写一个函数: -(UIImage*) getOneImageButtonWithArrow{ //tmpView做附控件 UIView *tmpView = [[UIView a ...
- Java其实不支持垃圾回收
Java其实不支持垃圾回收.如果真的支持的话,大多数Java程序在运行的一开始就应该把程序本身删除,因为这些程序本身就是垃圾. // TODO: This is a 分割线. Please no ...
- 最大流EK算法
给定一个有向图G=(V,E),把图中的边看作 管道,每条边上有一个权值,表示该管道 的流量上限.给定源点s和汇点t,现在假设 在s处有一个水源,t处有一个蓄水池,问从 s到t的最大水流量是多少? 网络 ...
- php MVC原理
一直用php的mvc模式,但是一直没深入研究其原理性的东西,今天把最基本的mvc原理模型总结如下: 1.url访问方式 http://127.0.0.1:8080/ceshi.com/index.p ...
- java基础以及操作Excle
今天把会经常用的几个集合的迭代方法又练习了一下,放在这里,经常复习! map集合迭代 /*** 迭代map[1]*/ for (Integer key : map.keySet()) {//迭代key ...
- UVa 11572 唯一的雪花(优化策略)
题目描述: 输入一个长度为n(n<=1000000)的序列A, 找到一个尽量长的连续子序列A(L)-->A(R),是的该序列中没有相同的元素. 输入: T:代表组数 n:代表有n个数 这一 ...
- UVA1482 Playing With Stones —— SG博弈
题目链接:https://vjudge.net/problem/UVA-1482 题意: 有n堆石子, 每堆石子有ai(ai<=1e18).两个人轮流取石子,要求每次只能从一堆石子中抽取不多于一 ...