CF895B XK Segments 题解
CF895B XK Segments 题解
题目描述
题目解法
朴素想法
最简单的想法就是枚举二元组
很明显,该做法的时间复杂度为
二分
我们发现,
先算出大于等于
符合条件的区间的左端点
符合条件的区间的右端点
记得特判
先排序再二分端点,迭代器相减即可。
记得开 long long
。
Code
#include<bits/stdc++.h> using namespace std; #define int long long int n, x, k; vector<int> vc; signed main() { cin>>n>>x>>k; int ans=0; for(int i=1, v;i<=n;i++) cin>>v, vc.push_back(v); sort(vc.begin(), vc.end()); for(auto i:vc) { int nx=(i%x)?(i/x+1)*x:i; int l=k?nx+(k-1)*x:i, r=nx+k*x; auto it1=lower_bound(vc.begin(), vc.end(), r); auto it2=lower_bound(vc.begin(), vc.end(), l); ans+=it1-it2; } cout<<ans; }
本文作者:Jimmy-LEEE
本文链接:https://www.cnblogs.com/redacted-area/p/18379521
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步