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

题解:CF2114G Build an Array

学校的作业题。

非常好题目,思考过程非常自然。

CF2114G

首先如果数组中有相邻的数相等,直接输出NO

然后探讨一下合并操作性质:只有可能发生在数组边缘。发现一定是先合成一个中间的数,然后由内向外依次合成。

例如给出的数组是[1,2,3],那我们可以先合成中间的 \(2\),然后再合成两边的数,这个过程中,\(2\) 是一个“隔板”,是不会被合并的

不难发现一个数可以分解成 \(2^x\cdot k\),其中 \(k\) 是一个奇数。显然,这个数可以通过 \([1,2^x]\) 中的任意次操作合成。

但是请注意,在合并过程中,这个数可能有相邻的、已经被合成好的数。例如在上述例子中,合成好 \(2\) 后再合成 \(3\) 的时候,我们要保证这个过程中 \(3\) 这个位置的数不会和 \(2\) 相等。

如何处理这个问题?需要进行一定的分类讨论:如果两个数的 \(k\) 不相同,那么它们不可能相等。这个时候当前合成的数最多还是贡献 \(2^x\) 次操作;如果两个相等,又分以下两种情况:如果当前合成的数的 \(x\) 小于相邻的数的 \(x\),那么肯定不会影响,还是贡献 \(2^x\) 次;否则,必须从 \(2^{x_0+1}\) 开始往后加(此处的 \(x_0\) 是指已经合成好的元素),那么最多只能贡献 \(2^x-2^{x_0+1}+1\) 次操作(此处的 \(x\) 指正在合成的元素)。

最后考虑如何快速计算以每一个位置为中心点时的总贡献。考虑到将中心位置从 \(i\) 移动到 \(i+1\),此时 \(i\) 的相邻元素会从不存在(即没有限制)变为 \(i+1\),同时 \(i+1\) 的限制会消除。那么通过只计算变化量的思想,这个转移可以在常数时间内实现。只要这个总贡献的最大值超过了 \(k\),那么便输出YES

//to kill a living book
#include<bits/stdc++.h>
#define int long long
#define ll __int128
#define double long double
using namespace std;pair<int,int> cal(int x){int res=0;while(!(x&1)) res++,x>>=1;return {x,res};
}int work(pair<int,int> i,pair<int,int> lim){auto [ix,im]=i;auto [lx,lm]=lim;if(ix!=lx||im<lm) return (1<<im);else return (1<<im)-(1<<(lm+1))+1;
}void solve(){int n,k;cin>>n>>k;vector<int> a(n+1);for(int i=1;i<=n;i++){cin>>a[i];}for(int i=1;i<n;i++){if(a[i]==a[i+1]){return cout<<"NO\n",void();}}vector<pair<int,int>> info(n+1,{0,0});for(int i=1;i<=n;i++){info[i]=cal(a[i]);}int res=0;for(int i=1;i<=n;i++){res+=work(info[i],info[i-1]);}//位置 0 代表限制不存在if(res>=k) return cout<<"YES\n",void();for(int i=2;i<=n;i++){res-=work(info[i-1],info[0]);res+=work(info[i-1],info[i]);res-=work(info[i],info[i-1]);res+=work(info[i],info[0]);if(res>=k) return cout<<"YES\n",void();}cout<<"NO\n";
}signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);int t; cin>>t;while(t--) solve();return 0;
}

https://codeforces.com/contest/2114/submission/361649912

http://www.jsqmd.com/news/398656/

相关文章:

  • 哥德尔定理的前提
  • 基于计算机网络原理优化LiteAvatar实时通信
  • YOLO12案例分享:电商商品自动识别系统
  • 2026年硅酸钙保温板企业盘点,实力品牌解析,碳纤维增强硅酸钙板/高密度硅酸钙异形件,硅酸钙保温板供应商推荐排行 - 品牌推荐师
  • Phi-3-mini-4k-instruct与Qt集成:开发跨平台AI桌面应用
  • 低光照环境挑战:实时口罩检测-通用模型夜视增强效果展示
  • DeepSeek-R1-Distill-Qwen-7B多模态扩展:结合CLIP的图像理解能力
  • Claude Code编程经验记录总结-增加需求方案设计规约文档
  • SeqGPT-560M Web界面定制化:修改默认标签集、预置常用字段模板、主题色配置
  • Qwen3-ASR-1.7B在直播场景中的应用:实时字幕生成
  • WeKnora电商应用:商品知识图谱构建实战
  • tao-8k Embedding模型开源部署:支持国产操作系统(麒麟/UOS)验证报告
  • 2026年北京萧邦手表维修推荐:基于服务标准与网点布局评价,直击维修质量隐忧 - 十大品牌推荐
  • 从春晚舞台到全球赛场:中国人形机器人,到底走到了哪一步?
  • 一键生成透明背景:RMBG-2.0工具使用测评
  • Lingyuxiu MXJ LoRA在网络安全中的应用:生成对抗样本测试
  • ollama神器+Phi-4-mini-reasoning:打造个人AI助手如此简单
  • 天猫超市卡回收攻略,闲置卡不浪费! - 团团收购物卡回收
  • Qwen-Image-Edit入门指南:无需代码,纯Web界面完成专业级图像编辑
  • 惊艳效果展示:Lychee-Rerank在文档相关性排序中的实际表现
  • StructBERT情感分类模型:用户反馈自动分类实战
  • Phi-3-mini-4k-instruct多模态应用:图像描述生成
  • 5步搞定!nanobot超轻量AI助手部署与使用教程
  • 2026年北京万宝龙手表维修推荐:多场景服务评价,针对维修质量与时效性痛点深度解析 - 十大品牌推荐
  • 开源大模型落地挑战:glm-4-9b-chat-1m部署中的典型问题解析
  • MedGemma-X在放射科的应用:一键生成专业诊断报告
  • 2026年北京西铁城手表维修推荐:专业售后中心深度排名,应对复杂机芯与保养需求痛点 - 十大品牌推荐
  • Jimeng AI Studio 5分钟快速上手:零基础生成惊艳AI图片
  • DASD-4B-Thinking在C语言教学中的应用案例分享
  • Claude Code编程经验记录总结-增加公共库管理模块