题目链接 $dp[0/1][i][x][y]$表示起始边为0/1, 走$2^i$ 步, 是否能从$x$走到$y$ 则有转移方程 $dp[z][i][x][y]\mid=dp[z][i-1][x][k]\&dp[z\wedge1][i-1][k][y]$ 复杂度 $O(k_0n^3)$,  其中$k_0=log(1e18)$ 这里可以用bitset优化第四维的递推, bitset底层相当于若干个64bit数, 可以优化64的常数复杂度$O(\frac{k_0n^3}{\omega})$ #incl…
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^…
原文链接https://www.cnblogs.com/zhouzhendong/p/CF781D.html 题目传送门 - CF781D 题意 有一个 n 个点的图,有 m 条有向边,边有两种类型:0 和 1 . 有一个序列,其构造方案为:初始情况为 0 :对于当前串,将当前串的 0 变成 1 ,1 变成 0 ,接到当前串的后面,得到一个新串:不断进行这个操作. 最终得到一个形如 0110100110010110…… 的无限串. 问从节点 1 出发,依次经过上述串对应的 0/1 边,最多能走多…
题目链接:http://codeforces.com/contest/781/problem/D ${F[i][j][k][0,1]}$表示是否存在从${i-->j}$的路径走了${2^{k}}$步,${0,1}$表示第$1$步是走路还是骑车的. 倍增$Floyed$转移即可. 但是复杂度不对,考虑这个状态是记录的$bool$类型,将状态(${j}$)压一下位(可以用${bitset}$). #include<iostream> #include<cstdio> #inclu…
题意: 有一个\(n\)个点\(m\)条边的无向图,边有两种类型,分别用\(0\)和\(1\)标识 因此图中的任意一条路径都对应一个\(01\)字符串 定义一个无限长的字符串\(s\): 开始令\(s'=0\),然后将\(s'\)的反串\(\bar{s'}\)拼到后面得到\(s' \bar{s'}\),如此反复最终得到\(s\) 求从起点出发,在串\(s\)上走最多能走多少步 分析: 令\(arrive(i,t,u)\)表示从点\(u\)出发一共走了\(2^i\)步所能到达的点的集合,其中\(t…
题目链接: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$)那一…
[题目链接] 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 题目传送门 & 洛谷题目传送门 本来说好的不做,结果今早又忍不住开了道题/qiao 我们称度为 \(1\) 的点为叶节点,度大于 \(1\) 的点为非叶节点. 首先考虑如何求出叶节点及其连边情况,这里不妨假设叶节点个数 \(\ge 3\)​,对于 \(\le 2\)​ 的情况特判掉,具体如何特判见下文.可以发现,对于两个非叶节点 \(x,y\)​,如果它们之间存在边相连,那么就一定存在两个点,到它们之间距离 \(\le 2\)​ 的点的集合恰好是 \(\{x,y\}\)​,…
D - Bags and Coins 思路:我们可以这样构造,最大的那个肯定是作为以一个树根,所以我们只要找到一个序列a1 + a2 + a3 .... + ak 并且ak为 所有点中最大的那个,那么我们a1, a2, a3..., ak-1 作为单独的点,其他没有涉及到的点套在ak的里面. 现在问题变成了找出a1, a2, a3, a4, ... , ak. 可以用bitset优化普通dp,因为要找路径,空间开不下,所以需要分段. #include<bits/stdc++.h> #defin…
题意就是一个给出2个字符矩阵,然后进行匹配,输出每个位置的匹配的结果 (超出的部分循环处理) 一种做法是使用fft,比较难写,所以没有写 这里使用一个暴力的做法,考虑到一共只出现26个字符 所以使用一个数组G[c][i][j]表示字符c是否出现在位置(i, j),即G[c]是一个01矩阵 可以使用bitset定义G 然后考虑匹配的时候 考虑要匹配的那个矩阵B,如果当前字符是?就跳过 如果不是,就考虑这个字符会对哪些匹配位置造成影响 用bitset表示一行的状态,然后使用and和左移.右移就可以更…