BZOJ2679 : [Usaco2012 Open]Balanced Cow Subsets
考虑折半搜索,每个数的系数只能是-1,0,1之中的一个,因此可以先通过$O(3^\frac{n}{2})$的搜索分别搜索出两边每个状态的和以及数字的选择情况。
然后将后一半的状态按照和排序,$O(2^\frac{n}{2})$枚举前一半的每一个选择情况的状态,将该选择情况下所有状态按和排序,然后通过双指针求出所有合法状态。
时间复杂度$O(6^\frac{n}{2})$。
#include<cstdio>
#include<algorithm>
const int N=20,M=1<<10,E=59100;
int n,n0,i,j,k,a[N],g[M],v[E],nxt[E],ed,m,q[M],ce,ans;bool vis[1<<N];
struct P{int s,S;}e[E];
inline bool cmp(const P&a,const P&b){return a.s<b.s;}
void dfsl(int x,int s,int S){
if(x==n0){v[++ed]=s;nxt[ed]=g[S];g[S]=ed;return;}
dfsl(x+1,s,S);
dfsl(x+1,s+a[x],S|(1<<x));
dfsl(x+1,s-a[x],S|(1<<x));
}
void dfsr(int x,int s,int S){
if(x==n){e[ce].s=s;e[ce++].S=S;return;}
dfsr(x+1,s,S);
dfsr(x+1,s+a[x],S|(1<<x));
dfsr(x+1,s-a[x],S|(1<<x));
}
int main(){
scanf("%d",&n);n0=(n+1)/2;
for(i=0;i<n;i++)scanf("%d",&a[i]);
dfsl(0,0,0),dfsr(n0,0,0);
std::sort(e,e+ce,cmp);
for(i=0;i<1<<n0;i++){
for(m=0,j=g[i];j;j=nxt[j])q[m++]=v[j];
std::sort(q,q+m);
for(j=k=0;j<ce;j++){
while(k<m&&q[k]<e[j].s)k++;
if(k==m)break;
if(q[k]==e[j].s)vis[i|e[j].S]=1;
}
}
for(i=1;i<1<<n;i++)if(vis[i])ans++;
return printf("%d",ans),0;
}
BZOJ2679 : [Usaco2012 Open]Balanced Cow Subsets的更多相关文章
- 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 ...
- 【BZOJ 2679】[Usaco2012 Open]Balanced Cow Subsets(折半搜索+双指针)
[Usaco2012 Open]Balanced Cow Subsets 题目描述 给出\(N(1≤N≤20)\)个数\(M(i) (1 <= M(i) <= 100,000,000)\) ...
- 折半搜索+Hash表+状态压缩 | [Usaco2012 Open]Balanced Cow Subsets | BZOJ 2679 | Luogu SP11469
题面:SP11469 SUBSET - Balanced Cow Subsets 题解: 对于任意一个数,它要么属于集合A,要么属于集合B,要么不选它.对应以上三种情况设置三个系数1.-1.0,于是将 ...
- bzoj2679:[Usaco2012 Open]Balanced Cow Subsets
思路:折半搜索,每个数的状态只有三种:不选.选入集合A.选入集合B,然后就暴搜出其中一半,插入hash表,然后再暴搜另一半,在hash表里查找就好了. #include<iostream> ...
- [Usaco2012 Open]Balanced Cow Subsets
Description Farmer John's owns N cows (2 <= N <= 20), where cow i produces M(i) units of milk ...
- 【BZOJ】2679: [Usaco2012 Open]Balanced Cow Subsets
[算法]折半搜索+数学计数 [题意]给定n个数(n<=20),定义一种方案为选择若干个数,这些数可以分成两个和相等的集合(不同划分方式算一种),求方案数(数字不同即方案不同). [题解] 考虑直 ...
- BZOJ.2679.Balanced Cow Subsets(meet in the middle)
BZOJ 洛谷 \(Description\) 给定\(n\)个数\(A_i\).求它有多少个子集,满足能被划分为两个和相等的集合. \(n\leq 20,1\leq A_i\leq10^8\). \ ...
- SPOJ-SUBSET Balanced Cow Subsets
嘟嘟嘟spoj 嘟嘟嘟vjudge 嘟嘟嘟luogu 这个数据范围都能想到是折半搜索. 但具体怎么搜呢? 还得扣着方程模型来想:我们把题中的两个相等的集合分别叫做左边和右边,令序列前一半中放到左边的数 ...
随机推荐
- iOS获取状态栏和导航栏尺寸(宽度和高度)
iPhone开发当中,有时需要获取状态栏和导航栏高度.宽度信息,方便布局其他控件.下面介绍一下如何获取这些信息: // 状态栏(statusbar) CGRect rectStatus = [[UIA ...
- 三、jQuery--Ajax基础--Ajax全接触--扩展知识(跨域)
- gitlab 建仓的流程
repository:仓库 Git global setup: git config --global user.name "Administrator" git config - ...
- SQL分组和聚合(Grouping and Aggregates)
这章应该是难点,也是成为SQL高手的必经之路. 注意有GROUP 语句时,WHERE和HAVING的场合. 前者用于检索前的条件过滤 . 后者用于检索出来结果之后的条件过滤. ========== ; ...
- 理解JavaScript中的事件处理
什么是事件? 事件(Event)是JavaScript应用跳动的心脏 ,也是把所有东西粘在一起的胶水.当我们与浏览器中 Web 页面进行某些类型的交互时,事件就发生了.事件可能是用户在某些内容上的点击 ...
- 攻城狮在路上(叁)Linux(十九)--- 磁盘分区
磁盘分区使用fdisk命令,该命令仅root有使用权限. 磁盘分区的一般步骤: 1.首先用df命令查看设备名 df -h; 2.fdisk /dev/sda; <== 按m显示help d:删除 ...
- windows下Tomcat配置多实例
详情参见tomcat安装目录下RUNNING.txt中Advanced Configuration - Multiple Tomcat Instances部分. 问题源于下面这段tomcat官方文档的 ...
- Linux环境下使用perl编写CGI(httpd)
例子1: /var/www/cgi-bin/hello.cgi #!/usr/bin/perl print "Content-type: text/html\n\n"; print ...
- phpcms-v9系统搭建wap网站及单页面
如需要绑定域名为wap.domain.com,作下如操作: 一.把wap.domain.com域名绑定到你的这个网站主机上. 二.在网站后台——模块——手机门户域名里面填写“http://wap.do ...
- JDK 1.5 1.6 override区别
今天在更新时发现有个别项目报错,报错信息 到网上搜索了之后,根据网上描述,修改了一批配置都不行: http://bestchenwu.iteye.com/blog/997420(这个里面的方法二,即为 ...