BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针
BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针
Description
给出N(1≤N≤20)个数M(i) (1 <= M(i) <= 100,000,000),在其中选若干个数,如果这几个数可以分成两个和相等的集合,那么方案数加1。问总方案数。
Input
Output
Sample Input
INPUT DETAILS: There are 4 cows, with milk outputs 1, 2, 3, and 4.
Sample Output
3
首先每个数的系数只可能是0,1,-1,并且1和-1都是选的状态。
用meet in middle的思想,$3^{n/2}$枚举左边和右边,把左边选或不选的状态与和挂链,右边按和排序。
枚举左边的状态,再枚举右边的和,枚举过程中左边指针单调。
然后统计答案即可。
复杂度$O(6^{n/2})$。
代码:
// luogu-judger-enable-o2
#include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std;
#define mr(x,y) make_pair(x,y)
#define N 100050
#define RR register
#define O2 __attribute__((optimize("-O2")))
typedef long long ll;
int n,a[25],m;
int ans;
int head[N],to[N],nxt[N],cnt,tot,t[N],vis[1<<22];
O2 struct A {
int v,S;
bool operator < (const A &x) const {
return v<x.v;
}
}b[N];
O2 inline void add(int u,int v) {
to[++cnt]=v; nxt[cnt]=head[u]; head[u]=cnt;
}
O2 void dfs(int dep,int sum,int sta) {
if(dep==m+1) {
add(sta,sum); return ;
}
dfs(dep+1,sum,sta);
dfs(dep+1,sum+a[dep],sta|(1<<(dep-1)));
dfs(dep+1,sum-a[dep],sta|(1<<(dep-1)));
}
O2 void solve(int dep,int sum,int sta) {
if(dep==n+1) {
b[++tot].v=sum; b[tot].S=sta;
return ;
}
solve(dep+1,sum,sta);
solve(dep+1,sum+a[dep],sta|(1<<(dep-1)));
solve(dep+1,sum-a[dep],sta|(1<<(dep-1)));
}
O2 int main() {
scanf("%d",&n);
m=n/2;
RR int i,j;
for(i=1;i<=n;i++) scanf("%d",&a[i]);
dfs(1,0,0);
solve(m+1,0,0);
sort(b+1,b+tot+1);
for(i=0;i<(1<<m);i++) {
t[0]=0;
for(j=head[i];j;j=nxt[j]) {
t[++t[0]]=to[j];
}
sort(t+1,t+t[0]+1);
RR int l=1,r=1;
/*for(l=1;l<=t[0];l++) {
while(r<=tot&&b[r].v<t[l]) r++;
if(r==tot+1) break;
if(b[r].v==t[l]) {
vis[i|(b[r].S)]++;
//if(vis[i|b[r].S]==1) ans++;
}
}*/
for(l=1;l<=tot;l++) {
while(r<=t[0]&&t[r]<b[l].v) r++;
if(r==t[0]+1) break;
if(t[r]==b[l].v) {
vis[i|(b[l].S)]++;
if(vis[i|(b[l].S)]==1) ans++;
}
}
}
printf("%d\n",ans-1);
}
BZOJ_2679_[Usaco2012 Open]Balanced Cow Subsets _meet in middle+双指针的更多相关文章
- 【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 ...
- 折半搜索+Hash表+状态压缩 | [Usaco2012 Open]Balanced Cow Subsets | BZOJ 2679 | Luogu SP11469
题面:SP11469 SUBSET - Balanced Cow Subsets 题解: 对于任意一个数,它要么属于集合A,要么属于集合B,要么不选它.对应以上三种情况设置三个系数1.-1.0,于是将 ...
- [Usaco2012 Open]Balanced Cow Subsets
Description Farmer John's owns N cows (2 <= N <= 20), where cow i produces M(i) units of milk ...
- BZOJ2679 : [Usaco2012 Open]Balanced Cow Subsets
考虑折半搜索,每个数的系数只能是-1,0,1之中的一个,因此可以先通过$O(3^\frac{n}{2})$的搜索分别搜索出两边每个状态的和以及数字的选择情况. 然后将后一半的状态按照和排序,$O(2^ ...
- bzoj2679:[Usaco2012 Open]Balanced Cow Subsets
思路:折半搜索,每个数的状态只有三种:不选.选入集合A.选入集合B,然后就暴搜出其中一半,插入hash表,然后再暴搜另一半,在hash表里查找就好了. #include<iostream> ...
- 【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 这个数据范围都能想到是折半搜索. 但具体怎么搜呢? 还得扣着方程模型来想:我们把题中的两个相等的集合分别叫做左边和右边,令序列前一半中放到左边的数 ...
随机推荐
- Spring Cloud入门教程-Ribbon实现客户端负载均衡
简介 我们继续以之前博客的代码为基础,增加Ribbon组件来提供客户端负载均衡.负载均衡是实现高并发.高性能.可伸缩服务的重要组成部分,它可以把请求分散到一个集群中不同的服务器中,以减轻每个服务器的负 ...
- 《C++标准程序库》学习笔记(一)C++相关特性
抱着本厚厚的<C++标准库>读了几天,想想也该写点关于用法的总结,一来怕今后容易忘记,二来将书上的事例重新敲一遍,巩固对程序库相关知识的了解.今天开第一篇,以后不固定更新.当然,笔者所读为 ...
- LINQ、Lambda与委托
首先定义个Person类: public class Person { public string Name{get;set;} //姓名 public int Age{get;set;} //年龄 ...
- MySQL/MariaDB中的事务和事务隔离级别
本文目录:1.事务特性2.事务分类 2.1 扁平事务 2.2 带保存点的扁平事务 2.3 链式事务 2.4 嵌套事务 2.5 分布式事务3.事务控制语句4.显式事务的次数统计5.一致性非锁定读(快照查 ...
- 在Windows上安装FFmpeg程序的方法(you-get下载视频必备程序)
FFmpeg是一套可以用来记录.转换数字音频.视频,并能将其转化为流的开源计算机程序.它提供了录制.转换以及流化音视频的完整解决方案.它包含了非常先进的音频/视频编解码库libavcodec. 该程序 ...
- 12.Django思维导图
- Scrapy爬虫框架补充内容三(代理及其基本原理介绍)
前言:(本文参考维基百科及百度百科所写) 当我们使用爬虫抓取数据时,有时会产生错误比如:突然跳出来了403 Forbidden 或者网页上出现以下提示:您的ip访问频率太高 或者时不时跳出一个验证码需 ...
- PAT1127:ZigZagging on a Tree
1127. ZigZagging on a Tree (30) 时间限制 400 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue ...
- Oracle-02:SQL语言的分类或者说SQL语言的组成
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 小结一版: 01.DDL(Data Definition Language)数据定义语言. 用来创建数据库中 ...
- AndroidEclipse里的视图里想添加SDK Manager但是找不到怎么办?
有时候,我们想配置SDK Manager,但是发现找不到这个窗口,怎么办呢,网上有解释(上截图): —————————————————————————————————————————————————— ...