首页 > 其他分享 >搜索之meet in middle(有效的小方法)

搜索之meet in middle(有效的小方法)

时间:2024-08-09 12:49:25浏览次数:12  
标签:cnt int long middle 搜索 meet include

题目:[https://www.luogu.com.cn/problem/P2962] (P2962 [USACO09NOV] Lights G)

算法:meet in middle(折半搜索)

思路:

有\(35\)个点,总共的操作状态有\(2^{35}\)种情况。如果我们采用一般的搜索方式,时间上会毫不犹豫得爆掉。 所以,我们要用折半搜索的方式。将所有的点拆分成两个集合,对两个集合分别用搜索的方式(枚举所有可能出现的情况)。这样就只有\(O(2^{n/2})\)的时间复杂度了!也能顺利解决问题!

注意的细节:

1、用 $ long long $ 代替 \(int\) 用来提高数据的承受能力。
2、提前预处理 \(2\) 的指数。
3、用 \(count\) 函数来计算\(1\)的个数。
4、对 << 与 >> 的正确使用。

点击查看代码
#include <algorithm>
#include <cstdio>
#include <iostream>
#include <map>

using namespace std;

int n, m, ans = 0x7fffffff;
map<long long, int> f;
long long a[40];

int main() {
  cin >> n >> m;
  a[0] = 1;
  for (int i = 1; i < n; ++i) a[i] = a[i - 1] * 2;  // 进行预处理

  for (int i = 1; i <= m; ++i) {  // 对输入的边的情况进行处理
    int u, v;
    cin >> u >> v;
    --u;
    --v;
    a[u] |= ((long long)1 << v);
    a[v] |= ((long long)1 << u);
  }

  for (int i = 0; i < (1 << (n / 2)); ++i) {  // 对前一半进行搜索
    long long t = 0;
    int cnt = 0;
    for (int j = 0; j < n / 2; ++j) {
      if ((i >> j) & 1) {
        t ^= a[j];
        ++cnt;
      }
    }
    if (!f.count(t))
      f[t] = cnt;
    else
      f[t] = min(f[t], cnt);
  }

  for (int i = 0; i < (1 << (n - n / 2)); ++i) {  // 对后一半进行搜索
    long long t = 0;
    int cnt = 0;
    for (int j = 0; j < (n - n / 2); ++j) {//注意这里的处理
      if ((i >> j) & 1) {
        t ^= a[n / 2 + j];//连锁
        ++cnt;
      }
    }
    if (f.count((((long long)1 << n) - 1) ^ t))
      ans = min(ans, cnt + f[(((long long)1 << n) - 1) ^ t]);
  }

  cout << ans;

  return 0;
}

标签:cnt,int,long,middle,搜索,meet,include
From: https://www.cnblogs.com/sszxlcy/p/18350561

相关文章

  • ecosia 搜索引擎爬虫
    因为他有cloudflare五秒盾所以需要先破五秒盾网上找的资料已验证可用 然后替换代码里的url_baseDocker运行一个容器就可以了。启动命令为:dockerrun-d\--name=flaresolverr\-p8191:8191\-eLOG_LEVEL=info\--restartunless-stopped\ghcr.io/flareso......
  • Windows 11 搜索要点功能,删除搜索广告
    点击搜索设置关闭要点搜索使用Windows+R快捷键打开「运行」对话框,执行gpedit.msc打开组策略编辑器。依次展开「计算机配置」>「管理模板」>「Windows组件」>「搜索」。在右侧面板中找到并双击「允许搜索要点」策略。根据需要,选择「已启用」或「已禁用」,然后点击「......
  • 吃瓜云网盘资源搜索技巧有哪些?
    ......
  • 了解红黑树:高效平衡二叉搜索树
    红黑树的概念红黑树,是一种二叉搜索树,但在每个结点上增加一个存储位表示结点的颜色,可以是Red或Black。通过对任何一条从根到叶子的路径上各个结点着色方式的限制,红黑树确保没有一条路径会比其他路径长出俩倍,因而是接近平衡的。红黑树的性质每个结点不是红色就是黑色根节......
  • 推荐好用的网盘搜索工具
    ......
  • 当你用bing搜索张云杰时
    首页会跳出:总结一下:(张杰自称)张云杰现实中是完完全全的废物。打开张云杰相关的图片可以看到:只能说气质太相符!会在首页跳出知乎上有关张云杰的长条文章评论:该文将用张云杰来形容长相丑陋、胆小怕事的懦弱小虫和怪物,我们不得不说这番形象的形容简直达到了莫贝尔奖的水平。......
  • 矩阵获客时代,云微客布局SEO优化,提升企业搜索流量
    矩阵这个词大家应该都不是第一次听了,毕竟现在互联网时代,想要在线上获客,矩阵就绕不过去的。现在,短视频已经成为了当下年轻人获取信息的重要途径,而对于商企来说,布局短视频矩阵不仅是线上获客、获取流量的关键,也是企业品牌宣传的新渠道。企业做短视频,一定要做矩阵,不然在内容过......
  • 确定非连续函数的根搜索中的发散点
    我需要为一个函数实现一个根搜索算法,该算法可能有一些(不可移除的)分歧点(DP)/奇点,例如f(x)=x**2*np.tan(x)问题是,通常的条件f(x1)*f(x2)<0表示区间[x1,x2]内的根不能应用于不连续函数。如果对上述函数执行此操作,算法会将DP识......
  • 墙裂推荐~收藏了很久的网盘搜索神器~
    虽然网盘自诞生以来就饱受吐槽,但不得不承认,我们平时的娱乐、工作、生活、学习很多时候依然离不开网盘,所以能够利用好网盘服务也可以大大提升工作学习效率,丰富日常生活。网上有很多网盘资源搜索的网站工具,它们可以自动抓取别人分享的资源,我们只需要输入关键词即可直接搜到,这也......
  • 「Day 3—深度优先搜索 & 广度优先搜索」
    深度优先搜索定义简单来说就是,一条路走到死,不行的话就回溯,继续一条路走到死,直到抵达目标点。习题P2052[NOI2011]道路修建思路首先,看题目对于花费的定义,道路的长度道路两端国家数的差值的绝对值,观察一下这个应该怎么计算,我们很明显能想到树子树大小,于是我们只要知道其中一......