Axel and Marston in Bitland


好开心第一次补$F$题虽然是$Div.2$

题意:

一个有向图,每条边是$0$或$1$,要求按如下规则构造一个序列然后走:

第一个是$0$,每次复制当前序列,取反后贴在后面

如:$0,01,0110,01101001,...$

注意走的是$01101001$而不是$0 01 0110 01101001$

一开始读错题了然后郁闷了好久....

求最多走几次,如果$> 1e18$就输出$-1$

(1 ≤ n ≤ 500, 0 ≤ m ≤ 2n^2)


看到了左下角的$matrices$标签就开始往矩阵乘法想

图上的路径问题可以转化成邻接矩阵的矩阵乘法

我们如果用矩阵乘法预处理出按照序列走了几次之后的矩阵貌似可做啊

然后想不太明白了就参考了一下别人的代码

$g[0/1][i]$表示正$0$反$1$,走了$2^i$步之后的矩阵

显然存在递推关系

$g[0][i]=g[0][i-1]*g[1][i-1];\ g[1][i]=g[1][i-1]*g[0][i-1];$

然后用倍增的思想从大到小选择看看能不能走这个矩阵就行了

用$a[i]$表示当前能否走到$i$,$a[i]==1$就可以走到当前矩阵所有$i$能走到的点啦

注意这里的矩阵$c[i][j]$表示能否从$i$走到$j$

然后可以用$bitset$优化,矩阵乘法可以省掉一层循环

不知道为什么常数超小......374ms

  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. #include <string>
  7. #include <bitset>
  8. using namespace std;
  9. typedef long long ll;
  10. const int N=,M=;
  11. const ll INF=1e18;
  12. inline int read(){
  13. char c=getchar();int x=,f=;
  14. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  15. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  16. return x*f;
  17. }
  18. int n,m,u,v,p;
  19. struct Matrix{
  20. bitset<N> a[N];
  21. bitset<N>& operator [](int x){return a[x];}
  22. void ini(){for(int i=;i<=n;i++) a[i].reset();}
  23. }g[][M];
  24. Matrix operator *(Matrix a,Matrix b){
  25. Matrix re;
  26. for(int i=;i<=n;i++)
  27. for(int k=;k<=n;k++) if(a[i][k])
  28. re[i]|=b[k];
  29. return re;
  30. }
  31. bitset<N> a,t;
  32. ll ans;
  33. int main(){
  34. //freopen("in","r",stdin);
  35. n=read();m=read();
  36. for(int i=;i<=m;i++){
  37. u=read();v=read();p=read();
  38. g[p][][u][v]=;
  39. }
  40. for(int i=;i<M;i++){
  41. g[][i]=g[][i-]*g[][i-];
  42. g[][i]=g[][i-]*g[][i-];
  43. }
  44. int s=;a[]=;
  45. for(int now=M-;now>=;now--){
  46. t.reset();
  47. for(int i=;i<=n;i++)
  48. if(a[i]==) t|=g[s][now][i];
  49. if(t.count()){
  50. a=t;
  51. s^=;
  52. ans+=(1LL<<now);
  53. }
  54. if(ans>INF) {puts("-1");return ;}
  55. }
  56. cout<<ans;
  57. }

CF781D Axel and Marston in Bitland [倍增 矩阵乘法 bitset]的更多相关文章

  1. 【loj2325】「清华集训 2017」小Y和恐怖的奴隶主 概率dp+倍增+矩阵乘法

    题目描述 你有一个m点生命值的奴隶主,奴隶主受伤未死且当前随从数目不超过k则再召唤一个m点生命值的奴隶主. T次询问,每次询问如果如果对面下出一个n点攻击力的克苏恩,你的英雄期望会受到到多少伤害. 输 ...

  2. 倍增&矩阵乘法 专题复习

    倍增&矩阵乘法 专题复习 PreWords 这两个基础算法我就不多说啦,但是还是要介绍一下" 广义矩阵 "乘法 其实就是把矩阵换成取\(max\),然后都一样... 据神仙 ...

  3. Codeforces 781D Axel and Marston in Bitland 矩阵 bitset

    原文链接https://www.cnblogs.com/zhouzhendong/p/CF781D.html 题目传送门 - CF781D 题意 有一个 n 个点的图,有 m 条有向边,边有两种类型: ...

  4. 4.28 省选模拟赛 负环 倍增 矩阵乘法 dp

    容易想到 这个环一定是简单环. 考虑如果是复杂环 那么显然对于其中的第一个简单环来说 要么其权值为负 如果为正没必要走一圈 走一部分即可. 对于前者 显然可以找到更小的 对于第二部分是递归定义的. 综 ...

  5. 【POJ3613】Cow Relays 离散化+倍增+矩阵乘法

    题目大意:给定一个 N 个顶点,M 条边的无向图,求从起点到终点恰好经过 K 个点的最短路. 题解:设 \(d[1][i][j]\) 表示恰好经过一条边 i,j 两点的最短路,那么有 \(d[r+m] ...

  6. Codeforces 781D Axel and Marston in Bitland

    题目链接:http://codeforces.com/contest/781/problem/D ${F[i][j][k][0,1]}$表示是否存在从${i-->j}$的路径走了${2^{k}} ...

  7. Axel and Marston in Bitland CodeForces - 782F (bitset优化)

    题目链接 $dp[0/1][i][x][y]$表示起始边为0/1, 走$2^i$ 步, 是否能从$x$走到$y$ 则有转移方程 $dp[z][i][x][y]\mid=dp[z][i-1][x][k] ...

  8. codeforces781D Axel and Marston in Bitland

    题目链接:codeforces781D 正解:$bitset$+状压$DP$ 解题报告: 考虑用$f[t][0.1][i][j]$表示从$i$出发走了$2^t$步之后走到了$j$,且第一步是走的$0$ ...

  9. CodeForces 781D Axel and Marston in Bitland DP

    题意: 有一个\(n\)个点\(m\)条边的无向图,边有两种类型,分别用\(0\)和\(1\)标识 因此图中的任意一条路径都对应一个\(01\)字符串 定义一个无限长的字符串\(s\): 开始令\(s ...

随机推荐

  1. c#中winform窗口的隐藏与显示

    最近在做一个C# 的winform客户端程序,要实现在打开新的窗口时将原来打开的窗口关闭,但是想在关闭新打开的窗口是将原来的那个窗口再次打开,在网上查找各种资料,找了很多代码,都是通过窗口.Hide( ...

  2. 多文件中的static

    这里借鉴一篇文章:http://www.cnblogs.com/yc_sunniwell/archive/2010/07/14/1777431.html#undefined 在这里举个例子,先和你说说 ...

  3. c#委托事件入门--第二讲:事件入门

    上文 c#委托事件入门--第一讲:委托入门 中和大家介绍了委托,学习委托必不可少的就要说下事件.以下思明仍然从事件是什么.为什么用事件.怎么实现事件和总结介绍一下事件 1.事件是什么:. 1.1 NE ...

  4. Jfinal——实践出真知

    什么是Jfinal? JFinal 是基于 Java 语言的极速 WEB + ORM 框架,其核心设计目标是开发迅速.代码量少.学习简单.功能强大.轻量级.易扩展.Restful.在拥有Java语言所 ...

  5. Spark性能调优之Shuffle调优

    Spark性能调优之Shuffle调优    • Spark底层shuffle的传输方式是使用netty传输,netty在进行网络传输的过程会申请堆外内存(netty是零拷贝),所以使用了堆外内存. ...

  6. 织梦中data文件夹是存放什么内容的

    dede(织梦)的data文件夹下的文件及文件夹也不少,我们来一个一个的介绍下. 1. admin文件夹 admin文件夹 管理员用到的文件夹,一般是后台的配置文件. 第一个文件,idc.txt 配置 ...

  7. 邓_mysql_面试

    问题1:你如何确定 MySQL 是否处于运行状态? 答案: Debian 上运行命令service mysql status,在RedHat 上运行命令service mysqld status.然后 ...

  8. vi命令加行号查找替换等命令

    一.加行号           : set nu二.vi查找:    当你用vi打开一个文件后,因为文件太长,如何才能找到你所要查找的关键字呢?在vi里可没有菜单-〉查找,              ...

  9. [转]maven打包报错:Failed to execute goal org.apache.maven.plugins:maven-surefire-plugin:2.5:test

    源文URL:http://blog.csdn.net/caiwenfeng_for_23/article/details/44514947 mvn compile  没有问题,mvn package的 ...

  10. 自学python Day01

    What is Python 1. 面向对象的解释行语言 2. 非常丰富的库 3. 使用制表符作为语句缩进 (white space) 优点: 1. 免费.开源 2. 可扩展性.可嵌入性 3. 非常丰 ...