[note]一类位运算求最值问题
2024-10-20 21:06:37
[note]一类位运算求最值问题
给定一些数,让你从中选出两个数a,b,每次询问下列中的一个
1.a and b的最大值
2.a xor b的最大值
3.a or b的最大值
神仙们都是FWT,小蒟蒻只好orz
首先三种问题的思路都是从高位往低位贪心
- 对于xor,直接枚举每个数Trie树上贪心
- 对于and,如果可选集合中有大于等于两个数当前位为1,那么答案这一位也是1,并把这一位为0的数删去
- 对于or,先维护一个高维前缀和,枚举每一个数,如果某一位为0,我们就贪心的看能不能补上1,
相当于询问是否存在某个数满足前面的要求并且这一位为1,
如果这一位是1,显然我们在这位放0限制作用更小.
复杂度都是\(nlog\)值域
不过预处理高位前缀和似乎是\(log\)值域×值域
#include<bits/stdc++.h>
using namespace std;
const int _=1e5+5;
int re(){
int x=0,w=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar();
return x*w;
}
int T,n,c,ans,tot;
int a[_],ch[2][_*20];
bool ban[_],vis[1<<21];
void solve_and(){
memset(ban,0,sizeof(ban));
for(int i=20;~i;i--){
int cnt=0;
for(int j=1;j<=n;j++)
if(!ban[j]&&a[j]>>i&1)cnt++;
if(cnt<2)continue;ans|=1<<i;
for(int j=1;j<=n;j++)
if(a[j]>>i&1^1)ban[j]=1;
}
}
void insert(int x){
int u=0;
for(int i=20;~i;i--){
int k=x>>i&1;
if(!ch[k][u])ch[k][u]=++tot;
u=ch[k][u];
}
}
int query(int x){
int res=0,u=0;
for(int i=20;~i;i--){
int k=x>>i&1^1;
if(!ch[k][u])u=ch[k^1][u];
else u=ch[k][u],res|=1<<i;
}
return res;
}
void solve_xor(){
tot=0;
memset(ch,0,sizeof(ch));
for(int i=1;i<=n;i++)insert(a[i]);
for(int i=1;i<=n;i++)ans=max(ans,query(a[i]));
}
void solve_or(){
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)vis[a[i]]=1;
for(int i=1<<20;~i;i--)
for(int j=0;j<=20;j++)
if(vis[i]&&i>>j&1)vis[i^(1<<j)]=1;
for(int i=1;i<=n;i++){
int res=0,sum=0;
for(int j=20;~j;j--){
sum|=1<<j;
if(a[i]>>j&1)continue;
if(vis[res|(1<<j)])res|=1<<j;
else sum^=1<<j;
}
ans=max(ans,sum);
}
}
int main(){
freopen("maximum.in","r",stdin);
freopen("maximum.out","w",stdout);
T=re();
while(T--){
n=re(),c=re();ans=0;
for(int i=1;i<=n;i++)a[i]=re();
if(c==1)solve_and();
if(c==2)solve_xor();
if(c==3)solve_or();
printf("%d\n",ans);
}
return 0;
}
最新文章
- 控制TextField的内容长度
- Ubuntu Mysql 维护
- css点滴
- MapKit/CoreLocation框架 总结
- 黄聪:手机移动端建站Jquery+CSS3+HTML5触屏滑动特效插件、实现触屏焦点图、图片轮展图
- poj 1985 Cow Marathon 树的直径
- HPROF学习
- [小技巧] 打造属于 Dell XPS 13 (9350) 的专属 Windows 7 iso 镜像
- PreferenceFragment 使用 小结
- POJ 3579 Median(二分答案+Two pointers)
- 艰辛五天:Ubuntu14.04+显卡驱动+cuda+Theano环境安装过程
- centos7 docker安装详解
- JSP和JavaBean总结
- PBCS项目总结
- 【Spring学习】Spring的源码解析之路 ——【step1】基础环境配置 + IDEA快捷键整理
- hiho1257 Snake Carpet
- M1-Flask-Day2
- Linux端口转发-rinted工具部署、配置、使用
- Eclipse+PyDev 安装和配置
- React框架简介
热门文章
- Angular 学习笔记——service &;constant
- Angular 学习笔记——run
- 自动播放——幻灯片缓冲效果&;&;带Loading效果的图片切换&;&;移动效果(按轨迹移动)
- Python线程操作
- 【Excle数据透视表】如何为一个字段添加多种分类汇总方式
- iOS仿支付宝首页效果
- Android XMPP 即时通讯
- Linux下画原理图和PCB
- jsp页面JSTL标签 <;c:fn:>;
- Atitit.跨语言&#160;java&#160;c#.net&#160;php&#160;js常用的codec&#160;encode算法api&#160;兼容性&#160;&#160;应该内置到语言里面