卡了一上午常数,本地13s,可是bzoj 就是过不去~

#include <bits/stdc++.h>
#define N 102
#define M 55
#define ll long long
#define inf -1
#define setIO(s) freopen(s".in","r",stdin) , freopen("de.out","w",stdout)
using namespace std;
char *p1,*p2,buf[100000];
#define nc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,100000,stdin),p1==p2)?EOF:*p1++)
int rdint() {int x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
ll rdll() {ll x=0; char c=nc(); while(c<48) c=nc(); while(c>47) x=(((x<<2)+x)<<1)+(c^48),c=nc(); return x;}
int n;
ll m;
ll f[N][N],dis[N][N][70],tmp[N],g[N];
void solve()
{
int i,j,k;
n=rdint();
m=rdll();
for(i=0;i<=n;++i)
for(j=0;j<=n;++j)
for(k=0;k<70;++k) dis[i][j][k]=-1;
for(i=1;i<=n;++i)
{
for(k=0;k<=M;++k)
dis[i][i][k]=0;
}
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
ll p=rdll();
if(p)
{
dis[i][j][0]=max(dis[i][j][0], p);
}
}
}
for(int l=1;;++l)
{
for(k=1;k<=n;++k)
{
for(i=1;i<=n;++i)
{
for(j=1;j<=n;++j)
{
if(dis[i][k][l-1]!=-1 && dis[k][j][l-1]!=-1)
{
dis[i][j][l]=max(dis[i][j][l], dis[i][k][l-1]+dis[k][j][l-1]);
}
}
}
}
ll re=0;
for(i=1;i<=n;++i) re=max(re, dis[1][i][l]);
if(re>=m) {
i=l;
break;
}
}
int flag=0;
ll ans=0;
for(int l=i;l>=0;--l)
{
if(!flag)
{
flag=1;
for(i=1;i<=n;++i)
{
if(dis[1][i][l]>=m)
{
flag=0;
}
}
if(flag==0) continue;
else
{
// for(i=1;i<=n;++i)
for(j=1;j<=n;++j) tmp[j]=dis[1][j][l];
ans+=(1ll<<l);
}
}
else
{
for(i=0;i<=n;++i) g[i]=-1;
for(k=1;k<=n;++k)
{
for(j=1;j<=n;++j)
{
if(dis[k][j][l]!=inf && tmp[k]!=inf)
{
g[j]=max(g[j], tmp[k]+dis[k][j][l]);
}
}
}
int cc=0;
for(i=1;i<=n;++i) if(g[i]>=m) cc=1;
if(!cc)
{
for(j=1;j<=n;++j) tmp[j]=g[j];
ans+=(1ll<<l);
}
}
}
printf("%lld\n",ans+1);
}
int main()
{
// setIO("input");
int T;
scanf("%d",&T);
while(T--)
{
solve();
}
return 0;
}

  

BZOJ 2165: 大楼 倍增Floyd的更多相关文章

  1. bzoj 2165: 大楼【Floyd+矩阵乘法+倍增+贪心】

    1<<i的结果需要是long long的话i是long long是没用的--要写成1ll<<i--我别是个傻子吧 虽然写的是二进制贪心,但是我觉得二分可能更好写吧(但是会慢) ...

  2. [BZOJ 2165] 大楼 【DP + 倍增 + 二进制】

    题目链接:BZOJ - 2165 题目分析: 这道题我读了题之后就想不出来怎么做,题解也找不到,于是就请教了黄学长,黄学长立刻秒掉了这道题,然后我再看他的题解才写出来..Orz 使用 DP + 倍增 ...

  3. BZOJ 2165: 大楼

    Time Limit: 40 Sec Memory Limit: 259 MB Submit: 957 Solved: 353 [Submit][Status][Discuss] Descriptio ...

  4. bzoj2165: 大楼(倍增floyd)

    题目大意:一个有向图,n(<=100)个点求一条长度>=m(<=10^18)的路径最少经过几条边. 一开始以为是矩乘,蓝鹅当时还没开始写,所以好像给CYC安利错了嘿嘿嘿QWQ 第一眼 ...

  5. BZOJ.4180.字符串计数(后缀自动机 二分 矩阵快速幂/倍增Floyd)

    题目链接 先考虑 假设S确定,使构造S操作次数最小的方案应是:对T建SAM,S在SAM上匹配,如果有S的转移就转移,否则操作数++,回到根节点继续匹配S.即每次操作一定是一次极大匹配. 简单证明:假设 ...

  6. 【CF461E】Appleman and a Game 倍增floyd

    [CF461E]Appleman and a Game 题意:你有一个字符串t(由A,B,C,D组成),你还需要构造一个长度为n的字符串s.你的对手需要用t的子串来拼出s,具体来说就是每次找一个t的子 ...

  7. 2018.11.09 bzoj4773: 负环(倍增+floyd)

    传送门 跟上一道题差不多. 考虑如果环上点的个数跟最短路长度有单调性那么可以直接上倍增+floyd. 然而并没有什么单调性. 于是我们最开始给每个点初始化一个长度为0的自环,于是就有单调性了. 代码: ...

  8. 2018.11.09 bzoj1706: relays 奶牛接力跑(倍增+floyd)

    传送门 倍增+floyd板子题. 先列出状态fi,j,kf_{i,j,k}fi,j,k​表示经过iii条边从jjj到kkk的最短路. 然后发现可以用fi−1,j,kf_{i-1,j,k}fi−1,j, ...

  9. BZOJ4773: 负环(倍增Floyd)

    题意 题目链接 Sol 倍增Floyd,妙妙喵 一个很显然的思路(然而我想不到是用\(f[k][i][j]\)表示从\(i\)号点出发,走\(k\)步到\(j\)的最小值 但是这样复杂度是\(O(n^ ...

随机推荐

  1. 小木棒HDU1455(DFS+剪枝)

    题意:HDU1455 给出n个小木棒的长度,他们是又数根长度相同的木棒剪短得来的,问没剪短之前的木棒长度最短是多少. 思路: 见代码:https://www.cnblogs.com/fqfzs/p/9 ...

  2. 15.Ansible安装与配置简单版

    Ansible是一个简单高效的自动化运维管理工具,用Python开发,能大批量管理N多台机器,可以并发的在多台机器上部署应用.安装软件.执行命令.配置和编排任务. 一.Ansible工作机制 从图中可 ...

  3. 【背包问题】PACKING

    题目描述 It was bound to happen.  Modernisation has reached the North Pole.  Faced with escalating costs ...

  4. vue-slick 插件配置

    autoplay 布尔值 false 自动播放 autoplaySpeed 整数 3000 自动播放间隔 centerMode 布尔值 false 中心模式 centerPadding 字符串 ’50 ...

  5. 怎样使当前cookie只有在加密协议https环境下才能将它发送到服务器

    使用 Secure 属性. 注意, 这个属性基本是"自动"的, 也就是说, 如果当前网页是https请求的, 那里面的各种HTTP请求的cookie都会自定加上这个属性, 如果当前 ...

  6. hdu 1869 枚举+Dijstra

    一点小变形就是了..] #include<iostream> #include<cstdio> #define maxn 201 #define inf 999999 usin ...

  7. C#【堆与栈 值类型 引用类型】

    先说C#中值类型和引用类型 概念: 1.值类型:数据存储在内存的堆栈中,从堆栈中可以快速地访问这些数据,因此,值类型表示实际的数据. 2.引用类型:表示指向存储在内存堆中的数据的指针或引用(包括类.接 ...

  8. PHP 获取数组指定值的位置或下标

    <?php     //定义一个数组     $array = array(0 => 'a', 1 => 'b', 2 => 'c', 3 => 'd');     // ...

  9. 编译luacheck Linux版

    最近在写Visual Studio Code的Lua插件,需要把luacheck集成进去.但是luacheck默认只提供了win32版本,见https://github.com/mpeterv/lua ...

  10. C++中volatile

    volatile只保证其“可见性”,不保证其“原子性”. 执行count++;这条语句由3条指令组成: (1)将 count 的值从内存加载到 cpu 的某个 寄存器r: (2)将 寄存器r 的值 + ...