
状态压缩
二分抄代码
去了18ec没资格去19ec的反向训练选手
展开
-
AtCoder Beginner Contest 199 E - Permutation
https://atcoder.jp/contests/abc199/tasks/abc199_edp[i][s]表示前i位填数字的情况是s的方案数,我们每次只要判断 i , s是否合法就行了,判合法可以先预处理cnt[s][i]表示s这个状态的前i的个数前缀和。由于每个限制条件我们只需要在i=x[i]的时候判断,所以判断用只有2^n*m次,然后朴素的dp转移时n^2*2^n#include<bits/stdc++.h>using namespace std;typedef lon原创 2021-04-24 23:42:46 · 308 阅读 · 0 评论 -
codeforces1472 F. New Year‘s Puzzle
https://codeforces.com/contest/1472/problem/F首先我们吧colum离散化,然后对于相邻两个c,他们之间的2*2的矩阵都是可以删除的,对最后的安排结果不会造成影响,那么其实坐标就让他要么差1要么差2然后再最左边的c的左边和最右边的c的右边一定都是竖着放满的,如果影响到中间是肯定有问题的最后就从左到右状压dp扫过去就行了,0表示2个都不用向右,1表示上面的放一个横的,要拓展到右边,2表示下面的,3表示上下都向右拓展#include<bits/s原创 2021-01-05 01:52:36 · 399 阅读 · 0 评论 -
AtCoder Beginner Contest 187 F - Close Group
https://atcoder.jp/contests/abc187/tasks/abc187_f有点像小米决赛的G题啊,所以就秒了dp[i]表示i这个状压状态,最少可以是多少连通块组成先预处理看这一个状态能不能用一个连通块,即全联通,那就枚举每个点看他与其他点有没有连上,可以预处理出每个点与哪些点相连了,然后用位运算O(1)判断然后再枚举i的所有子集,看能不能合并复杂度就是3^n#include<bits/stdc++.h>using namespace std;原创 2021-01-02 21:48:31 · 470 阅读 · 0 评论 -
Rikka with Game Theory 小米邀请赛G题
https://ac.nowcoder.com/acm/contest/9328/G觉得这题还挺好的,虽然2个半小时才过。。。。这题巧妙在设计状态,如果直接dfs,我们发现有3种状态,一是已经被放了数字的点,二是可以放当前数字的点,三是需要放当前数字+1的点那么就会变成3^n但是我们知道最后要填满所有点,那么必须保证当前所有可以放当前数字的点都放完了以后,也就是状态二不存在了,我们才能开始考虑放下一个数字也就是每个数字放完所有状态只剩下一三所以我们就可以精简为两种状态,每次新增一些点原创 2020-11-27 14:29:56 · 313 阅读 · 1 评论 -
L. Xian Xiang 2019ICPC银川现场赛
https://nanti.jisuanke.com/t/42392注意到n=18,于是可以快乐2^n*n*n dp一开始用dfs去给同时消除第i个和第j个的所有合法状态加入他的vector中,然后遍历所有状态枚举vector转移,dfs常数太大超时了2s都跑不过然后用个2进制mask来记录一下哪些是冲突的,然后在转移的时候&一下看能不能转,就322ms过了然后又是经典num[i][j]=0没有初始化,找一年错艹,每次队友交题我都提醒long long 初始化,边界,自己训练原创 2020-10-24 00:26:41 · 240 阅读 · 0 评论 -
gym102460 F Miss Sloane 2019ICPC Taipei
https://codeforces.com/gym/102460学习自出题人交的标程首先题目里面那个式子可以观察到发现是i*sum{e[i]},也就是你选了几个是这些e[i]之和乘以选的个数然后初始gcd最大是1e12,那么最多就是11个质因子,我们的目标就是把这些gcd中所有质因子的数字给除掉,又因为一个数字只能除以一次,所以我们如果要对某个数字进行除以操作,必定是这个数字能把gcd中的某些质因子除到0,否则就是白给所以我们最多选择不超过11个数字进行除以操作,那么就可以进行状压DP,d原创 2020-09-11 23:47:31 · 220 阅读 · 0 评论 -
codeforces1391D 505
https://codeforces.com/problemset/problem/1391/D每个偶数长度的正方形都有奇数个1,那么存在长度为4的正方形肯定不行那么把<=3的那一维状压,然后扫描另外一维进行状态转移就行了,根据状态算出这几个变成这个状态s的代价,枚举上一个位置的几个的状态t,如果满足2*2的正方形奇数个1,那么就可以从上一个位置的t状态转移到当前的s状态#include<bits/stdc++.h>#define pb push_backusing na原创 2020-08-10 01:55:43 · 293 阅读 · 0 评论 -
bzoj4774 修路
bzoj没了,(悲https://darkbzoj.tk/problem/4774理解了好久斯坦纳树的求法,学习自牛逼网友yybhttps://www.cnblogs.com/cjyyb/p/9670025.html跑出斯坦纳树以后,这题要求的是i和n-i+1相通,所以还存在最短路森林情况可能是最优解,所以最后要枚举一遍子集#include<bits/stdc++.h>using namespace std;const int maxl=1e4+10;int n,m,原创 2020-07-17 17:46:14 · 390 阅读 · 0 评论 -
codeforces 1288D Minimax Problem
https://codeforces.com/contest/1288/problem/D卧槽这题也FST了,edu round还只看罚时,,做了E也没用啊艹这题看见最小值最大,就肯定往二分上想了,然后只要想到存在s[i] | s[j] = (1<<m)-1,就行了,那么我们先把所有s[i]存入标记数组,再把他们的子集存入标记数组,再枚举每个s[i],看他们的补集有没有被标记就...原创 2020-01-15 15:28:01 · 267 阅读 · 0 评论 -
codeforces 1234F Yet Another Substring Reverse
https://codeforces.com/problemset/problem/1234/F比赛的时候看到20就想到的状压了,当时时间太少没想清楚怎么处理子集的问题赛后发现可以直接枚举某一个状态的每一位去掉转移到这个状态,卧槽,再次ak不了 div3,E题写得太久了,坐标计算之类的东西还是不熟练。#include<bits/stdc++.h>#define maxl...原创 2019-10-02 19:38:26 · 273 阅读 · 0 评论 -
codeforces1215E Marbles
https://codeforces.com/problemset/problem/1215/E设f[i][j]为i在houmian,j在后的 颜色 i,j之间需要交换的次数,那么从前枚举到后,当前的颜色a[i],如果a[i]要到某个颜色j前面,那么f[a[i]][j]+=num[j],即当前这个a[i]要和之前已经出现过的num[j]个j颜色的全部交换一次。最后只要枚举任意两种颜色...原创 2019-09-16 00:06:20 · 632 阅读 · 6 评论 -
D Knapsack Cryptosystem 2019牛客多校第9场
传送门:https://ac.nowcoder.com/acm/contest/889/D这算是经典套路了,分成两半匹配,15年学hash的时候,好多poj的题就是问有没有a+b+c+d=0这种类型的。那么这题一样,分成两半,前一半的所有情况排个序,再枚举后一半的每一种情况能不能跟前一半的某一种情况加起来恰好等于s答案就是状压的数字。#include<bits/stdc++...原创 2019-08-15 19:00:19 · 169 阅读 · 0 评论 -
2019 牛客多校第5场 E independent set 1
题目链接:https://ac.nowcoder.com/acm/contest/885/E又是一道水题没做,不过看题解时有地方想不太清楚。dp[i]表示i所代表的集合的最大独立子集的大小,随便从这个集合中取一个点x,dp[i]=max(dp[i^mi[x]],dp[i&e[x]]+1),e[x]表示与x都没有边的点的集合。之前想不太清楚为什么只要随便取一个点枚举。后来思考了一哈因为d...原创 2019-08-02 15:31:34 · 209 阅读 · 0 评论 -
codeforces 1105E 随机化 或 折半匹配查找
用1分割开的连续的2中间,只有一个人能是happy的,那么我们可以计算出f[i],用二进制表示要让i happy,需要牺牲哪些人他们不能是happy的,于是又一种随机化的做法,就是随机选取的人的顺序,然后从前到后判断当前人是否还没有被牺牲,没有被牺牲直接选。网上题解有人500次随机都过了,不过我还是学习了一个按时间写法#include<bits/stdc++.h>#define...原创 2019-01-21 10:08:58 · 545 阅读 · 0 评论 -
HDU5117 北京网络赛F
好菜啊,完全没有思路,没有想到那个X^3是突破点,(x1+x2+x3+xn)*(x1+x2+xn)*(x1+x2+xn)那么我们只要枚举i,j,k不管顺序,然后看着m个按钮按或不按,对xi,xj,xk都为1,才对答案有贡献,于是状态压缩对i,j,k一蛤就是0-8,于是复杂度是n^3*m*8。#include<bits/stdc++.h>#define maxl 51#defi...原创 2018-09-27 22:09:52 · 204 阅读 · 0 评论 -
AtCoder 3913 XOR Tree
套路,每个点的值等于所有与它相邻的边的值的亦或值对一段路径亦或,相当于对这段路径末端的2个点亦或,所有路径变成0,也就是把所有点变成0;所以统计所有点的值,相同就直接亦或他们之间的路径,然后消掉,不相同的,1-15最多1个,那么就状压DP一蛤#include<bits/stdc++.h>#define maxl 100010#define inf 2000000001...原创 2018-10-03 18:54:44 · 277 阅读 · 0 评论 -
HDU6321 Problem C. Dynamic Graph Matching
队友想的这题,T掉了,其实他们当时已经讨论状态压缩了,然而我一直在怼A,没有来想C,如果继续往状态压缩方向想的话,应该是算道水题= =,我还是太菜。补题的时候遇到一些问题,我没仔细读题,重边中不同的边算不同的方案,然后样例里又没重边,问了aols以后才找到错误,还有就是在加边的时候,要从大到小枚举状态,因为要保证每次加的dp[s^t]是加这条边之前的方案数,而删边的时候又要从小到大枚举状态,因为要...原创 2018-07-30 23:19:49 · 306 阅读 · 0 评论 -
codeforces 1009G Allowed Letters
可耻地看了题解。。。本来想直接网络流的,然而不知道怎么得到最小的解,看网上有退流的做法可以求字典序最小的最小割集,不过那个退流要每次删掉边在跑增广路,至少是n^2的复杂度,这里1e5的点肯定是不行的。于是想起cf可以看别人代码,于是肮脏地抄起了代码。发现了一种十分神奇的写法,a-f记为0-5,num[c]为字母c剩余的个数,st[i]为第i个位置可以放哪些字母的状态压缩,sum[i][s]记录...原创 2018-07-17 16:41:52 · 411 阅读 · 0 评论