E. MinimizOR

news/2024/12/5 13:06:16/

题目E. MinimizOR

前置知识:线段树求区间最值、理论(如果所有的数字都小于 2 k 2^k 2k ,那么考虑区间中k+1个最小的数字就可以找出 min ⁡ i ≠ j a i ∣ a j \min_{i\not=j}{a_i|a_j} mini=jaiaj

证明:来源于官方题解

归纳法

如果所有的数字都小于 2 k 2^k 2k,那么考虑 k + 1 k+1 k+1个最小的数字就足够了。

基本情况: k = 1 k=1 k=1,所有的数字都是从 0 0 0 1 1 1 ,证明很明显。

归纳的步骤。

让我们来证明,对于任何 k ≥ 1 k≥1 k1 的情况,如果对于 k k k 来说声明是真的,那么对于 k + 1 k+1 k+1也是真的。

如果所有数字的第 k k k 位都是 1 1 1,那么答案的第 k k k 位也是 1 1 1,这就是为什么我们只需要最小化剩下的位。对于这些位,我们可以应用归纳假设,即 k + 1 k+1 k+1 个最小的数字就足够了。如果至少有两个数字的第 k k k 位是 0 0 0 ,那么答案的第 k k k 位也是 0 0 0 ,这就是为什么我们只考虑第 k k k 位是 0 0 0 的数字,我们必须最小化其余的位。再次应用归纳假设, k + 1 k+1 k+1 个最小的数字就足够了。如果正好有一个数字的第 k k k 位是 0 0 0 ,那么答案中的第 k k k 位就是 1 1 1 ,我们必须在 k k k 位上找到 k + 1 k+1 k+1 个最小数。他们是 k + 2 k+2 k+2 个在 k + 1 k+1 k+1 位上的最小数,所以 k + 2 k+2 k+2 个最小数足够了。

在有了前面的理论基础,剩下的可以用线段树求区间中 k + 1 k+1 k+1 个最小值。

注: k k k 不超过 30 30 30

#include<stdio.h>
#include<algorithm>using namespace std;
const int N = 1e5 + 10;
typedef long long ll;
struct node{int l,r;ll min[40];
}tr[N * 4];
ll res[40];void down(int p) {ll b[70];int L = 0;for(int i=0;i<=32;i++) b[L ++] = tr[p*2].min[i];for(int i=0;i<=32;i++) b[L ++] = tr[p*2+1].min[i];sort(b,b+L);for(int i=0;i<=32;i++) tr[p].min[i] = b[i];
}void build(int p,int l,int r) {tr[p].l = l,tr[p].r = r;for(int i=0;i<=32;i++) tr[p].min[i] = 1e15;if(l == r) {scanf("%lld",&tr[p].min[0]);return ;}int mid = (l + r) >> 1;build(p*2,l,mid);build(p*2+1,mid+1,r);down(p);
}void ask(int p,int l,int r) {if(tr[p].l >= l && r >= tr[p].r) {ll b[70];int L = 0;for(int i=0;i<=32;i++) b[L ++] = tr[p].min[i];for(int i=0;i<=32;i++) b[L ++] = res[i];sort(b,b+L);for(int i=0;i<=32;i++) res[i] = b[i];return ;}int mid = (tr[p].l + tr[p].r) >> 1;if(l <= mid) ask(p*2,l,r);if(r > mid) ask(p*2+1,l,r);
}int main(){int t;scanf("%d",&t);while(t --) {int n;scanf("%d",&n);build(1,1,n);int m;scanf("%d",&m);while(m --) {int l,r;scanf("%d %d",&l,&r);for(int i=0;i<=32;i++) res[i] = 1e15;ask(1,l,r);ll ans = 1e15;for(int i=0;i<=32;i++) {for(int j=i+1;j<=32;j++) {ans = min(ans,res[i] | res[j]);}}printf("%lld\n",ans);}}return 0;
} 

http://www.ppmy.cn/news/213947.html

相关文章

【正点原子STM32连载】 第六十二章 UCOSII实验2-信号量和邮箱 摘自【正点原子】MiniPro STM32H750 开发指南_V1.1

1&#xff09;实验平台&#xff1a;正点原子MiniPro H750开发板 2&#xff09;平台购买地址&#xff1a;https://detail.tmall.com/item.htm?id677017430560 3&#xff09;全套实验源码手册视频下载地址&#xff1a;http://www.openedv.com/thread-336836-1-1.html 4&#xff…

miniUI

miniUI笔记与问题 作为刚刚入职的小白&#xff0c;公司的很多项目都使用到miniUI&#xff0c;我自己接收的第一个比较正式的活便是关于miniUI的。 对于miniUI官方文档&#xff0c;我个人认为很不友好&#xff0c;易读性差。 mini.parse() 将html标签解析为miniui控件。 我们…

第一次刷机心得(努比亚Z17mini刷MIUI10)

自己有一个努比亚的手机&#xff0c;但是系统UI的优化太差了&#xff0c;会有一些小毛病&#xff08;比如通知栏白色等&#xff09;&#xff0c;除了当初觉得努比亚相机功能做的不错&#xff0c;但可能上一个用的是miui觉得努比亚的UI非常不习惯&#xff0c;所以萌生出了刷机这…

一键刷入twrp_努比亚Z17-Z17S-Z17mini 刷入MIUI10系统刷机教程

很对小伙伴们都问努比亚Z17系列如果刷入MIUI10&#xff0c;今天小编就和大家整理一下&#xff0c;根 据教程走&#xff0c;基本上可以完整刷好的 一、备份手机上需要的资料 刷机千万步&#xff0c;备份第一步&#xff0c;好好备份需要的资料&#xff0c;非常重要 二、解锁BL及刷…

win10动态桌面软件

win10动态桌面配置 分享一设置windows 10 利用软件设置实现动态桌面的效果&#xff1a; 其实&#xff0c;这需要一款软件&#xff0c;来实现&#xff0c;如果要似乎用正版&#xff0c;小伙伴可以购买序列号&#xff0c;有30天试用&#xff1b;但奈何money不足呀&#xff0c;经…

微软商店下载的软件怎么放到桌面?

在微软应用商店下载软件后经常找不到软件在哪&#xff0c;不知道大家有没有相同的问题。针对这个问题&#xff0c;下面小编整理了微软商店下载的软件放到桌面的两种方法&#xff0c;有需要的用户可以看过来。 第一种方法 1、首先&#xff0c;我们点击win10桌面左下角的【window…

安卓桌面整理app_安卓手机桌面软件哪个好 手机桌面管理软件排行榜

由于安卓Android系统其开放性&#xff0c;使得系统美化和定制变得异常简单&#xff0c;只要下载安装安卓桌面软件程序进行桌面切换即可。安卓手机用哪个桌面哪个好&#xff1f;安卓手机目前什么桌面最好流畅与华丽&#xff0c;下面小编就为大家介绍一下几款手机桌面&#xff0c…

下载安装的软件桌面没有图标怎么回事?

有用户在电脑上下载安装软件&#xff0c;安装之后发现桌面没有显示软件图标&#xff0c;这是怎么回事&#xff1f;遇到这种情况&#xff0c;不要着急&#xff0c;下面就以Win10为例&#xff0c;给大家介绍一下Win10下载安装的软件桌面没有图标的解决办法。 操作过程&#xff1a…