meet in the middle 折半搜索 刷题记录
复杂度分析
假设本来是n层,本来复杂度是O(2^n),如果meet in middle那就是n/2层,那复杂度变为O( 2^(n/2) ),跟原来的复杂度相比就相当于开了个方
比如如果n=40那爆搜2^40肯定T飞,那用meet in middle的话就是2^20就可做了。
洛谷P2962 [USACO09NOV]灯Lights
- 灯只有35个,用二进制可以表示所有灯的状态,于是考虑搜索
- 1表示该灯是亮的,0表示是灭的
- 把某一个等和与他相邻的灯的位都置1表示该灯位置的开关,用 li 数组表示,按下开关 i 就相当于异或 li[i]
- map存前半部分能到达的状态下按的最少开关数
- 先爆搜前半部分,更新map,再爆搜后半部分,看其补集是否存在更新答案
- 注意前半部分本来就有不需要按灯的状态,所以cnt一开始都是1,最后ans-2即可
- 基本上抄袭hzwer代码:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- int n, m, flag=, ans=1e9;
- ll x[], li[];
- ll e=;
- map <ll,int> st;
- void dfs(int now, ll d, int cnt) {
- if(now == n/+ && flag) {
- if( st[d]!= ) st[d] = min(st[d], cnt);
- else st[d] = cnt;
- return;
- }
- if(now == n+) {
- if( st[e-d]!= ) ans = min(ans, st[e-d]+cnt);
- return;
- }
- dfs(now+, d^li[now], cnt+); //按下开关
- dfs(now+, d, cnt);
- }
- int main(){
- cin >> n >> m;
- x[] = ;
- for (int i=; i<=n; i++) x[i] = x[i-] << ;
- int a, b;
- for (int i=; i<m; i++) {
- scanf("%d%d", &a, &b);
- li[a] ^= x[b];
- li[b] ^= x[a];
- }
- for (int i=; i<=n; i++) { li[i] ^= x[i]; e ^= x[i]; }
- dfs(,,);
- flag = ;
- dfs(n/+,,);
- cout << ans- << endl;
- return ;
- }
(>人<;)
洛谷P4799 [CEOI2015 Day2]世界冰球锦标赛
- 搜后一半的时候需要知道前一半有多少值小于tmp
- 把前一半的值用数组保存起来,排个序,upperbound就行了
- longlong 打成int调了好久,为什么还是会犯这种很傻的错误呢,害
- 代码:
- #include <bits/stdc++.h>
- using namespace std;
- typedef long long ll;
- ll n,tot,flag=,ans=,mid,id=;
- ll c[];
- ll mj[];
- void dfs(ll now,ll s){
- if(s>tot) return;
- if(now==mid && flag){
- mj[++id]=s;
- return;
- }
- if(now==n+){
- ll tmp=tot-s;
- ans+=( upper_bound(mj+, mj+id+, tmp)-mj- );
- return;
- }
- dfs(now+,s+c[now]);
- dfs(now+,s);
- }
- int main(){
- cin>>n>>tot;
- mid=n/+;
- for (int i=; i<=n; i++) scanf("%lld",&c[i]);
- dfs(,);
- sort(mj+,mj+id+);
- flag=;
- dfs(mid,);
- cout<<ans<<endl;
- return ;
- }
qwq
meet in the middle 折半搜索 刷题记录的更多相关文章
- 搜索刷题记录by cellur925
我好菜啊!连暴搜都不会! 注意边界退出! 特开此帖,记录搜索学习之路!(逃) 1.全排列 2.八皇后 3.数的划分 由于此题有同一划分方法算一个的限制,我们为了避免搜多,可以使搜出的结果满足单调不降性 ...
- 刷题记录:[De1CTF 2019]SSRF Me
目录 刷题记录:[De1CTF 2019]SSRF Me 一.涉及知识点 1.MD5长度扩展攻击 2.Python 2.x - 2.7.16 urllib.fopen支持local_file导致LFI ...
- 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World
目录 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World 一.前言 二.正文 1.解题过程 2.解题方法 刷题记录:[CISCN2019 华北赛区 Day2 Web1] ...
- $2019$ 暑期刷题记录1:(算法竞赛DP练习)
$ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...
- 攻防世界Web刷题记录(新手区)
攻防世界Web刷题记录(新手区) 1.ViewSource 题如其名 Fn + F12 2.get post 3.robots robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个 ...
- 2021.12.19 eleveni的刷题记录
2021.12.19 eleveni的刷题记录 0. 本次记录有意思的题 0.1 每个点恰好经过一次并且求最小时间 P2469 [SDOI2010]星际竞速 https://www.luogu.com ...
- PE刷题记录
PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...
- leetcode刷题记录--js
leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...
- Leetcode刷题记录(python3)
Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...
随机推荐
- 如何用Java8 Stream API找到心仪的女朋友
传统的的Java 集合操作是有些啰嗦的,当我们需要对结合元素进行过滤,排序等操作的时候,通常需要写好几行代码以及定义临时变量. 而Java8 Stream API 可以极大简化这一操作,代码行数少,且 ...
- leetcode--js--Two Sum
问题描述: 给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = ...
- MYSQL5.7进阶之主从复制
主从复制是msql数据库的高可用 读写分离 容灾备份 等的基本要求 在这主从复制之前我们需要准备以下条件 保证master数据库和从数据库的mysql版本一致 matser和从数据防火墙关闭 数据库端 ...
- Ant Design 方法默认传值,加上其他参数
前端填坑之路Ant Design里面的一些触发方法,如OnChange,OnSelect等等,当你触发时,该时间会自动传一些值给方法. 这是Select里面的onChange调用,在红框中,他会自动传 ...
- shell 一键配置单实例oracle基础环境变量(linux7)
#!/bin/bash echo "修改主机名" hostnamectl set-hostname wangxfa hostname sleep 1 echo "查看并关 ...
- IDAE快捷键与设置
以前做项目的时候都是用Eclispe,来到新的公司发现IDE用的是IDEA集成开发工具,以前也用过IDEA,只是略懂略懂,以后你会发现,当你用IDEA的快捷键的时候,会6的飞起 1.IDEA常用快捷键 ...
- 【54】目标检测之Bounding Box预测
Bounding Box预测(Bounding box predictions) 在上一篇笔记中,你们学到了滑动窗口法的卷积实现,这个算法效率更高,但仍然存在问题,不能输出最精准的边界框.在这个笔记中 ...
- MATLAB应用专题part1-电力电子仿真技术
士不可以不弘毅,任重而道远.仁以为己任,不亦重乎?死而后已,不亦远乎? --曾参 C语言系列需要过一段时间才能更新了.这些天学习C语言我感觉有点崩溃了,所以我先开另外一个专题-matlab应用专题. ...
- 转:静态链表及其创建(C语言实现)
http://c.biancheng.net/view/3339.html 折半插入排序算法(C语言代码实现) http://c.biancheng.net/view/3440.html 二叉树层次遍 ...
- vue富文本编辑器vue-quill-editor使用总结(包含图片上传,拖拽,放大和缩小)
vue-quill-editor是vue很好的富文本编辑器,富文本的功能基本上都支持,样式是黑白色,简洁大方. 第一步下载 vue-quill-editor: npm i vue-quill-edit ...