HZOJ 毛一琛
直接暴搜是$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 毛一琛的更多相关文章
- 「题解」:毛一琛/$cow$ $subsets$
问题 A: 毛一琛/$cow$ $subsets$ 时间限制: 1 Sec 内存限制: 512 MB 题面 题面谢绝公开. 题解 题名貌似是个大神??看起来像是签到题然后就死了. 首先$O(3^n) ...
- 「10.13」毛一琛(meet in the middle)·毛二琛(DP)·毛三琛(二分+随机化???)
A. 毛一琛 考虑到直接枚举的话时间复杂度很高,我们运用$meet\ in\ the\ middle$的思想 一般这种思想看似主要用在搜索这类算法中 发现直接枚举时间复杂度过高考虑枚举一半另一半通过其 ...
- [CSP-S模拟测试]:毛三琛(随机化+二分答案)
题目传送门(内部题69) 输入格式 第一行正整数$n,P,k$.第二行$n$个自然数$a_i$.$(0\leqslant a_i<P)$. 输出格式 仅一个数表示最重的背包的质量. 样例 样例输 ...
- [CSP-S模拟测试]:毛二琛(DP)
题目描述 $MYC$在$NOI2018$中,遇到了$day1T2$这样一个题,题目是让你求有多少“好”的排列.$MYC$此题没有获得高分,感到非常惭愧,于是回去专心研究排列了.如今数排列的题对$MYC ...
- [CSP-S模拟测试]:毛一琛(meet in the middle)
题目描述 历史学考后,$MYC$和$ztr$对答案,发现选择题他们没有一道选的是一样的.最后他们都考了个$C$.现在问题来了,假设他们五五开,分数恰好一样(问答题分数也恰好一样,只考虑选择题).已知考 ...
- NOIP 模拟 $30\; \rm 毛三琛$
题解 \(by\;zj\varphi\) 二分答案,考虑二分背包中的最大值是多少. 枚举 \(p\) 的值,在当前最优答案不优时,直接跳掉. 随机化一下 \(p\),这样复杂度会有保证. Code # ...
- NOIP 模拟 $30\; \rm 毛二琛$
题解 \(by\;zj\varphi\) 原题问的就是对于一个序列,其中有的数之间有大小关系限制,问有多少种方案. 设 \(dp_{i,j}\) 表示在前 \(i\) 个数中,第 \(i\) 个的排名 ...
- NOIP 模拟 $30\; \rm 毛一琛$
题解 \(by\;zj\varphi\) 如何判断一个集合可以被拆成两个相等的部分? 枚举两个集合,如果它们的和相等,那么他们的并集就是合法的,复杂度 \(\mathcal O\rm(3^n)\) \ ...
- ZJOI2019Day2 游记
原文链接www.cnblogs.com/zhouzhendong/p/ZJOI2019Day2 游记 4-23 乘车. 报到. 自闭. 晚上没睡好. 4-24 上午张哲宇讲课. 幕后点人上去讲题. 然 ...
随机推荐
- grep与find命令的区别
grep与find命令的区别:grep搜索的是文本,find搜索的是文件,换句话说就是grep是查找匹配条件的行,find是搜索匹配条件的文件. grep文本搜索/过滤 用法:grep[参数]搜索字符 ...
- 简单linux查询
1查看日志异常 tailf nohup.out|grep ERROR -A 3 --color tailf nohup.out|grep ERROR|grep chunk -A 3 -B 3 -- ...
- Linux 文本处理三剑客之grep
文本处理都要使用正则表达式,正则表达式有: 基本正则表达式:grep或者egrep -G 扩展正则表达式:egreo或者grep -E Linux 文本处理三剑客: sed:stream editor ...
- Python科学计算生态圈--Pandas
- Leetcode661.Image Smoother图片平滑器
包含整数的二维矩阵 M 表示一个图片的灰度.你需要设计一个平滑器来让每一个单元的灰度成为平均灰度 (向下舍入) ,平均灰度的计算是周围的8个单元和它本身的值求平均,如果周围的单元格不足八个,则尽可能多 ...
- 初探iview
我的js功力还是TCL,太差了~ 运行iview官网例子还有它的工程文件都运行不出来.我非常感谢那些无私开源的博主,它们无私分享自己的技术,让我学到了很多东西. iview是vue的一个UI框架之一, ...
- javascript之键盘事件的方法
键盘事件包含onkeydown.onkeypress和onkeyup这三个事件 事件初始化 function keyDown(){} document.onkeydown = keyDown; //论 ...
- PHP获取真实客户端的真实IP的方法
REMOTE_ADDR 是你的客户端跟你的服务器“握手”时候的IP.如果使用了“匿名代理”,REMOTE_ADDR将显示代理服务器的IP. HTTP_CLIENT_IP 是代理服务器发送的HTTP头. ...
- 2019阿里云开年Hi购季基础云产品分会场全攻略!
2019阿里云云上Hi购季活动已经于2月25日正式开启,从已开放的活动页面来看,活动分为三个阶段: 2月25日-3月04日的活动报名阶段.3月04日-3月16日的新购满返+5折抢购阶段.3月16日-3 ...
- Phpstrom 配置php版本语法支持