当前位置: 首页 > news >正文

二分答案思想下的二进制问题

序列合并

题目描述

给定一个长度为 n n n 的非负整数序列 { a n } \{a_n\} {an},你可以进行 k k k 次操作,每次操作你选择两个相邻的数,把它们合并成它们的按位或。

形式化地,一次操作中,你选择一个下标 i i i 1 ≤ i < n 1 \le i < n 1i<n),然后把原序列变成 { a 1 , a 2 , ⋯ , a i or ⁡ a i + 1 , a i + 2 , ⋯ , a n } \{a_1,a_2,\cdots,a_i \operatorname{or} a_{i+1},a_{i+2},\cdots,a_n\} {a1,a2,,aiorai+1,ai+2,,an}

k k k 次操作后所有数按位与的最大值。

输入格式

第一行包含两个正整数 n , k n,k n,k

第二行包含 n n n 个非负整数,其中第 i i i 个非负整数为 a i a_i ai

输出格式

输出一行,包含一个正整数,代表答案。

【数据范围】

  • 对于 25 % 25\% 25% 的数据, n ≤ 20 n \le 20 n20
  • 对于另外 25 % 25\% 25% 的数据, k = n − 2 k=n-2 k=n2

对于所有数据,保证 1 ≤ k < n ≤ 2 × 1 0 5 1 \le k<n \le 2 \times 10^5 1k<n2×105 0 ≤ a i < 2 30 0 \le a_i < 2^{30} 0ai<230

思路

对于这种给定一个序列,,定义其价值为序列最终其相/的值时,我们往往可以考虑去枚举最终的答案是否合法。
具体操作为,我们枚举答案二进制表示下的每一位,因为是尽可能的让答案更大,所以我们去枚举当前位为1时是否合法即可。
综上思路就和二分答案有些类似,所以这一类题的关键就在于如何 check 每次枚举的答案。
对于这一题,我们可以发现,对一个序列进行k次合并,等价于将其划分成 n − k n-k nk 个子段,现在题目变为了对于每个子段 x i x_i xi ,其最终相与的值是否能为 x x x ,那么对于每个子段的 x i x_i xi 而言,x 二进制表示上为 1 的位置, x i x_i xi 对应的位置也得为 1,所以我们的思路为,使用一个变量 s s s 去记录当前子段内部相或的值,若 s & x = x s\&x = x s&x=x ,那么则清空 s s s,子段数加一,最后判断子段数是否大于 n − k n-k nk 即可。

#include <bits/stdc++.h>using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> ar;
int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"void solve()
{int n,k;cin>>n>>k;vector<int> a(n);for(auto &ai: a) cin>>ai;ll ans=0;auto check=[&](int x){int s=0;int cnt=0;for(int i=0;i<n;i++){s|=a[i];if((s&x)==x){s=0;cnt++;}}return cnt>=n-k;};for(int i=31;i>=0;i--){ll res=ans+(1<<i);if(check(res)){ans=res;}}cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;// cin >> t;while (t--){solve();}system("pause");return 0;
}

牛客小白月赛94 E,F

在这里插入图片描述

思路:

这题和上面一题类似,也是求一些数相与的最大值,我们可以去枚举答案的每一位,去check当前这一位放 1 后是否合法即可。
这题的 check 比上一题还简单,即若当前的价值为当前枚举答案 x x x 的子集,我们变把他放入,最后看体积是否合法即可。

#include <bits/stdc++.h>using namespace std;
const int N = 1e5 + 5;
typedef long long ll;
typedef pair<ll, ll> pll;
typedef array<ll, 3> p3;
int mod = 998244353;
const int maxv = 4e6 + 5;
// #define endl "\n"void solve()
{int n,k;cin>>n>>k;vector<int> v(n+5),w(n+5);for(int i=1;i<=n;i++) cin>>v[i]>>w[i];ll ans=0;auto check=[&](int x){ll sum=(1ll<<32)-1;for(int i=1;i<=n;i++){if((w[i]&x)==x){sum&=v[i];}}return sum<=k;};for(int i=31;i>=0;i--){ll res=ans+(1<<i);if(check(res)){ans=res;}}cout<<ans<<endl;
}int main()
{ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);int t;t = 1;// cin >> t;while (t--){solve();}system("pause");return 0;
}

相关文章:

  • Python爬虫技术深度解析与实战案例
  • 基于51单片机简易温度计
  • 商品发布功能
  • 在VS Code中进行Java的单元测试
  • 【MySQL精通之路】InnoDB(9)-表和页压缩(1)-表压缩
  • 自由应用大本营?开源免费的Android应用商店:F-Droid Client
  • UniApp 2.0可视化开发工具:引领前端开发新纪元
  • 【前端】面试八股文——BFC
  • ubuntu-24.04系统静态Mac和IP配置
  • 【MySQL精通之路】MySQL-环境变量
  • 鹏哥C语言复习——调试
  • 从零开始搭建Springboot项目脚手架4:保存操作日志
  • 基于飞书机器人跨账号消息提醒
  • redis查看一个key占用了多少内存
  • [nextjs]推荐几个很好看的模板网站
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • Android框架之Volley
  • Docker 笔记(2):Dockerfile
  • es的写入过程
  • gitlab-ci配置详解(一)
  • JAVA之继承和多态
  • SpriteKit 技巧之添加背景图片
  • 不上全站https的网站你们就等着被恶心死吧
  • 初探 Vue 生命周期和钩子函数
  • 复习Javascript专题(四):js中的深浅拷贝
  • 工作踩坑系列——https访问遇到“已阻止载入混合活动内容”
  • 后端_ThinkPHP5
  • 基于Dubbo+ZooKeeper的分布式服务的实现
  • 日剧·日综资源集合(建议收藏)
  • 如何编写一个可升级的智能合约
  • 如何实现 font-size 的响应式
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 数组的操作
  • 算法之不定期更新(一)(2018-04-12)
  • 原生 js 实现移动端 Touch 滑动反弹
  • 云栖大讲堂Java基础入门(三)- 阿里巴巴Java开发手册介绍
  • [地铁译]使用SSD缓存应用数据——Moneta项目: 低成本优化的下一代EVCache ...
  • ​flutter 代码混淆
  • ​LeetCode解法汇总2583. 二叉树中的第 K 大层和
  • ​比特币大跌的 2 个原因
  • ​你们这样子,耽误我的工作进度怎么办?
  • ​学习一下,什么是预包装食品?​
  • # 消息中间件 RocketMQ 高级功能和源码分析(七)
  • ###C语言程序设计-----C语言学习(3)#
  • #define用法
  • $.ajax,axios,fetch三种ajax请求的区别
  • (04)Hive的相关概念——order by 、sort by、distribute by 、cluster by
  • (2)leetcode 234.回文链表 141.环形链表
  • (4)logging(日志模块)
  • (7)svelte 教程: Props(属性)
  • (C语言)输入一个序列,判断是否为奇偶交叉数
  • (el-Date-Picker)操作(不使用 ts):Element-plus 中 DatePicker 组件的使用及输出想要日期格式需求的解决过程
  • (pojstep1.1.1)poj 1298(直叙式模拟)
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)springboot高校宿舍交电费系统 毕业设计031552