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

CF1945H GCD is Greater

目录

  • tags
  • 中文题面
  • 思路
  • 代码

tags

模拟 优先队列

中文题面

给定长度为 n ( n ≥ 4 ) n(n \ge 4) n(n4) 的序列 a a a 和整数 x x x,将每个元素划分至 A A A 集合或 B B B 集合,要求 ∣ A ∣ , ∣ B ∣ ≥ 2 |A|,|B| \ge 2 A,B2 A A A 集合中所有元素的 gcd ⁡ \gcd gcd 严格大于 B B B 集合中所有元素的按位与加 x x x,即 gcd ⁡ y ∈ A { y } > AND ⁡ y ∈ B { y } + x \gcd _{y \in A} \{y\} > \operatorname{AND}_{y \in B}\{y\}+x gcdyA{y}>ANDyB{y}+x,给出方案或判断无解。

多测, 1 ≤ ∑ n , ∑ max ⁡ { a i } ≤ 4 ⋅ 1 0 5 1 \le \sum n,\sum \max \{a_i\} \le 4 \cdot 10^5 1n,max{ai}4105

思路

首先我们可以确定的是对于 g c d gcd gcd 我们只选两个数,因为选多了会让 g c d gcd gcd 变小,同时让按位与增大。

枚举每个二进制位:

  • 如果全是 1 1 1,那 按位与 确定是 1 1 1
  • 如果只有一个 0 0 0,如果 gcd ⁡ \gcd gcd 取到了这个 0 0 0 n − 1 n-1 n1 种选法)按位与 为 1 1 1,否则确定是 0 0 0
  • 如果只有两个 0 0 0,如果 gcd ⁡ \gcd gcd 取到了这两个 0 0 0 则 按位与 为 1 1 1,否则确定是 0 0 0

上述需要特判的位置对至多只有 O ( n log ⁡ n ) O(n\log n) O(nlogn) 对,直接判即可。

剩下的情况 按位与 确定。我们需要在被 ban 掉的位置对之外找到 gcd ⁡ \gcd gcd 最大的一对。

枚举 gcd ⁡ = d \gcd=d gcd=d,用调和的复杂度求出元素为 d d d 的倍数的个数 x x x 以及被 ban 掉的个数 y y y。如果 y < C x 2 y< C_x^2 y<Cx2,那我们能做到 gcd ⁡ = d \gcd=d gcd=d

然后暴力找即可

代码

#include <iostream>
#define N 400002
using namespace std;
int T,n,m,x,a[N],tmp[N],sump[N],sums[N],vis[N];
bool tag[N];
int gcd(int a,int b)
{if(a%b==0) return b;return gcd(b,a%b);
}
int main()
{cin >> T;while(T--){cin >> n >> x;for(int i=1;i<=n;i++) cin >> a[i];m=0;sump[0]=sums[n+1]=(1<<30)-1;for(int i=1;i<=n;i++) m=max(m,a[i]);for(int i=1;i<=m;i++) vis[i]=0;for(int i=1;i<=n;i++) tag[i]=0;for(int i=1;i<=n;i++) vis[a[i]]++;int ans1=-1,ans2=-1;for(int i=0;(1<<i)<=m;i++){if(ans1!=-1) break;int cnt=0;for(int j=1;j<=n;j++){if(!((1<<i)&a[j])) tmp[++cnt]=j;}if(cnt==1){for(int j=1;j<=n;j++){if(j==tmp[1]) sump[j]=sump[j-1];else sump[j]=sump[j-1]&a[j];}for(int j=n;j>=1;j--){if(j==tmp[1]) sums[j]=sums[j+1];else sums[j]=sums[j+1]&a[j];}for(int j=1;j<=n;j++){if(j==tmp[1]) continue;if(gcd(a[tmp[1]],a[j])>(sump[j-1]&sums[j+1])+x){ans1=tmp[1];ans2=j;break;}}if(!tag[tmp[1]]) tag[tmp[1]]=1,vis[a[tmp[1]]]--;}else if(cnt==2){for(int j=1;j<=n;j++){if(j==tmp[1]) sump[j]=sump[j-1];else sump[j]=sump[j-1]&a[j];}for(int j=n;j>=1;j--){if(j==tmp[1]) sums[j]=sums[j+1];else sums[j]=sums[j+1]&a[j];}for(int j=1;j<=n;j++){if(j==tmp[1]) continue;if(gcd(a[tmp[1]],a[j])>(sump[j-1]&sums[j+1])+x){ans1=tmp[1];ans2=j;break;}}for(int j=1;j<=n;j++){if(j==tmp[2]) sump[j]=sump[j-1];else sump[j]=sump[j-1]&a[j];}for(int j=n;j>=1;j--){if(j==tmp[2]) sums[j]=sums[j+1];else sums[j]=sums[j+1]&a[j];}for(int j=1;j<=n;j++){if(j==tmp[2]) continue;if(gcd(a[tmp[2]],a[j])>(sump[j-1]&sums[j+1])+x){ans1=tmp[2];ans2=j;break;}}if(!tag[tmp[1]]) tag[tmp[1]]=1,vis[a[tmp[1]]]--;if(!tag[tmp[2]]) tag[tmp[2]]=1,vis[a[tmp[2]]]--;}}if(ans1==-1){int res=a[1],g=-1;for(int i=2;i<=n;i++) res&=a[i];for(int i=m;i>=res+x+1;i--){int cnt=0;for(int j=i;j<=m;j+=i) cnt+=vis[j];if(cnt>=2){g=i;break;}}if(g!=-1){for(int i=1,now=0;i<=n;i++){if(vis[a[i]]&&a[i]%g==0){now++;if(now==1) ans1=i;else{ans2=i;break;}}}}}if(ans1==-1) cout << "NO\n";else{cout << "YES\n";cout << 2 << ' ' << a[ans1] << ' ' << a[ans2] << '\n';cout << n - 2;for(int i=1;i<=n;i++){if(i!=ans1&&i!=ans2) cout << ' ' << a[i];}cout << '\n';}}return 0;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • [Matsim]Matsim学习笔记-动态线路接乘客上车的逻辑
  • 安利7个免费开源的网络监控工具(非常详细)收藏这一篇就够了
  • 调研-音视频
  • T/CECS 10035-2019 绿色建材评价 金属复合装饰材料
  • 数字赋能下的艺术蝶变:沃可趣如何重塑乐园演艺人才培训?
  • js中filter函数使用箭头函数的时候注意事项
  • 基于x86 平台opencv的图像采集和seetaface6的静默活体功能
  • H5实现带电话号码跳转到手机呼叫
  • Java二十三种设计模式-状态模式(20/23)
  • uniapp微信小程序 分享功能
  • Python计算机视觉编程 第六章
  • MySQL 视图(VIEW)的使用
  • AI在医学领域:HYDEN一种针对医学图像和报告的跨模态表示学习方法
  • IOS 13 网络请求和Moya框架
  • k8s高版本(1,28)部署NodePort模式下的ingress-nginx的详细过程及应用案例
  • [ JavaScript ] 数据结构与算法 —— 链表
  • 【vuex入门系列02】mutation接收单个参数和多个参数
  • Android Volley源码解析
  • CSS 三角实现
  • Elasticsearch 参考指南(升级前重新索引)
  • JavaSE小实践1:Java爬取斗图网站的所有表情包
  • php中curl和soap方式请求服务超时问题
  • Python十分钟制作属于你自己的个性logo
  • vue 个人积累(使用工具,组件)
  • 百度地图API标注+时间轴组件
  • 纯 javascript 半自动式下滑一定高度,导航栏固定
  • 第2章 网络文档
  • 发布国内首个无服务器容器服务,运维效率从未如此高效
  • 关于Flux,Vuex,Redux的思考
  • 七牛云 DV OV EV SSL 证书上线,限时折扣低至 6.75 折!
  • 使用权重正则化较少模型过拟合
  • 微信如何实现自动跳转到用其他浏览器打开指定页面下载APP
  • 以太坊客户端Geth命令参数详解
  • 远离DoS攻击 Windows Server 2016发布DNS政策
  • 职业生涯 一个六年开发经验的女程序员的心声。
  • 智能网联汽车信息安全
  • 国内唯一,阿里云入选全球区块链云服务报告,领先AWS、Google ...
  • ​configparser --- 配置文件解析器​
  • ######## golang各章节终篇索引 ########
  • #进阶:轻量级ORM框架Dapper的使用教程与原理详解
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (java版)排序算法----【冒泡,选择,插入,希尔,快速排序,归并排序,基数排序】超详细~~
  • (二)斐波那契Fabonacci函数
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (十五)使用Nexus创建Maven私服
  • (未解决)jmeter报错之“请在微信客户端打开链接”
  • (一一四)第九章编程练习
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .net 连接达梦数据库开发环境部署
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET(C#) Internals: as a developer, .net framework in my eyes
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • .net和php怎么连接,php和apache之间如何连接