CF1641A 题解

可能更好的阅读体验
题目传送门

题目大意

给定一个长度为 n 的序列 a 和一个数字 x
你需要在序列 a 后面加上一些元素,然后对整个序列重新排序,使得对于 [1,n] 内的任意奇数 i 都有 aix=ai+1
数据范围:n2×105,n2×105,2x106,1ai109

题目解析

考虑贪心。
首先把整个序列按升序排序。
然后从头到尾扫一次,如果 aix 存在,那么就把它删掉,否则就在序列里加入这个数字(也就是答案加一)。
我们发现需要使用哈希或者是平衡树来维护,这样就可以做到 O(n) 或者是 O(nlogn)

这里用 set 来维护。


我们发现 x106,ai109,也就是说 aix1015,会爆 int,所以一定要开 long long听说 Div 2 一堆人因为没开 FST 了。

核心代码:

struct JTZ{
ll x; int num;
bool operator < (const JTZ x) const {
if(this->x==x.x) return this->num < x.num;
return this->x < x.x;
}
};
set<JTZ> s,E;
int n,flag[maxn];
ll x,a[maxn];
void work(){
s=E; n=read(); x=read(); int i,ans=0;
for(i=1;i<=n;i++) a[i]=read(); sort(a+1,a+n+1);
for(i=1;i<=n;i++) s.insert((JTZ){a[i],i}),flag[i]=1;
for(i=1;i<=n;i++) if(flag[i]){
flag[i]=0;
s.erase((JTZ){a[i],i});
set<JTZ>::iterator tmp=s.lower_bound((JTZ){a[i]*x,i});
if((*tmp).x==a[i]*x) flag[(*tmp).num]=0,s.erase(tmp);
else ans++;
} print(ans),pc('\n'); return;
}
posted @   jiangtaizhe001  阅读(42)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具
点击右上角即可分享
微信分享提示