直接暴搜是$3^n$的,无法接受。

正解是$meet \ in \ the \ middle$,暴搜前n/2个数,每个数的状态有三种:都不选,选为A集合,选为B集合。那么我们可以维护两个集合的差。

设状态为sta,每个数选中为1(无论是A还是B集合都为1),否则为0。差为v。

将二元组(sta,v)插入Hash_map。

之后暴搜后n/2个数。同样统计出状态sta和差v。在Hash_map中查询差为v的二元组个数。同时用数组v[1<<11][1<<11]记录两个状态是否选择过去重。

#include<bits/stdc++.h>
#define LL long long
using namespace std;
bool v[1<<11][1<<11];
struct Hash_map
{
int fi[2333333],ni[2333333],siz;
LL key[2333333],val[2333333];
inline void insert(int x,int y)
{
int k=(x%2333333+2333333)%2333333,i=fi[k];
for(;i;i=ni[i])if(key[i]==x&&val[i]==y)return;
i=++siz,key[i]=x,val[i]=y,ni[i]=fi[k],fi[k]=i;
}
inline int find(int x,int y)
{
int k=(x%2333333+2333333)%2333333,res=0;
for(int i=fi[k];i;i=ni[i])
if(key[i]==x&&!v[y][val[i]])v[y][val[i]]=1,res++;
return res;
}
}f;
int n,m[21];
LL ans=0;
void dfs(int now,int en,int sta,int vv)
{
if(now==en+1)
{
if(en!=n)f.insert(vv,sta);
else ans+=f.find(vv,sta);
return;
}
dfs(now+1,en,sta<<1,vv);
dfs(now+1,en,sta<<1|1,vv+m[now]);
dfs(now+1,en,sta<<1|1,vv-m[now]);
}
signed main()
{
// freopen("in.txt","r",stdin);
// freopen("1.out","w",stdout); cin>>n;for(int i=1;i<=n;i++)cin>>m[i];
dfs(1,n/2,0,0);dfs(n/2+1,n,0,0);
printf("%lld\n",ans-1);
}

HZOJ 毛一琛的更多相关文章

  1. 「题解」:毛一琛/$cow$ $subsets$

    问题 A: 毛一琛/$cow$ $subsets$ 时间限制: 1 Sec  内存限制: 512 MB 题面 题面谢绝公开. 题解 题名貌似是个大神??看起来像是签到题然后就死了. 首先$O(3^n) ...

  2. 「10.13」毛一琛(meet in the middle)·毛二琛(DP)·毛三琛(二分+随机化???)

    A. 毛一琛 考虑到直接枚举的话时间复杂度很高,我们运用$meet\ in\ the\ middle$的思想 一般这种思想看似主要用在搜索这类算法中 发现直接枚举时间复杂度过高考虑枚举一半另一半通过其 ...

  3. [CSP-S模拟测试]:毛三琛(随机化+二分答案)

    题目传送门(内部题69) 输入格式 第一行正整数$n,P,k$.第二行$n$个自然数$a_i$.$(0\leqslant a_i<P)$. 输出格式 仅一个数表示最重的背包的质量. 样例 样例输 ...

  4. [CSP-S模拟测试]:毛二琛(DP)

    题目描述 $MYC$在$NOI2018$中,遇到了$day1T2$这样一个题,题目是让你求有多少“好”的排列.$MYC$此题没有获得高分,感到非常惭愧,于是回去专心研究排列了.如今数排列的题对$MYC ...

  5. [CSP-S模拟测试]:毛一琛(meet in the middle)

    题目描述 历史学考后,$MYC$和$ztr$对答案,发现选择题他们没有一道选的是一样的.最后他们都考了个$C$.现在问题来了,假设他们五五开,分数恰好一样(问答题分数也恰好一样,只考虑选择题).已知考 ...

  6. NOIP 模拟 $30\; \rm 毛三琛$

    题解 \(by\;zj\varphi\) 二分答案,考虑二分背包中的最大值是多少. 枚举 \(p\) 的值,在当前最优答案不优时,直接跳掉. 随机化一下 \(p\),这样复杂度会有保证. Code # ...

  7. NOIP 模拟 $30\; \rm 毛二琛$

    题解 \(by\;zj\varphi\) 原题问的就是对于一个序列,其中有的数之间有大小关系限制,问有多少种方案. 设 \(dp_{i,j}\) 表示在前 \(i\) 个数中,第 \(i\) 个的排名 ...

  8. NOIP 模拟 $30\; \rm 毛一琛$

    题解 \(by\;zj\varphi\) 如何判断一个集合可以被拆成两个相等的部分? 枚举两个集合,如果它们的和相等,那么他们的并集就是合法的,复杂度 \(\mathcal O\rm(3^n)\) \ ...

  9. ZJOI2019Day2 游记

    原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day2 游记 4-23 乘车. 报到. 自闭. 晚上没睡好. 4-24 上午张哲宇讲课. 幕后点人上去讲题. 然 ...

随机推荐

  1. @EnableAsync使用

    EnableAsync注解的意思是可以异步执行,就是开启多线程的意思.可以标注在方法.类上. 1 @Component 2 public class Task { 3 4 @Async 5 publi ...

  2. 2019-8-31-dotnet-控制台读写-Sqlite-提示-no-such-table-找不到文件

    title author date CreateTime categories dotnet 控制台读写 Sqlite 提示 no such table 找不到文件 lindexi 2019-08-3 ...

  3. Leetcode400Nth Digit第N个数字

    在无限的整数序列 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, ...中找到第 n 个数字. 注意: n 是正数且在32为整形范围内 ( n < 231). 示例 1: ...

  4. hdu1863畅通工程

    畅通工程 Time Limit: 1000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  5. processlist

    ###################### 当前会话的线程id,也就是会话id select connection_id(); ########################### select ...

  6. maven-home

    E:/Soft/Maven/apache-maven-3.3.3 E:\Soft\Maven\apache-maven-3.3.3\conf\settings.xml E:\DellWork\Mave ...

  7. [Array]628. Maximum Product of Three Numbers

    Given an integer array, find three numbers whose product is maximum and output the maximum product. ...

  8. Eclipse luna安装SVN

    Eclipse luna安装SVN 1.Subversive Plug in 的安装 打开Eclipse ,Help--->Install New Soft ----> 输入 “Luna ...

  9. node 和npm环境安装

    node 安装 1.下载node二进制文件 [root@baolin-images#>> ~]#wget https://nodejs.org/dist/v10.16.0/node-v10 ...

  10. vagrant简介

    什么是vagrant? 简单理解,就是可以通过Vagrant这个工具管理虚拟机,比如说想创建一个centos环境的虚拟机,不需要安装系统这么麻烦,通过vagrant可以快速创建 官网地址:https: ...