折半搜索+Hash表+状态压缩 | [Usaco2012 Open]Balanced Cow Subsets | BZOJ 2679 | Luogu SP11469
题面:SP11469 SUBSET - Balanced Cow Subsets
题解:
对于任意一个数,它要么属于集合A,要么属于集合B,要么不选它。对应以上三种情况设置三个系数1、-1、0,于是将题目转化
为找出两个集合和为0,将这两个集合合并不重复的为一种答案。考虑折半搜索。搜出前一半和后一半,用哈希表和状态压缩记录
和去重,然后统计答案即可。
时间复杂度为O(6^(N/2))。
代码:
#include<cstdio>
using namespace std;
const int maxn=,MOD=,max_num=6e4;
int N,M[maxn],num=,ans=,nx[max_num],hd[MOD+];
int Tmp[max_num],Sum[max_num],hf,ps;
bool vis[][];
inline void Insert(int tmp,int sum){
ps=(sum%MOD+MOD)%MOD;
for(int i=hd[ps];i;i=nx[i])
if(Tmp[i]==tmp && Sum[i]==sum) return;//
nx[++num]=hd[ps];
Tmp[num]=tmp;
Sum[num]=sum;
hd[ps]=num;
return;
}
inline int Find(int tmp,int sum){
ps=(sum%MOD+MOD)%MOD;
int ans=;
for(int i=hd[ps];i;i=nx[i])
if(Sum[i]==sum && vis[Tmp[i]][tmp]==){
vis[Tmp[i]][tmp]=;
ans++;
}
return ans;
}
inline void Dfs1(int tp,int sum,int tmp){
if(tp>hf){
Insert(tmp,sum);
return;
}
Dfs1(tp+,sum+M[tp],tmp<<|);
Dfs1(tp+,sum-M[tp],tmp<<|);
Dfs1(tp+,sum,tmp<<);
return;
}
inline void Dfs2(int tp,int sum,int tmp){
if(tp>N){
ans+=Find(tmp,-sum);
return;
}
Dfs2(tp+,sum+M[tp],tmp<<|);
Dfs2(tp+,sum-M[tp],tmp<<|);
Dfs2(tp+,sum,tmp<<);
return;
}
int main(){
scanf("%d",&N);
hf=N>>;
for(int i=;i<=N;i++) scanf("%d",&M[i]);
Dfs1(,,);
Dfs2(hf+,,);
printf("%d\n",ans-);
return ;
}
By:AlenaNuna
折半搜索+Hash表+状态压缩 | [Usaco2012 Open]Balanced Cow Subsets | BZOJ 2679 | Luogu SP11469的更多相关文章
- 【BZOJ 2679】[Usaco2012 Open]Balanced Cow Subsets(折半搜索+双指针)
[Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\) ...
- bzoj2679: [Usaco2012 Open]Balanced Cow Subsets(折半搜索)
2679: [Usaco2012 Open]Balanced Cow Subsets Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 462 Solv ...
- BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针
BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针 Description Farmer John's owns N ...
- bzoj2679:[Usaco2012 Open]Balanced Cow Subsets
思路:折半搜索,每个数的状态只有三种:不选.选入集合A.选入集合B,然后就暴搜出其中一半,插入hash表,然后再暴搜另一半,在hash表里查找就好了. #include<iostream> ...
- BZOJ2679 : [Usaco2012 Open]Balanced Cow Subsets
考虑折半搜索,每个数的系数只能是-1,0,1之中的一个,因此可以先通过$O(3^\frac{n}{2})$的搜索分别搜索出两边每个状态的和以及数字的选择情况. 然后将后一半的状态按照和排序,$O(2^ ...
- 【BZOJ】2679: [Usaco2012 Open]Balanced Cow Subsets
[算法]折半搜索+数学计数 [题意]给定n个数(n<=20),定义一种方案为选择若干个数,这些数可以分成两个和相等的集合(不同划分方式算一种),求方案数(数字不同即方案不同). [题解] 考虑直 ...
- [Usaco2012 Open]Balanced Cow Subsets
Description Farmer John's owns N cows (2 <= N <= 20), where cow i produces M(i) units of milk ...
- 【HDU - 1429】胜利大逃亡(续) (高级搜索)【状态压缩+BFS】
Ignatius再次被魔王抓走了(搞不懂他咋这么讨魔王喜欢)…… 这次魔王汲取了上次的教训,把Ignatius关在一个n*m的地牢里,并在地牢的某些地方安装了带锁的门,钥匙藏在地牢另外的某些地方.刚开 ...
- 插头DP(基于连通性状态压缩的动态规划问题)(让你从入门到绝望)
今天,我,Monkey king 又为大家带来大(ju)佬(ruo)的算法啦!--插头DP 例题(菜OJ上的网址:http://caioj.cn/problem.php?id=1489): 那么,这道 ...
随机推荐
- 安装SQL Server 2008反复提示需要安装MICROSOFT NET FRAMEWORK 3 5 SP1的一个
在安装过.net framework 4的系统中,安装sql server 2008的安装前提之一MICROSOFT .NET FRAMEWORK 3.5 SP1时,可能已经安装并重启了,还是提示安 ...
- kafka代码测试连接
1.发送: package kafka.test; import java.util.Date;import java.util.Properties;import java.util.Random; ...
- java:javaScript(定义方式,循环语句,函数与参数,事件机制,控制台记录,event事件获取键盘ascii,confirm和prompt,事件和内置对象,获取input,点击更换背景色)
1. 定义JS的两种方式: <!DOCTYPE> <html> <head> <meta charset="UTF-8"></ ...
- 【机器学习】Linear least squares, Lasso,ridge regression有何本质区别?
Linear least squares, Lasso,ridge regression有何本质区别? Linear least squares, Lasso,ridge regression有何本质 ...
- dos2unix Linux解决编写脚本出现“%0D
## Linux解决编写脚本出现“%0D”# 安装# yum install -y dos2unix# 然后进行转化一下脚本,将其中的install_mysql.sh换成你的脚本# dos2unix ...
- 定时任务crontab命令
linux 系统则是由 cron (crond) 这个系统服务来控制的.Linux 系统上面原本就有非常多的计划性工作,因此这个系统服务是默认启动的.另外, 由于用户自己也可以设置计划任务,所以,Li ...
- (4.34)sql server窗口函数
关键词:sql server窗口函数,窗口函数,分析函数 如果分析函数不可用,那么可能是版本还不支持 Window Function 包含了 4 个大类.分别是: 1 - Rank Function ...
- 【6.10校内test】 noip模拟
题目链接: p1 FBI树 p2 医院设置 p3 加分二叉树 | | | | | | 分 界 线 | | | | | | 应该算是一篇反思博. 对于OI,我真的算不上是热爱(当然不热爱不代表就不 ...
- P1142轰炸
这是uva上的一道模拟题. 首先给出n(n<=700)个点的坐标(坐标在1*10^9)之内,询问走直线可以经过的点数.一开始我想到了一个类似于桶排序的方法来存坐标,但是要注意数组大小啊!第二次想 ...
- Tarjan水题系列(5):最大半连通子图 [ZJOI2007 luogu P2272]
题目 大意: 缩点后转为求最长链的长度和最长链的个数 思路: 看懂题就会做系列 长度和个数都可以拓扑排序后DP求得 毕竟是2007年的题 代码: 如下 #include <cstdio> ...