删数方案数(regex)
[题目描述]
给出一个正整数序列 a,长度为 n,cyb 不喜欢完美,他要删掉一些数(也可以不删,即删掉0个),但是他不会乱删,他希望删去以后,能将 a 分成 2 个集合,使得两个非空集合的数的和相同,现在他希望你能帮他算出删数的方案数。
[输入文件]
第一行 n 个正整数
以下有 n行,每行1个
正整数表示整数序列a
[输出文件]
一个整数表示答案
[输入样例]
4
1 2 3 4
[输出样例]
3
[数据范围]
30%:n<=5
100%:n<=20
100%:a 中每个元素<=100000000
题解:
对于前半部分和后半部分dfs枚举
将前半部分得到的值包括状态存进hash(去重),在把后半部分的所有状态去重在hash中查找
本来是用的三进制数表示存进子集A,存进子集B,删去3种状态,后面发现没有必要
因为是“删数的方案”,也就是除删去的数,AB集合间如何分配并不关心,所以直接二进制就行
注意hash不能只存值,还要保存二进制数以判重,保存二进制数的数组不能太小也不能大
hash的大小70000够了,状态数组zt[70000][700]正好AC,500则90分,100则75分
博客里上传了数据,在管理里的文件
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
struct Node
{
long long s;
int p;
}f[];
int n,zt[][],len,h[];
long long ans,has[],sp[],inf,a[];
bool cmp(Node a,Node b)
{
return (a.s<b.s||(a.s==b.s&&a.p<b.p));
}
void push_hash(long long x,int i)
{int j;
long long p=(x+)%;
while (has[p]!=inf&&has[p]!=x)
{
p++;
if (p>) p=;
}
if (has[p]==inf)
{
has[p]=x;
sp[p]=;
zt[p][sp[p]]=i;
}
else if (has[p]==x)
{
for (j=;j<=sp[p];j++)
if (i==zt[p][j]) return;
sp[p]++;
zt[p][sp[p]]=i;
}
}
void ask_hash(long long x,int i)
{int j;
long long p=(x+)%;
while (has[p]!=inf&&has[p]!=x)
{
p++;
if (p>) p=;
}
if (has[p]==x)
{
for (j=;j<=sp[p];j++)
h[zt[p][j]|i]=;
}
}
void dfs1(int x,long long s,int p)
{int i;
if (x>n/) push_hash(s,p);
else
for (i=-;i<=;i++)
dfs1(x+,s+i*a[x],p|((i!=)<<(x-)));
}
void dfs2(int x,long long s,int p)
{int i;
if (x>n) f[++len]=(Node){s,p};
else
for (i=-;i<=;i++)
dfs2(x+,s+i*a[x],p|((i!=)<<(x-)));
}
int main()
{int i,j;
long long s;
freopen("regex.in","r",stdin);
freopen("regex.out","w",stdout);
cin>>n;
memset(has,-,sizeof(has));
inf=has[];
for (i=;i<=n;i++)
scanf("%lld",&a[i]);
dfs1(,,);dfs2(n/+,,);
sort(f+,f+len+,cmp);
for (i=;i<len;i++)
if (f[i].s==f[i+].s&&f[i].p==f[i+].p) f[i].s=(<<);
sort(f+,f+len+,cmp);
while (f[len].s==(<<)) len--;
for (i=;i<=len;i++)
ask_hash(-f[i].s,f[i].p);
for (i=;i<=(<<n)-;i++) ans+=h[i];
//cout<<h[i]<<endl;
cout<<ans;
}
删数方案数(regex)的更多相关文章
- 洛谷P1108 低价购买[DP | LIS方案数]
题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...
- Codeforces 461B. Appleman and Tree[树形DP 方案数]
B. Appleman and Tree time limit per test 2 seconds memory limit per test 256 megabytes input standar ...
- NOIP2012pj摆花[DP 多重背包方案数]
题目描述 小明的花店新开张,为了吸引顾客,他想在花店的门口摆上一排花,共m盆.通过调查顾客的喜好,小明列出了顾客最喜欢的n种花,从1到n标号.为了在门口展出更多种花,规定第i种花不能超过ai盆,摆花时 ...
- UVa 11137 (完全背包方案数) Ingenuous Cubrency
题意:用13.23……k3这些数加起来组成n,输出总方案数 d(i, j)表示前i个数构成j的方案数则有 d(i, j) = d(i-1, j) + d(i, j - i3) 可以像01背包那样用滚动 ...
- poj2975 Nim 胜利的方案数
Nim Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 5545 Accepted: 2597 Description N ...
- ☆ [HDU2157] How many ways?? 「矩阵乘法求路径方案数」
传送门:>Here< 题意:给出一张有向图,问从点A到点B恰好经过k个点(包括终点)的路径方案数 解题思路 一道矩阵乘法的好题!妙哉~ 话说把矩阵乘法放在图上好神奇,那么跟矩阵唯一有关的就 ...
- P2347 砝码称重-DP方案数-bitset
P2347 砝码称重 DP做法 : 转化为 01背包. 进行方案数 更新.最后统计种类. #include<bits/stdc++.h> using namespace std; #def ...
- [HAOI2017]方案数[组合计数、容斥、dp]
题意 题目链接 分析 先考虑没有障碍怎么做,定义 f(i,j,k) 每一维走了 i,j,k 位的方案数,转移乘个组合数即可. 现在多了一些障碍,考虑容斥.实际我们走过的点都有严格的大小关系,所以先把所 ...
- hdu 2157 从a点走到b点刚好k步的方案数是多少 (矩阵快速幂)
n个点 m条路 询问T次 从a点走到b点刚好k步的方案数是多少 给定一个有向图,问从A点恰好走k步(允许重复经过边)到达B点的方案数mod p的值把 给定的图转为邻接矩阵,即A(i,j)=1当且仅当存 ...
随机推荐
- alpha-咸鱼冲刺day6
一,合照 emmmmm.自然还是没有的. 二,项目燃尽图 三,项目进展 !!!QAQ可以做到跟数据库交互了!!!!先来撒花花!(然后继续甲板) (然后就没有进展了.翻车+1s) 四,问题困难 数据库交 ...
- Beta版本敏捷冲刺每日报告——Day3
1.情况简述 Beta阶段第三次Scrum Meeting 敏捷开发起止时间 2017.11.4 08:00 -- 2017.11.4 22:00 讨论时间地点 2017.11.4晚9:00,软工所实 ...
- 第201621123043 《Java程序设计》第14周学习总结
1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结与数据库相关内容. 2. 使用数据库技术改造你的系统 2.1 简述如何使用数据库技术改造你的系统.要建立什么表?截图你的表设计. 2 ...
- 201621123068 Week02-Java基本语法与类库
1. 本周学习总结 1.1 当浮点数和整数放到一起运算时,java一般会将整数转化为浮点数然后进行浮点数计算,但是这样得出的结果通常与数学运算有一定误差,浮点数精确计算需要使用BigDecimal类 ...
- 用greenlet实现Python中的并发
from greenlet import greenlet def test1(): print 12 gr2.switch() print 34 def test2(): print 56 gr1. ...
- PHP之this和self
self在对象中自己调用自己使用 $this在实例化后使用$this方法 在访问PHP类中的成员变量或方法时,如果被引用的变量或者方法被声明成const(定义常量)或者static(声明静态),那么就 ...
- 用Java语言实现简单的词法分析器
编译原理中的词法分析算是很重要的一个部分,原理比较简单,不过网上大部分都是用C语言或者C++来编写,笔者近期在学习Java,故用Java语言实现了简单的词法分析器. 要分析的代码段如下: 输出结果如下 ...
- java 实现多文件打包下载
jsp页面js代码: function downloadAttached(){ var id = []; id.push(infoid); var options = {}; options.acti ...
- spring-oauth-server实践:授权方式四:client_credentials 模式下access_token的产生
授权结果 获取access_token成功, 访问资源服务器API http://localhost:9000/api-gateway-engine/unity/user_info?access_to ...
- VS2013 堆栈溢出调查(0xC00000FD: Stack overflow)
在调试一个代码时,执行过程中会出现如下错误(0xC00000FD: Stack overflow). 很明显是堆栈溢出了. 网上很多方法,都是通过修改设置工程配置,把堆栈调大一些,如下图. 但是堆栈到 ...