「题解」:毛一琛/$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 ;
}
随机推荐
- Eclipse中发布Maven管理的Web项目时找不到类的问题根源和解决办法(转)
转自:http://blog.csdn.net/lvguanming/article/details/37812579?locationNum=12 写在前面的话 现在是越来越太原讨厌Eclipse这 ...
- jquery控件-实现自定义样式的弹出窗口和确认框(转)
(function () { $.MsgBox = { Alert: function (title, msg) { GenerateHtml("alert", title, ms ...
- vue 数字输入组件
index.html <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> &l ...
- 开启.NET Core 3时代,DevExpress v19.2.5带你全新启航
DevExpress Universal Subscription(又名DevExpress宇宙版或DXperience Universal Suite)是全球使用广泛的.NET用户界面控件套包,De ...
- Vue学习笔记【6】——事件修饰符
.stop 阻止冒泡(阻止事件向外层冒泡) .prevent 阻止默认事件(链接跳转.表单提交) .capture 添加事件侦听器时使用事件捕获模式(从外到里触发事件) .self 只当事件在该元素本 ...
- EXCEL设置三级下拉框
EXCEL设置三级下拉框 1.添加下拉框数据源 公式--->指定 公式--->名称管理器 2.设置第一级下拉框的值 3.第一级下拉框选出一个值 4.设置第二级下拉框(INDIRECT($A ...
- 【LeetCode 12】整数转罗马数字
题目链接 [题解] (涨知识了..原来罗马数字是这么回事.. 把{1,4,5,9,10,40,50,90,100,400,500,900,1000}这些东西的罗马数字放在一个数组里面. 每次从大到小减 ...
- js 将字符串当作js表达式执行方法
听同事说了一个需求.他有一个数据对象obj,接口会给他返回一个索引key,这个key长度不固定,根据这个key去修改obj对应的值. 举个例子: let obj={"level1" ...
- js设计模式——6.模板方法模式与职责链模式
js设计模式——6.模板方法模式与职责链模式 职责链模式
- 访问者模式和 ASM
文章目录 一. 概述 & 定义 二. 示例 2.1 创建抽象元素 2.2 创建具体元素 2.3 创建抽象访问者 2.4 创建具体访问者 2.5 访问者代码调用 三. ASM 中的访问者模式 3 ...