【BZOJ】2165: 大楼
【题意】从第0层开始有无穷层,每层有n个房间,给定矩阵A,A[i][j]表示从第x层的房间 i 可以跳到第x+A[i][j]层的房间 j (x任意),A[i][j]=0表示不能跳。初始在第0层第1个房间,求最少跳几次可以到达>=m层。n<=100,m<=10^18。
【算法】矩阵快速幂
【题解】我的写法好像和网上的不太一样……
设$f_n[i]$表示跳n步在房间 i 的最高层数(这里全部的n和题目的n无关),考虑递推列向量$f_n$,设转移矩阵T,满足$T_{i,j}=A_{j,i}$,那么有:
$$T \times f_n=f_{n+1}$$
初始状态f0={1,0,0...0},那么写成幂形式:
$$T^n \times f_0=f_n$$
为了方便,容易发现$T^n$的最左一列就是$f_n$。
我们要跳到$f_n$中包含>=m的数字为止,所以预处理所有$T^{2^i}$,倍增即可。
复杂度O(n^3*log m+n log m)。
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=;
const ll inf=;
ll m,c2[N],c[N][N],A[][N][N],ans[N][N],ans2[N][N];
int n;
void multply(ll a[N][N],ll b[N][N],ll d[N][N]){
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
c[i][j]=-inf;//
for(int k=;k<=n;k++){
c[i][j]=max(c[i][j],a[i][k]+b[k][j]);
}
}
}
for(int i=;i<=n;i++)for(int j=;j<=n;j++)d[i][j]=c[i][j];
}
int main(){
int T;scanf("%d",&T);
while(T--){
scanf("%d%lld",&n,&m);
for(int i=;i<=n;i++){
for(int j=;j<=n;j++){
scanf("%lld",&A[][j][i]);
if(A[][j][i]==)A[][j][i]=-inf;
}
}
int tot=;
bool ok=;
for(int i=;i<=n;i++)if(A[tot][i][]>=m){ok=;break;}
if(!ok){
while(){
tot++;
multply(A[tot-],A[tot-],A[tot]);
bool ok=;
for(int i=;i<=n;i++)if(A[tot][i][]>=m){ok=;break;}
if(ok)break;
}
}
c2[]=;
for(int i=;i<=tot-;i++)c2[i]=c2[i-]*;
ll ANS=c2[tot-];
for(int i=;i<=n;i++)for(int j=;j<=n;j++)ans[i][j]=A[tot-][i][j];
for(int i=tot-;i>=;i--){
multply(ans,A[i],ans2);
bool ok=;
for(int j=;j<=n;j++)if(ans2[j][]>=m)ok=;
if(ok){
ANS+=c2[i];
for(int k=;k<=n;k++)for(int l=;l<=n;l++)ans[k][l]=ans2[k][l];//
}
}
printf("%lld\n",ANS+);
}
return ;
}
注意T[i][j]=0时设为-inf,即不可达。
网上的角度:关键在于题意的理解……给定n个点的有向图边权矩阵,0表示无边,求最少经过几条边使得路径长度>=m。
经过指定条边后的最长路矩阵是很容易知道的,设$C^x$表示经过x条边后的最长路矩阵,$A$表示有向边权矩阵(0要设为-inf),那么:
$$C^x(i,j)=\max_k\{C^{x-1}(i,k)+A(k,j)\}$$
所以C^x=A^x。
预处理$C^{2^i}$,然后倍增到第一行出现>=m的数字为止。
复杂度O(n^3 log m+n log m)。
【BZOJ】2165: 大楼的更多相关文章
- [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】
题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ...
- BZOJ 2165: 大楼 倍增Floyd
卡了一上午常数,本地13s,可是bzoj 就是过不去~ #include <bits/stdc++.h> #define N 102 #define M 55 #define ll lon ...
- BZOJ 2165: 大楼
Time Limit: 40 Sec Memory Limit: 259 MB Submit: 957 Solved: 353 [Submit][Status][Discuss] Descriptio ...
- bzoj 2165: 大楼【Floyd+矩阵乘法+倍增+贪心】
1<<i的结果需要是long long的话i是long long是没用的--要写成1ll<<i--我别是个傻子吧 虽然写的是二进制贪心,但是我觉得二分可能更好写吧(但是会慢) ...
- 大楼(bzoj 2165)
Description xz是一个旅游爱好者,这次他来到了一座新的城市.城市中央有一幢高耸入云的大楼.这幢楼到底有多少层呢?据说和非负整数的个数是一样多的.xz想爬上这座大楼来观赏新城市的全景.这幢大 ...
- bzoj 2165 DP
首先如果不考虑数据范围的话,因为每一层都是等效的,所以我们可以用w[i][j][k]来表示在某一层的j位置,称作i次电梯到k位置,最多上升多少层,那么我们可以比较容易的写出转移,因为m十分大,i可能与 ...
- bzoj AC倒序
Search GO 说明:输入题号直接进入相应题目,如需搜索含数字的题目,请在关键词前加单引号 Problem ID Title Source AC Submit Y 1000 A+B Problem ...
- BZOJ刷题指南(转)
基础(65) 巨水无比(4):1214.3816:2B题:1000A+B:2462:输出10个1 模拟/枚举/暴力(15):4063傻子模拟:1968小学生暴力:1218前缀和暴力:3856读英文:4 ...
- BZOJ 2127: happiness [最小割]
2127: happiness Time Limit: 51 Sec Memory Limit: 259 MBSubmit: 1815 Solved: 878[Submit][Status][Di ...
随机推荐
- iOS- 如何建立索引实现本地文本搜索引擎,允许容错搜索?
1.前言 实现一个本地搜索引擎,允许容错搜索,也就是搜索结果不需要和搜索的关键字完全精准匹配.比如,搜索”eric wang“,搜索结果可以包括Erica Watts等等.搜索效率十分高. 这里我们需 ...
- 【第二周】Java实现英语文章词频统计
1.需求:对于给定的英文文章进行单词频率的统计 2.分析: (1)建立一个如下图所示的数据库表word_frequency用来存放单词和其对应数量 (2)Scanner输入要查询的英文文章存入Stri ...
- php 单文件测试代码时必加入的代码
有时候为了解决BUG,需要测试一些函数或代码最终实现的效果,来排除一些影响因素.这时候需要把代码单独拎出来,放在一个php单文件中来测试.在头部最好加上三句代码如下: <?php ini_set ...
- 在mvc4中上传、导入和导出excel表方法总结
通过excel的导入导出练习,使用NPOI组件还是方便一点,所有下面就以NPOI下的导入导出给出实例,通过网页导入excel表,首先上传,再导入数据到库,这里为了方便就不导入到库中了,直接拿到数据.导 ...
- BZOJ 1925 地精部落(DP)
一道很经典的DP题. 题意:求n排列中波动排列的种数. 不妨考虑DP,令dp1[i][j],表示1-j的排列中,第一项为i之后递增的波动排列种数.dp2[i][j]表示1-j的排列中,第一项为i之后递 ...
- hdu6021[BestCoder #93] MG loves string
这场BC实在是有趣啊,T2是个没有什么算法但是细节坑的贪心+分类讨论乱搞,T3反而码起来很顺. 然后出现了T2过的人没有T3多的现象(T2:20人,T3:30人),而且T2的AC率是惨烈的不到3% ( ...
- Git Gerrit Repo User Manual
Git Repo Gerrit User Manual Revision History Revision # Description Date Author ...
- 51nod 1526 分配笔名(字典树+贪心)
题意: 班里有n个同学.老师为他们选了n个笔名.现在要把这些笔名分配给每一个同学,每一个同学分配到一个笔名,每一个笔名必须分配给某个同学.现在定义笔名和真名之间的相关度是他们之间的最长公共前缀.设笔名 ...
- Python下json中文乱码解决办法
json.dumps在默认情况下,对于非ascii字符生成的是相对应的字符编码,而非原始字符,只需要 #coding=utf8 import json js = json.loads('{" ...
- 【BZOJ1497】【NOI2006】最大获利(网络流)
[BZOJ1497][NOI2006]最大获利(网络流) 题面 BZOJ Description 新的技术正冲击着手机通讯市场,对于各大运营商来说,这既是机遇,更是挑战.THU集团旗下的CS& ...