原文链接https://www.cnblogs.com/zhouzhendong/p/CF781D.html

题目传送门 - CF781D

题意

  有一个 n 个点的图,有 m 条有向边,边有两种类型:0 和 1 。

  有一个序列,其构造方案为:初始情况为 0 ;对于当前串,将当前串的 0 变成 1 ,1 变成 0 ,接到当前串的后面,得到一个新串;不断进行这个操作。

  最终得到一个形如 0110100110010110…… 的无限串。

  问从节点 1 出发,依次经过上述串对应的 0/1 边,最多能走多少步。

  如果答案大于 $10^{18}$ ,输出 -1 。

  $n\leq 500,m\leq 2n^2$

题解

  首先考虑处理出两个矩阵,分别处理 0/1 两种类型的边的转移。

  于是我们可以直接矩阵倍增一下得到一个 $O(n^3 \log 10^{18})$ 的做法。

  再注意到我们只关系这些矩阵元素是否为 0 ,那么我们只需要用 bitset 优化一下矩阵乘法就好了。

  时间复杂度 $O(n^3 \log 10^{18} / 32)$ 。

代码

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
LL read(){
LL x=0,f=1;
char ch=getchar();
while (!isdigit(ch)&&ch!='-')
ch=getchar();
if (ch=='-')
f=-1,ch=getchar();
while (isdigit(ch))
x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
return x*f;
}
const int N=505;
const LL INF=1000000000000000000LL;
int n,m;
struct Mat{
bitset <N> v[N];
Mat(){}
Mat(int x){
for (int i=1;i<=n;i++)
v[i].reset();
for (int i=1;i<=n;i++)
v[i][i]=x;
}
friend Mat operator * (Mat a,Mat b){
Mat ans(0);
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (a.v[i][j])
ans.v[i]|=b.v[j];
return ans;
}
}M[2][35];
int main(){
n=read(),m=read();
M[0][0]=M[1][0]=Mat(0);
for (int i=1;i<=m;i++){
int a=read(),b=read(),t=read();
M[t][0].v[a][b]=1;
}
int k=0;
while (M[0][k].v[1].count()&&(1LL<<(k<<1))<=INF){
k++;
M[0][k]=M[0][k-1]*M[1][k-1]*M[1][k-1]*M[0][k-1];
M[1][k]=M[1][k-1]*M[0][k-1]*M[0][k-1]*M[1][k-1];
}
LL s=0,p=0;
Mat now(0);
now.v[1][1]=1;
while (k>0&&s<=INF){
k--;
if ((now*M[p][k]).v[1].count()){
now=now*M[p][k];
s+=1LL<<(k<<1);
p^=1;
if ((now*M[p][k]).v[1].count()){
now=now*M[p][k];
s+=1LL<<(k<<1);
if ((now*M[p][k]).v[1].count()){
now=now*M[p][k];
s+=1LL<<(k<<1);
p^=1;
}
}
}
}
if (s>INF)
puts("-1");
else
cout << s << endl;
return 0;
}

  

Codeforces 781D Axel and Marston in Bitland 矩阵 bitset的更多相关文章

  1. Codeforces 781D Axel and Marston in Bitland

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

  2. CodeForces 781D Axel and Marston in Bitland DP

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

  3. CF781D Axel and Marston in Bitland [倍增 矩阵乘法 bitset]

    Axel and Marston in Bitland 好开心第一次补$F$题虽然是$Div.2$ 题意: 一个有向图,每条边是$0$或$1$,要求按如下规则构造一个序列然后走: 第一个是$0$,每次 ...

  4. 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] ...

  5. codeforces781D Axel and Marston in Bitland

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

  6. codeforces 711B - Chris and Magic Square(矩阵0位置填数)

    题目链接:http://codeforces.com/problemset/problem/711/B 题目大意: 输入 n ,输入 n*n 的矩阵,有一个占位 0 , 求得将 0 位置换成其他的整数 ...

  7. Educational Codeforces Round 13 D. Iterated Linear Function (矩阵快速幂)

    题目链接:http://codeforces.com/problemset/problem/678/D 简单的矩阵快速幂模版题 矩阵是这样的: #include <bits/stdc++.h&g ...

  8. Codeforces 917C - Pollywog(状压 dp+矩阵优化)

    UPD 2021.4.9:修了个 typo,为啥写题解老出现 typo 啊( Codeforces 题目传送门 & 洛谷题目传送门 这是一道 *2900 的 D1C,不过还是被我想出来了 u1 ...

  9. Codeforces 450B div.2 Jzzhu and Sequences 矩阵快速幂or规律

    Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, ple ...

随机推荐

  1. 单点登录SSO的原理及实现方式总结

      核心思想   用户信息的集中存储(全局Cooike.集中式Session.Json Web Token.Redis缓存服务器.自定义SSO服务器)   认证(Filter中执行)   登出(不同站 ...

  2. response.setContentType()的String参数及对应类型

    response.addHeader("Content-Disposition", "attachment;filename="+ filename); res ...

  3. 安装python的pip模块

    安装python的pip模块 网址https://pypi.python.org/pypi/pip 选择,点击下载 将文件解压到C:\Users\Administrator\AppData\Local ...

  4. iOS -- Effective Objective-C 阅读笔记 (2)

    1: 多用类型常量, 少用 #define 预处理指令 #define 预处理指令会把碰到的所有 指定名称 一律换位 定义的内容, 这样的话, 假设此指令在某个头文件中, 那么所有引入这个头文件的代码 ...

  5. 关闭VirtualBox虚拟机的时钟同步

    原文链接:关闭VirtualBox虚拟机的时钟同步 在VirtualBox的虚拟机上默认虚拟机的时间是会和物理机同步的,但可以通过下面的命令来关闭 1. 首先查看虚拟机列表 VBoxManage li ...

  6. Confluence 6 数据库整合的限制

    数据库整合的限制 注意: Confluence 自带的 XML 方式导出方法并不适用于备份和整合大数据集.这里有一些第三方的数据库工具你可以使用能够帮助你对大数据集进行备份和整合.如果你在选择正确工具 ...

  7. MySQL外键使用详解

    一.基本概念 1.MySQL中“键”和“索引”的定义相同,所以外键和主键一样也是索引的一种.不同的是MySQL会自动为所有表的主键进行索引,但是外键字段必须由用户进行明确的索引.用于外键关系的字段必须 ...

  8. HTML&javaSkcript&CSS&jQuery&ajax(九)

    一.HTML 1.单选按钮 <form action="><inpput type="radio" name="sex" value ...

  9. python(5):scipy之numpy介绍

    python 的scipy 下面的三大库: numpy, matplotlib, pandas scipy 下面还有linalg 等 scipy 中的数据结构主要有三种: ndarray(n维数组), ...

  10. 最小标示法模板 poj1509

    最小标示法:给定一个字符串,不断将其最后一个字符放到开头,最终会得到n个字符串,称这n个字符串循环同构,这些字符串中字典序最小的一个,就是最小表示法 #include<iostream> ...