CF1742G Orray
2024-10-21 03:42:44
思路
大抵算是一道位运算入门题?
首先为了使 \(b_i\) 的字典序最大,我们注意到 \(b_1=a_1\),所以 \(a_1\) 必然是序列中最大的那个数。
接下来考虑贪心,设当前已经填了 \(k\) 个数,此时的或和为 \(a\),则我们从大往小扫,若 \(maxx\) 的第 \(i\) 位为 \(0\),则接下来我们最好凑出 \(1\) 来,因为 \(2^i>\sum_{j=1}^{i-1} 2^j\),如果实在凑不出来则 skip,如此贪心即可。
代码
#include<bits/stdc++.h>
using namespace std;
int const N=2e5+10;
int a[N],b[N],c[N],n,vis[N],k;
vector<int>q[50];
inline void chk(int &maxx,int id){
int mxp=0,maxn=maxx;
for (auto i:q[id]){
if (vis[i]) continue;
if ((a[i]|maxx)>maxn) maxn=(a[i]|maxx),mxp=i;
}
if (!mxp) return;
c[++k]=a[mxp];vis[mxp]=1;
maxx|=a[mxp];
return;
}
inline void chk(int x){for (int i=30;~i;--i) if (a[x]&(1<<i)) q[i].push_back(x);}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0),cout.tie(0);
int t;cin>>t;
while (t--){
int maxx=0,mxp;cin>>n;
for (int i=30;~i;--i) q[i].clear();k=0;
for (int i=1;i<=n;++i) vis[i]=0;
for (int i=1;i<=n;++i){
cin>>a[i],chk(i);
if (a[i]>maxx) maxx=a[i],mxp=i;
}
vis[mxp]=1;c[++k]=maxx;
for (int i=30;~i;--i)
if (!(maxx&(1<<i)) && q[i].size()) chk(maxx,i);
for (int i=1;i<=k;++i) cout<<c[i]<<' ';
for (int i=1;i<=n;++i) if (!vis[i]) cout<<a[i]<<' ';
cout<<'\n';
}
return 0;
}
最新文章
- 开发者的利器:Docker 理解与使用
- build.gradle文件详解<;转>; 推荐
- DEV提示控件ToolTipControl
- bc:linux下命令行计算器
- javaweb 解决将ajax返回的内容用document.write写入,FireFox一直加载的问题
- mysql 数据类型,字符集
- &ldquo;耐撕&rdquo;团队 2016.04.07 站立会议
- Python快速教程
- 测试functional的bind以及相关功能
- 网站商务通链接快速标识v1.0.js
- 介绍一个好用的软件--多个WIN远程连接
- 自行修改android.jar使其包含隐藏api
- java复习(1)---java与C++区别
- javascript数组特性
- 一个请求过来都经过了什么?(Thrift版)
- jbe 可以用来修改Java class的字节码,配合jd-gui 使用
- TCP长连接与短连接、心跳机制
- Django的rest_framework的视图之基于通用类编写视图源码解析
- Java-Runoob-高级教程-实例-方法:06. Java 实例 – 方法覆盖
- js:浏览器插件
热门文章
- java 分别获取当前时间的年月日以及当前时间所在周的周一周末日期
- SSH(四)控制层、业务层、dao层类的创建以及applicationcontext.xml和struts.xml配置
- 【笔面试真题】ThoughtWorks-笔试-2022年1月21日
- websockets的原理
- 从0到1学Python丨图像平滑方法的两种非线性滤波:中值滤波、双边滤波
- js的基本数据类型和引用数据类型及深拷贝浅拷贝
- react 高效高质量搭建后台系统 系列 —— 脚手架搭建
- Linux基础 文件和目录
- 3、mysql着重号解决关键字冲突
- 绿色版MySQL8.0.26安装流程