折半搜索+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): 那么,这道 ...
随机推荐
- VASP表面计算步骤小结
原文链接:http://blog.sciencenet.cn/blog-478347-374981.html 一.概述 vasp用“slab” 模型来模拟表面体系结构. vasp计算表面的大 ...
- Kettle使用教程之数据同步
数据模型原型如下: 1.表输入,针对最新的数据输入的表 2.目标表,需要更新的表 3.两个表都需要进行排序操作 4.合并,根据id进行合并 5.数据同步(包括更新.插入.删除) 6.点击运行,就可以实 ...
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_6 spring中bean的细节之三种创建Bean对象的方式
目前这里能调用是因为,在service的实现类里面,new了一个dao的对象 正常情况下 这里不应该是new一个对象,应该等于null或为空 设置为空侯再运行就会报错 出错的原因是这里为null 需要 ...
- 如何将txt文件转换为带章节目录的mobi文件
txt文件基本没什么排版可言.所以想要把txt转换为mobi文件方便阅读. 具体步骤如下: 打开txt 用notepad++打开所需要转换的txt文件.(或者使用其他的能够支持正则表达式的编辑器). ...
- tomcat gc和内存
tomcat启动参数,将JVM GC信息写入tomcat_gc.log CATALINA_OPTS='-Xms512m -Xmx4096m -XX:PermSize=64M -XX:MaxNewSiz ...
- 通过wscript运行的JS脚本,如何引入另一个JS文件
链接: https://helloacm.com/include-external-files-in-vbscriptjscript-wsh/ 代码示例: function Include(jsFil ...
- hibernate 事务处理
Hibernate的事务处理:事务:* 事务就是逻辑上的一组操作,要么全都成功,要么全都失败!!! 事务特性:* 原子性:事务一组操作不可分割.* 一致性:事务的执行前后,数据完整性要保持一致.* 隔 ...
- 关于struts2防止表单重复提交
struts2防表单重复提交有两种方式. 其一是action的重定向,跳转时设置type为从一个action跳转到另一个action或者另一个页面, 使用户提交后,所停留的位置,不是当前处理数据的Ac ...
- 简述前后端项目RSA+AES加解密
一.登录机制 在项目中,我们可以大致得出一个登录的过程,主要分为 登录验证.登录保持.退出三个部分.登录验证是指客户端提供用户名和密码,向服务器提出登录请求,服务器判断客户端是否可以登录并向客户端确 ...
- A9-USART2_RX_BUF 串口2收发异常
a9_send_cmd(); //退出透传模式,和前一次发送时间超过 2 秒,输入+++,就可以退出透传模式 delay_ms(); delay_ms(); delay_ms(); a9_quit_t ...