Codeforces 1119D(差分)
2024-10-07 12:14:19
题面
分析
先考虑\(O(nk)\)的做法,先按s从小到大排序,每个串的数显然形成了n个连续区间\([s_i+l,s_i+r]\),且这些区间的左端点升序排列,然后把区间合并就可以知道有多少个不同的数了
然后考虑优化
对于s[i]产生的区间,我们考虑s[i]和s[i+1]产生的区间之间的间隔
若\(s_i+r \leq s_{i+1}+l\),即\(r-l \leq s_{i+1}-s_i\)
则说明s[i]产生的区间和s[i+1]产生的区间不相交,答案增加\((s_i+r)-(s_i+l)+1=r-l+1\)
否则说明\(s_i+l\)到\(s_{i+1}+l\)被占满了,答案增加\(s_{i+1}-s_i\)
定义差分\(d_i=s_{i+1}-s_i\)
综上,我们要求\(\sum \begin{cases} r-l+1,r-l \leq d_i \\ d_i,r-l > d_i\end{cases}\)
但是这样还是O(n)的,如何优化?
我们发现这个式子与区间的顺序无关,因此我们按\(d_i\)排序,每次就可以二分找到小于\(d_i\)的区间的位置,然后前缀和就可以了
注意我们刚刚讨论的都是前n-1个区间,最后一个区间直接加上他的长度就可以了
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define maxn 100005
using namespace std;
int n,m;
long long s[maxn];
long long d[maxn];
struct node{
long long dif;
int id;
friend bool operator < (node p,node q){
return p.dif<q.dif;
}
}a[maxn];
long long sumd[maxn];
int bin_search(int l,int r,long long k){
int mid,ans=0;
while(l<=r){
mid=(l+r)>>1;
if(a[mid].dif<=k){
ans=mid;
l=mid+1;
}else r=mid-1;
}
return ans+1;
}
long long solve(long long l,long long r){
int pos=bin_search(1,n-1,r-l);
long long ans=0;
if(pos-1>0) ans+=sumd[pos-1];
if(pos<n){
ans+=(n-pos)*(r-l+1);
}
ans+=(r-l+1);
return ans;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++) scanf("%I64d",&s[i]);
sort(s+1,s+1+n);
for(int i=1;i<n;i++){
d[i]=s[i+1]-s[i];
}
for(int i=1;i<n;i++){
a[i].dif=d[i];
a[i].id=i;
}
sort(a+1,a+n);
for(int i=1;i<n;i++){
sumd[i]=sumd[i-1]+a[i].dif;
}
long long l,r;
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%I64d %I64d",&l,&r);
printf("%I64d\n",solve(l,r));
}
}
最新文章
- Java程序员应该知道的10个调试技巧
- Spring实现文件上传
- Incompatible operand types DeptE and int 异常处理
- javaweb回顾第五篇浅谈会话
- Redhat linux 挂载命令mount
- TFS(Team Foundation Server)介绍和入门
- 我的C# - Web - DAL- DBHelper.cs
- select自动选中
- 数据结构录 之 BST的高级应用。
- php中奖算法逻辑
- 数据库DDL操作
- superagent和request结果转换区别
- 201521123063 《java程序设计》第六周学习总结
- 在Ubuntu14.04下安装 labelImg (标数据用)
- python装饰器小计
- 【spring源码分析】IOC容器初始化(八)
- docker学习------centos7.5下的swarm集群可视化构建
- Android 开发 框架系列 OkHttp使用详解
- Caused by: java.sql.SQLException: Field &#39;category_id&#39; doesn&#39;t have a default value
- opencv学习之路(9)、对比度亮度调整与通道分离
热门文章
- [书接上一回]在Oracle Enterprise Linux (v5.7) 中安装DB - (3/4)
- 【记录】form-data与x-www-form-urlencoded的区别
- 2018-8-10-win10-uwp-读写XML
- web编程jsp小tips
- crt无法修改背景
- Test 6.24 T1 购物
- ht-2 arrayList特性
- Oracle中动态SQL详解(EXECUTE IMMEDIATE)
- [CSP-S模拟测试]:棋盘(数学+高精度)
- BaseFragment 基类代码