复杂度分析

假设本来是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 折半搜索 刷题记录的更多相关文章

  1. 搜索刷题记录by cellur925

    我好菜啊!连暴搜都不会! 注意边界退出! 特开此帖,记录搜索学习之路!(逃) 1.全排列 2.八皇后 3.数的划分 由于此题有同一划分方法算一个的限制,我们为了避免搜多,可以使搜出的结果满足单调不降性 ...

  2. 刷题记录:[De1CTF 2019]SSRF Me

    目录 刷题记录:[De1CTF 2019]SSRF Me 一.涉及知识点 1.MD5长度扩展攻击 2.Python 2.x - 2.7.16 urllib.fopen支持local_file导致LFI ...

  3. 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World

    目录 刷题记录:[CISCN2019 华北赛区 Day2 Web1]Hack World 一.前言 二.正文 1.解题过程 2.解题方法 刷题记录:[CISCN2019 华北赛区 Day2 Web1] ...

  4. $2019$ 暑期刷题记录1:(算法竞赛DP练习)

    $ 2019 $ 暑期刷题记录: $ POJ~1952~~BUY~LOW, BUY~LOWER: $ (复杂度优化) 题目大意:统计可重序列中最长上升子序列的方案数. 题目很直接的说明了所求为 $ L ...

  5. 攻防世界Web刷题记录(新手区)

    攻防世界Web刷题记录(新手区) 1.ViewSource 题如其名 Fn + F12 2.get post 3.robots robots.txt是搜索引擎中访问网站的时候要查看的第一个文件.当一个 ...

  6. 2021.12.19 eleveni的刷题记录

    2021.12.19 eleveni的刷题记录 0. 本次记录有意思的题 0.1 每个点恰好经过一次并且求最小时间 P2469 [SDOI2010]星际竞速 https://www.luogu.com ...

  7. PE刷题记录

    PE刷题记录 PE60 / 20%dif 这道题比较坑爹. 所有可以相连的素数可以构成一张图,建出这张图,在其中找它的大小为5的团.注意上界的估算,大概在1W以内.1W内有1229个素数,处理出这些素 ...

  8. leetcode刷题记录--js

    leetcode刷题记录 两数之和 给定一个整数数组 nums 和一个目标值 target,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但 ...

  9. Leetcode刷题记录(python3)

    Leetcode刷题记录(python3) 顺序刷题 1~5 ---1.两数之和 ---2.两数相加 ---3. 无重复字符的最长子串 ---4.寻找两个有序数组的中位数 ---5.最长回文子串 6- ...

随机推荐

  1. java的异常体系 及强制转换

    一,异常 1.常见的几种异常: StackOverFlow  栈溢出错误:写递归函数的时候,没有定义递归结束的条件. ArrayIndexOutofBounds   数组越界:如新new一个数组,in ...

  2. Mysql 保存emoji表情报错

    保存emoji表情错误 首先错误表现,抛出业务层报错之外,根源的数据库错误是: sql 错误码 1366 字符集相关错误. uncategorized SQLException; SQL state ...

  3. xPath和html基础扫盲

    xPath:一种HTML和XML的查询语言,他能在XML和HTML的树状结构中寻找节点 安装xPath: pip方法: pip install  lxml win+R:cmd 打开命令控制台:   此 ...

  4. 【idea激活码】,【WebStorm激活码】,【DataGrip激活码】,【IntelliJ 全家桶系列】,【定期更新】,【第一期】

    IntelliJ IDEA.PyCharm.PhpStorm.WebStorm.RubyMide.AppCode.CLion.GoLand.DataGrip.Rider.Android Studio可 ...

  5. Linux的crontab 命令

    crontab 命令 简介 从输入设备读取指令,并将其存放于 crontab 文件中,以供之后读取和执行,即:crontab 是 Linux 系统中添加计划任务,定时执行一些必要的脚本所必不可少的工具 ...

  6. 《手把手教你构建自己的 Linux 系统》学习笔记(1)

    第二章.基础准备--Linux 系统定制原理 Linux 系统的组成及架构 共享库和静态库 在 Linux 系统中,函数库包含两种形式:共享库和静态库. 共享库 共享库在程序运行时,为其提供所需要的函 ...

  7. JavaScript使用MQTT

    1.MQTT Server使用EMQTTD开源库,自行安装配置: 2.JS使用Websocket连接通信. 3.JS的MQTT库为paho-mqtt,git地址:https://github.com/ ...

  8. BizCharts使用采坑教程

      了不起的BizCharts 最近项目的管理后台都在用阿里粑粑开源的管理框架Ant Design Pro,说真话,还是比较好用的.该框架内部也封装了一些图标插件,但是在最近的一个项目中发现,这些图标 ...

  9. pyqt5加载pdf文档失败

    import sys from PyQt5.QtWidgets import QApplication, QMainWindow, QFileDialog from PyPDF2 import Pdf ...

  10. python + excel工资条自动生成

    年终绩效分配结果出来了,领导要求每人要清楚地知道自己的情况.要求:总绩效和各分类都要清楚.这就表示我们要给每人六个纸条,一个总的,五个分的.打出来,裁开,分发给每个人!累死人.所以,我就想能否每人生成 ...