Codeforces 781D Axel and Marston in Bitland 矩阵 bitset

原文链接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;
}

  

原文地址:https://www.cnblogs.com/zhouzhendong/p/CF781D.html

时间: 2024-10-10 14:01:58

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

codeforces781D Axel and Marston in Bitland

题目链接:codeforces781D 正解:$bitset$+状压$DP$ 解题报告: 考虑用$f[t][0.1][i][j]$表示从$i$出发走了$2^t$步之后走到了$j$,且第一步是走的$0$或者$1$,这个状态是否存在. 转移式子的话就是$f[t][z][i][j]$$|=$$f[t-1][z][i][k]$ & $f[t-1][z$ ^ $1][k][j]$. 但是复杂度太高了,我们考虑压位,因为反正每个状态都只记录了$0$.$1$,那么我还不如把最后那一维(也就是上面的$j$)那一

Codeforces 506E Mr. Kitayuta&#39;s Gift - 动态规划 - 矩阵

题目传送门 通往Codeforces的航线 通往vjudge的航线 题目大意 给定一个仅包含小写字母的串$s$,要求插入恰好$n$个小写字母字符,使得新串为回文串.问这样得到的新串有多少个是本质不同回文串. $1\leqslant |s| \leqslant 200,1 \leqslant n \leqslant 10^{9} $ 神题orz...orz...orz.Petr orz...orz...orz. 好了开始扯正题了. 任意位置插入并不太好处理.可以转化一下这个问题,求一个长度为$|s

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, please calculate fn modulo 1000000007 (109 + 7). Input The first line contains two integers x and y (|x|, |y| ≤ 109). The second line contains a single i

Codeforces 788C The Great Mixing(背包问题建模+bitset优化或BFS)

[题目链接] http://codeforces.com/problemset/problem/788/C [题目大意] 给出一些浓度的饮料,要求调出n/1000浓度的饮料,问最少需要多少升饮料 [题解] 设浓度为a,现在要求出系数x1,x2,x3……,使得x1*a1+x2*a2+x3*a3+……=n*(x1+x2+x3+……) 得a1*(x1-n)+a2*(x2-n)+a3*(x3-n)+……=0 假设现在有x1-n和x2-n,设其数值为x和y,那么一定有(x)*y+(-y)*x=0, x+y

Codeforces Round #403 (Div. 1, based on Technocup 2017 Finals)

Div1单场我从来就没上过分,这场又剧毒,半天才打出B,C挂了好几次最后还FST了,回紫了. AC:AB Rank:340 Rating:2204-71->2133 Div2.B.The Meeting Place Cannot Be Changed 题目大意:n个人,第i个人位于xi,速度为vi,找到一个点使得所有人到这个点的耗时最小,输出耗时.(n<=60000) 思路:二分答案,知道耗时后可以求出每个人能到达的区间,如果所有区间有交则合法,复杂度O(nlog). #include<

Hiho1041 国庆出游 搜索题解

题目3 : 国庆出游 时间限制:1000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi和小Ho准备国庆期间去A国旅游.A国的城际交通比较有特色:它共有n座城市(编号1-n):城市之间恰好有n-1条公路相连,形成一个树形公路网.小Hi计划从A国首都(1号城市)出发,自驾遍历所有城市,并且经过每一条公路恰好两次--来回各一次--这样公路两旁的景色都不会错过. 令小Hi苦恼的是他的小伙伴小Ho希望能以某种特定的顺序游历其中m个城市.例如按3-2-5的顺序游历这3座城市.(具体来讲是要

【矩阵快速幂 】Codeforces 450B - Jzzhu and Sequences (公式转化)

[题目链接]click here~~ [题目大意] Jzzhu has invented a kind of sequences, they meet the following property: You are given x and y, please calculate fn modulo1000000007(109?+?7). [解题思路] /*A - Jzzhu and Sequences Codeforces 450B - Jzzhu and Sequences ( 矩阵快速幂 )

Codeforces Round #257 (Div. 2) B. Jzzhu and Sequences (矩阵快速幂)

题目链接:http://codeforces.com/problemset/problem/450/B 题意很好懂,矩阵快速幂模版题. 1 /* 2 | 1, -1 | | fn | 3 | 1, 0 | | fn-1 | 4 */ 5 #include <iostream> 6 #include <cstdio> 7 #include <cstring> 8 using namespace std; 9 typedef __int64 LL; 10 LL mod =

CodeForces 450B (矩阵快速幂模板题+负数取模)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=51919 题目大意:斐波那契数列推导.给定前f1,f2,推出指定第N项.注意负数取模的方式:-1%(10^9+7)=10^9+6. 解题思路: 首先解出快速幂矩阵.以f3为例. [f2]  * [1 -1] = [f2-f1]=[f3]  (幂1次) [f1]  * [1  0]     [f2]      [f2] 于是fn=[f2] *[1 -1]^(n-2)