BZOJ.3058.四叶草魔杖(Kruskal 状压DP)】的更多相关文章

题目链接 \(2^{16}=65536\),可以想到状压DP.但是又有\(\sum A_i\neq 0\)的问题.. 但是\(2^n\)这么小,完全可以枚举所有子集找到\(\sum A_i=0\)的,先使这整个子集内满足平衡,求一棵最小生成树就一定可以了. 这样可能会不最优,我们可以用更小的子集(小的话还是最优的)去更新大的. 还需要合并这些子集.将任意两个\(\sum A_i=0\)的子集都是合法的,且会更新到所有情况. \(2^n\times 2^n\)枚举\(\sum A_i=0\)的子集…
BZOJ_3058_四叶草魔杖_kruscal+状压DP Description 魔杖护法Freda融合了四件武器,于是魔杖顶端缓缓地生出了一棵四叶草,四片叶子幻发着淡淡的七色光.圣剑护法rainbow取出了一个圆盘,圆盘上镶嵌着N颗宝石,编号为0~N-1.第i颗宝石的能量是Ai.如果Ai>0,表示这颗宝石能量过高,需要把Ai的能量传给其它宝石:如果Ai<0,表示这颗宝石的能量过低,需要从其它宝石处获取-Ai的能量.保证∑Ai =0.只有当所有宝石的能量均相同时,把四叶草魔杖插入圆盘中央,才能…
传送门 Background 陶醉在彩虹光芒笼罩的美景之中,探险队员们不知不觉已经穿过了七色虹,到达了目的地,面前出现了一座城堡和小溪田园,城堡前的木牌上写着"Poetic Island". "这一定就是另外两位护法的所在地了--我们快进去吧!" 探险队员们快步进入了城堡,城堡大厅的羊毛沙发上坐着两个人. "你们是Nescafe的护法吧?" "是的哦~ 我们就是圣剑护法rainbow和魔杖护法freda~ 你们来这里做什么呢~"…
题目:http://www.joyoi.cn/problem/tyvj-2054 枚举点集,如果其和为0,则作为一个独立的块求一下最小生成树.因为它可以不和别的块连边. 然后状压dp即可. 别忘了判断该块能不能连通. 别忘了判断无解!(0x3f 真好用) #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; ,M=N*(N-…
BZOJ 比较裸的状压DP. 刚开始写麻烦惹... \(f[i][s]\)表示考虑了前\(i\)家商店,所买物品状态为\(s\)的最小花费. 可以写求一遍一定去\(i\)商店的\(f[i]\)(\(f[i][s]=f[i-1][s]+dis[i]\)),然后再和不去\(i\)商店的\(f[i-1]\)取个\(\min\). 复杂度是\(O(nm2^m)\)吗... 可以优化,处理\(f[s]\)表示在某家商店买\(s\)集合的物品的最小代价.然后令\(g[s]\)表示考虑所有商店买\(s\)集合…
比较简单的状压 dp,令 $f[S][i]$ 表示已经经过的点集为 $S$,且最后一个访问的位置为 $i$ 的方案数. 然后随便转移一下就可以了,可以用 $lowbit$ 来优化一下枚举. code: #include <bits/stdc++.h> #define N 21 #define LL long long #define setIO(s) freopen(s".in","r",stdin) using namespace std; const…
挺神的一道题 ~ 由于两个人选的数字不能有互质的情况,所以说对于一个质因子来说,如果 1 选了,则 2 不能选任何整除该质因子的数. 然后,我们发现对于 1 ~ 500 的数字来说,只可能有一个大于 $\sqrt 500$ 的质因子(两个的话乘积就超过 500 了) 而不大于 $\sqrt 500$ 的质因子总数只有 8 个,所以可以对这 8 个质因子状压. 我们先假设所有数字都 $\eqslant 30$,即所有质因子都 $leqslant \sqrt 500$. 定义状态 dp[i][j]…
最近写状压写的有点多,什么LIS,LCSLIS,LCSLIS,LCS全都用状压写了-这道题就是一道状压LCSLCSLCS 题意 给出一个长度为n(n<=15)n(n<=15)n(n<=15)的字符串sss,只由A,T,G,CA,T,G,CA,T,G,C组成.对于0...n0...n0...n的每一个iii,求长度为m(m<=1000)m(m<=1000)m(m<=1000)且只由A,T,G,CA,T,G,CA,T,G,C组成的串中,有多少字符串与sss的最长公共子序列(…
看范围,状压没毛病 但是如果随便连的话给开1<<16,乘上n,m就爆了 所以规定转移时只向回连边 于是想状态数组:f[i][j]表示到i这里i前K位的状态为j(表示奇偶) 发现有条数限制,但是n,m,2^K都比较小,加一维, f[i][j][k]表示前i位,用j条路,i前的K位状态为j 转移的话,因为1<=|u - v|<=K, 所以转移时必须要保证转移前一位能连到的最远距离是偶数 然后在本位就向回依次连就好了. #include<cstdio> #define mod…
显然是状压,显然不可能把所有格子压起来 仔细观察发现只有机关周围的四个格子有用以及起点,所以我们用spfa处理出这些格子两两之间的距离(注意细节--这里写挂了好几次),然后设f[s][i]为碰完的机关石状态为s,现在在有用格子的第i个的最小停下次数,转移按照套路即可 #include<iostream> #include<cstdio> #include<queue> #include<cstring> using namespace std; const…