「题解」:毛一琛/$cow$ $subsets$
问题 A: 毛一琛/$cow$ $subsets$
时间限制: 1 Sec 内存限制: 512 MB
题面
题面谢绝公开。
题解
题名貌似是个大神??看起来像是签到题然后就死了。
首先$O(3^n)$算法显然。也显然过不去$20$的测试点。
正解是赫赫有名的$meet$ $in$ $the$ $middle$算法。数据在40以内的都能用$meet$ $in$ $the$ $middle$??
对于两半路径,可以拼起来并且构成合法答案的条件是两人获得的分数相同。
所以一个比较聪明的办法是,不去记录两个人各自得到了多少分,而是记录两个人得分的差。
至于谁减谁无所谓,相同的话把其中一个翻转就好了。不搞相反也可以避免重复。
于是我们开一个$map$,对于每一个在前一半路径得到的差值映射一个编号。并以之为下标存储前一半扫过的状态,方便拼接。
对于后一半路径扫过的差值,在$map$里查询,有就拼上,状态置1。
代码:
#include<bits/stdc++.h>
#define rint register int
using namespace std;
int n,a[],tot,ans;
bool vis[(<<)+];
map <int,int> m;
vector <int> v[];
inline void dfs1(rint k,rint res,rint con)
{
if(k==n/+)
{
if(m.find(res)==m.end())m[res]=++tot;
int lin=m[res];v[lin].push_back(con);
return ;
}
dfs1(k+,res,con);
dfs1(k+,res+a[k],con|(<<k-));
dfs1(k+,res-a[k],con|(<<k-));
return ;
}
inline void dfs2(rint k,rint res,rint con)
{
if(k==n+)
{
if(m.find(res)!=m.end())
{
int lin=m[res];
for(rint i=;i<v[lin].size();++i)
vis[v[lin][i]|con]=;
}
return ;
}
dfs2(k+,res,con);
dfs2(k+,res-a[k],con|(<<k-));
dfs2(k+,res+a[k],con|(<<k-));
return ;
}
int main()
{
scanf("%d",&n);
for(rint i=;i<=n;++i)scanf("%d",&a[i]);
dfs1(,,);dfs2(n/+,,);
for(rint i=;i<=(<<n)-;++i)ans+=vis[i];
printf("%d\n",ans);
return ;
}
随机推荐
- Android Studio奇淫巧技
目录 3.1 Android Studio使用初探 Project面板 Stucture面板 Android Monitor Keymap Tip of the Day 快速查找 Search Act ...
- springMVC配置文件 的约束
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- WPF ListBox 横向排列
WPF ListBox 横向排列 如果只是单纯的让ListBox可以横向配列,这样很简单,只需要更改ListBox的ItemsPanel模板就可以,例如: <ListBox><L ...
- vscode开发vue项目保存时自动执行lint进行修复
vscode下载eslint插件 vscode进行设置 找到settings.json 在里面写入如下内容进行保存 { "eslint.autoFixOnSave": tr ...
- bzoj1046题解
[解题思路] 先倒着求一遍LIS,然后对于每个询问L从左到右找到第一个大于等于L的上升序列即可.复杂度O(N(log2N+M)). [参考代码] #pragma GCC optimize(2) #in ...
- PHP反序列化漏洞研究
序列化 序列化说通俗点就是把一个对象变成可以传输的字符串 php serialize()函数 用于序列化对象或数组,并返回一个字符串.序列化对象后,可以很方便的将它传递给其他需要它的地方,且其类型和结 ...
- Java异常关闭资源的两种方式
try-catch-finally 常用,在异常关闭时应判断流是否为空 public class CloseableUtils { public static void closeable(Close ...
- Linux两台机器简历信任
cd ~/.ssh ssh-keygen -t rsa scp ./id_rsa.pub root@192.168.1.1:/root/.ssh/authorized_keys
- 在Linux下安装PyEmu
git clone https://github.com/OpenRCE/pydbg.git git clone https://github.com/OpenRCE/paimei.git libda ...
- 调用API接口,查询手机号码归属地(3)
从mysql数据库获取电话号码,查询归属地并插入到数据库 #!/usr/bin/python # -*- coding: utf-8 -*- import json, urllib, sys, pym ...