洛谷3067 BZOJ 2679题解(折半搜索)
看到n小于20,就可以想到搜索
所有的数要么在集合a中,要么在集合b中,要么都不在
可是3^n复杂度会炸,我们考虑优化
可以利用折半搜索,将前面一半的所有可能情况与后一半列举
排序扫描统计答案
由于选择情况可能会重复,我们还要记录一下状态,然后在统计时判断一下
统计时会将一个都不选的情况计算进去,所以ans要-1
- # include<iostream>
- # include<cstdio>
- # include<cmath>
- # include<algorithm>
- # include<cstring>
- using std::sort;
- const int mn = ;
- int a[mn];
- int n;
- struct node{int val,cur;};
- node L[<<mn],R[<<mn];
- int vis[<<mn];
- int LeftCnt,RightCnt;
- void dfs(int x,int en,int nowval,int nowstate)
- {
- if(x>en)
- {
- if(en==n/) L[++LeftCnt].val=nowval,L[LeftCnt].cur=nowstate;
- else R[++RightCnt].val=nowval,R[RightCnt].cur=nowstate;
- return ;
- }
- dfs(x+,en,nowval,nowstate);
- dfs(x+,en,nowval-a[x],nowstate+(<<(x-)));
- dfs(x+,en,nowval+a[x],nowstate+(<<(x-)));
- }
- bool cmp1(node x,node y){return x.val<y.val;}
- bool cmp2(node x,node y){return x.val>y.val;}
- int main()
- {
- scanf("%d",&n);
- for(int i=;i<=n;i++)
- scanf("%d",&a[i]);
- dfs(,n/,,);
- dfs(n/+,n,,);
- sort(L+,L++LeftCnt,cmp1);
- sort(R+,R++RightCnt,cmp2);
- int l=,r=,ans=;
- while(l<=LeftCnt && r<=RightCnt)
- {
- while(L[l].val+R[r].val> && r<=RightCnt) r++;
- int pre=r;
- while(L[l].val+R[r].val== && r<=RightCnt)
- {
- if(vis[L[l].cur | R[r].cur]==)
- vis[L[l].cur | R[r].cur]=,ans++;
- r++;
- }
- if(L[l].val==L[l+].val) r=pre;
- l++;
- }
- printf("%d",ans-);
- return ;
- }
洛谷3067 BZOJ 2679题解(折半搜索)的更多相关文章
- 洛谷P1036 选数 题解 简单搜索/简单状态压缩枚举
题目链接:https://www.luogu.com.cn/problem/P1036 题目描述 已知 \(n\) 个整数 \(x_1,x_2,-,x_n\) ,以及 \(1\) 个整数 \(k(k& ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷P1378 油滴扩展(搜索)
洛谷P1378 油滴扩展 直接暴力搜索更新答案就可以了. 时间复杂度为 \(O(n!)\) . #include<stdio.h> #include<stdlib.h> #in ...
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- [BZOJ 3039&洛谷P4147]玉蟾宫 题解(单调栈)
[BZOJ 3039&洛谷P4147]玉蟾宫 Description 有一天,小猫rainbow和freda来到了湘西张家界的天门山玉蟾宫,玉蟾宫宫主蓝兔盛情地款待了它们,并赐予它们一片土地. ...
随机推荐
- Python numpy.transpose 详解
前言 看Python代码时,碰见 numpy.transpose 用于高维数组时挺让人费解,通过一番画图分析和代码验证,发现 transpose 用法还是很简单的. 正文 Numpy 文档 numpy ...
- T2483 电梯(模拟题)
https://www.luogu.org/problem/show?pid=T2483 题目背景 开启了升降梯的动力之后,探险队员们进入了升降梯运行的那条竖直的隧道,映入眼帘的是一条直通塔顶的轨道. ...
- 用Python的requests库作接口测试——上传文件
POST一个多部分编码(Multipart-Encoded)的文件 Requests使得上传多部分编码文件变得很简单: >>> url = 'http://httpbin.org/p ...
- JAVA面试常见问题之开源框架和容器篇
1.Servlet的生命周期 加载:加载到虚拟机 初始化:init() 一个生命周期中只会被调用一次. 服务:service() 销毁:destroy() 2.转发与重定向的区别 转发在服务器端完成的 ...
- LintCode_50 数组剔除元素后的乘积
题目 给定一个整数数组A. 定义B[i] = A[0] * ... * A[i-1] * A[i+1] * ... * A[n-1], 计算B的时候请不要使用除法. 样例 给出A=[1, 2, 3], ...
- 使用Jedis操作Redis-使用Java语言在客户端操作---对key的操作
//添加String类型的模拟数据. jedis.set("mykey", "2"); jedis.set("mykey2", " ...
- 表格存储TableStore2.0重磅发布,提供更强大数据管理能力
表格存储TableStore是阿里云自研的面向海量结构化和半结构化数据存储的Serverless NoSQL多模型数据库,被广泛用于社交.物联网.人工智能.元数据和大数据等业务场景.表格存储Table ...
- json原生解析
身为新手,在运用网络解析json数据的时候,发现先会用Gson等框架解析json,然后就懒起来学原生解析了,这下在看别人写的demo的时候就尴尬了,一块块的,不懂写什么,气氛十分尴尬. 不多说,先来条 ...
- 分布式--ActiveMQ 消息中间件(一) https://www.jianshu.com/p/8b9bfe865e38
1. ActiveMQ 1). ActiveMQ ActiveMQ是Apache所提供的一个开源的消息系统,完全采用Java来实现,因此,它能很好地支持J2EE提出的JMS(Java Message ...
- pygame-常用的方法
1.pygame常用的方法 2.语音 图片