题目链接 https://codeforces.com/problemset/problem/1007/D 题解 其实这道题本身还是挺简单的,这里只是记录一下 2-SAT 的前缀优化建图的相关内容. 由于问题的本质是给定许多二元集合,判断是否能从每一个二元集合中选出一个元素,使得所有选出的元素合法,因此考虑使用 2-SAT 解决该问题. 不难发现,使用 2-SAT 解决该问题的复杂度瓶颈在于建图. 我们为每一种颜色 \(i\) 对应的两条路径赋上编号.首先,我们需要为每一条树边记录包含该条边的所…
题意 一个 \(n\) 点 \(m\) 边的有向图,还有一棵 \(k\) 个节点的 trie ,每条边上有一个字符串,可以用 trie 的根到某个节点的路径来表示.每经过一条边,当前携带的字符串就会变成边上的字符串,经过一条边的代价是边权+边上的字符串和当前字符串的 lcp,问从 1 号点走到所有点的最小代价. \(n,m\le 50000, k\le 20000\) 分析 将边看成点,如果有 \(e1 \rightarrow x\rightarrow e2\) , 连边 \(e1 \right…
[CF587D]Duff in Mafia 题意:给你一张n个点m条边的无向图,边有颜色和边权.你要从中删去一些边,满足: 1.任意两条删掉的边没有公共的顶点.2.任意两条剩余的.颜色相同的边没有公共的顶点.3.删去的边的边权最大值最小. 求这个最小值,并输出方案. $n,m\le 5\times 10^4$ 题解:首先二分答案.我们二分删去边权的最大值mid,则所有>mid的边都要保留,其余的可以保留也可以删去.因为每条边有删或不删两种状态,所以容易转化为2-SAT模型.于是题中条件可以转化成…
题目链接 每个城市要么建首都要么不建,考虑2-SAT 这样一个国家内城市两两连边是很显然的,但是边数为O(n^2) 每个国家中仅有一个建首都,考虑新建前缀S[i]=1/0这2n个点表示当前国家的[1,i]中建了/没建首都 现在考虑这些限制:(A[i]=1/0表示i城市建/不建) 0.若A[i]=1,则S[i]=1:若S[i]=0,则A[i]=0(对于i自己) 1.若A[i]=1,则S[i-1]=0:若S[i-1]=1,则A[i]=0 (一个国家一个首都的限制)(前者由A[i]->A[i-1]'是…
Description 有n个城镇被分成了k个郡,有m条连接城镇的无向边. 要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都. Input 第一行有三个整数,城镇数n(1<=n<=10^6),边数m(0<=m<=10^6),郡数k(1<=k<=n). 接下来m行,每行有两个整数ai和bi(ai≠bi),表示有一条无向边连接城镇ai和bi. 接下来k行,第j行以一个整数wj开头,后面是wj个整数,表示第j个郡包含的城镇. Output 若有解输出TAK,否…
3495: PA2010 Riddle 2-sat 前缀优化 链接 bzoj 思路 不想说啥了,看hwim的吧,我去睡觉了zZ. 代码 /************************************************************** Problem: 3495 User: gryz2016 Language: C++ Result: Accepted Time:19152 ms Memory:178896 kb ***************************…
[题意]有n个城镇被分成了k个郡,有m条连接城镇的无向边.要求给每个郡选择一个城镇作为首都,满足每条边至少有一个端点是首都.n,m,k<=10^6. [算法]2-SAT,前后缀优化建图 [题解]每个城镇只有作为首都和不是首都两种选项,即2-sat问题. 2-sat问题中所有边必须加反向边,下面过程忽略反向边. 对于一条边(x,y),如果x是0,那么y必须是1,即x-y'.(y-x'是反向边,考虑的时候忽略) 但是一个郡只有一个首都有点烦,有一种套路叫前后缀优化建图. 对于每个点x,假设一个点x+…
3495: PA2010 Riddle 链接 分析: 每个点要么建首都,要么不建,并且一个点建了,会导致一些点不能建.所以可以考虑2-sat. 但是如果在每个郡里两两连边,边数是n^2的. 考虑用前缀优化. S[i]表示对于当前郡,前i个点中是否存在一个首都,A[i]表示i这个点是否建首都. 1.那么有A[i]=1,则S[i]=1,同样有它的逆否命题:S[i]=0,则A[i]=0. 2.根据前缀的性质有S[i-1]=1,则S[i]=1,逆否命题:S[i]=0,则S[i-1]=0. 3.由于每个郡…
好题 np. 对于20分 显然可以爆搜. 对于50分 可以发现每个字符串上的问号要么是0,要么是1.考虑枚举一个字符串当前是0还是1 这会和其他字符串产生矛盾. 所以容易 发现这是一个2-sat问题. 拆点 把任意两个产生矛盾的字符串进行连边.然后最后判矛盾即可. n^2枚举 建图 判断矛盾时使用字符串hash 要分类讨论4种情况. using namespace std; const int MAXN=1010,maxn=500010,cc1=19260817,cc2=114514; int…
题目链接: [十二省联考2019]字符串问题 首先考虑最暴力的做法就是对于每个$B$串存一下它是哪些$A$串的前缀,然后按每组支配关系连边,做一遍拓扑序DP即可. 但即使忽略判断前缀的时间,光是连边的时间就会爆炸,显然不能暴力连边. 对于前缀不好解决,可以将字符串翻转然后变成判断是否是后缀. 可以发现对于后缀自动机的$parent$树,每个节点是子树内所有节点的后缀. 那么我们可以利用$parent$树来优化建图过程,将树上每个点向子节点连边. 对于每个$A$串和$B$串在后缀自动机上匹配出对应…