删数方案数(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当且仅当存 ...
随机推荐
- python 归并排序
def merge_sort(alist): if len(alist) <= 1: return alist # 二分分解 num = len(alist)/2 left = merge_so ...
- 大数据技术Hadoop笔试题
Hadoop有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上.以下是由应届毕业生网小编J.L为您整理推荐的面试笔试题目和经验,欢迎参考阅读. 单项选择题 1. 下面哪个程序负责 H ...
- 【iOS】swift-文字宽度的计算
如图所示,需要sectionView的标题宽度可以动态变化 举例说明: 只需在tableView的代理方法 func tableView(tableView: UITableView, viewFor ...
- AngularJS1.X学习笔记7-过滤器
最近参加笔试被虐成狗了,感觉自己的算法太弱了.但是还是先花点事件将这个AngularJS学习完.今天学习filter 一.内置过滤器 (1)过滤单个数据值 <!DOCTYPE html> ...
- 帧动画的创建方式 - xml方式
废话不多说,先看东西 创建帧动画1 - xml方式 帧动画的创建方式主要以下2种: * 用xml创建动画: * 用代码创建动画: 本文内容主要关注 xml文件 创建帧动画的方式 xml文件 ...
- Oracle12c在Win10上的安装配置实践
1.环境 操作系统:Win10专业版(64位) 数据库:Oracle 12c Release 2(Version 12.2.0.1.0,64位) 2.下载Oracle12c oracle官网下载地址: ...
- vue组件详解(五)——组件高级用法
一.递归组件 组件在它的模板内可以递归地调用自己, 只要给组件设置name 的选项就可以了. 示例如下: <div id="app19"> <my-compone ...
- List里边存放Object对象获取方式
if (tableListt != null && tableListt.size() > 0) { for (int i = 0; i < tableListt.size ...
- highchart
highchart 1 2 #下载 https://www.highcharts.com/download a. 简单例子 <!DOCTYPE html> <html lang=&q ...
- 【vuejs深入一】深入学习vue指令,自定义指令解决开发痛点
写在前面 一个好的架构需要经过血与火的历练,一个好的工程师需要经过无数项目的摧残. 最近博主我沉淀了几个月,或者说懒了几个月.然而大佬的指点总是一针见血,能够让人看到方向.所以我现在有觉得,一个好的 ...