Codeforces 1119D(差分)
题面
分析
先考虑\(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));
}
}
Codeforces 1119D(差分)的更多相关文章
- Greg and Array CodeForces 296C 差分数组
Greg and Array CodeForces 296C 差分数组 题意 是说有n个数,m种操作,这m种操作就是让一段区间内的数增加或则减少,然后有k种控制,这k种控制是说让m种操作中的一段区域内 ...
- CodeForces 1119D(差分+前缀和+二分)
题意:给你一个数组,数组每次每个数都+1,有q次查询每一查询+L到+R中出现的所有不重复的数字个数. +L到+R其实就相当于是0到+(R-L+1) 感觉自己写的好啰嗦,直接上代码加注释: 1 #inc ...
- G - Greg and Array CodeForces - 296C 差分+线段树
题目大意:输入n,m,k.n个数,m个区间更新标记为1~m.n次操作,每次操作有两个数x,y表示执行第x~y个区间更新. 题解:通过差分来表示某个区间更新操作执行的次数.然后用线段树来更新区间. #i ...
- Codeforces 1119D(贡献计算)
题目传送 排序看一看. 关键点在于发现性质: 算一个点的贡献时: 1.与后一个有重叠.\[当 a[i] + r >= a[i + 1] + l, 即 r - l >= a[i + 1] - ...
- HZNU Training 2 for Zhejiang Provincial Collegiate Programming Contest 2019
赛后总结: T:今天下午参加了答辩比赛,没有给予队友很大的帮助.远程做题的时候发现队友在H上遇到了挫折,然后我就和她们说我看H吧,她们就开始做了另外两道题.今天一人一道题.最后我们在研究一道dp的时候 ...
- Codeforces Gym 100015G Guessing Game 差分约束
Guessing Game 题目连接: http://codeforces.com/gym/100015/attachments Description Jaehyun has two lists o ...
- codeforces 1017C - Cloud Computing 权值线段树 差分 贪心
https://codeforces.com/problemset/problem/1070/C 题意: 有很多活动,每个活动可以在天数为$[l,r]$时,提供$C$个价格为$P$的商品 现在从第一天 ...
- Codeforces Round #439 (Div. 2) Problem E (Codeforces 869E) - 暴力 - 随机化 - 二维树状数组 - 差分
Adieu l'ami. Koyomi is helping Oshino, an acquaintance of his, to take care of an open space around ...
- Codeforces 841D Leha and another game about graph - 差分
Leha plays a computer game, where is on each level is given a connected graph with n vertices and m ...
随机推荐
- JVM 运行时数据区域划分
目录 前言 什么是JVM JRE/JDK/JVM是什么关系 JVM执行程序的过程 JVM的生命周期 JVM垃圾回收 JVM的内存区域划分 一.运行时数据区包括哪几部分? 二.运行时数据区的每部分到底存 ...
- git 和码云的上传文件代码操作
Git与Github的连接与使用 一 安装git软件 1.git介绍 ''' git是一款免费.开源的分布式版本控制系统,用于敏捷高效地处理任何或小或大的项目. 分布式相比于集中式的最大区别在于开发 ...
- 2019-8-31-dotnet-core-集成到-Mattermost-聊天工具
title author date CreateTime categories dotnet core 集成到 Mattermost 聊天工具 lindexi 2019-08-31 16:55:58 ...
- Windows下的Linux子系统安装,WSL 2下配置docker
Windows下的Linux子系统安装,WSL 2下配置docker 前提条件: 安装WSL 2需要Windows 10版本是Build 18917或更高,首先先确认系统版本已升级. 在“启用或关闭W ...
- tar shell zip
tar 打包后生成的文件名全路径 要打包的目录 tar -czPf xx/script.tar.gz ...
- LA 3263 That Nice Euler Circuit(欧拉定理)
That Nice Euler Circuit Little Joey invented a scrabble machine that he called Euler, after the grea ...
- 将ubuntu系统迁移到ssd固态
朋友送了一个固态硬盘给我,因此将原机械硬盘上的系统迁移到固态硬盘上. 原机械硬盘(dev/sdb)装有win10和ubuntu双系统.分区情况如下: sda1:ESP分区 sda2:资料 sda3:资 ...
- Test 3.27 T3 矩阵
Description 给一个 n*n 的地图,每个格子有一个价格,找一个矩形区域,使其价格总和位于[k,2k] Input 输入 k n(n<2000)和一个 n*n 的地图 Output 输 ...
- 【leetcode】1027. Longest Arithmetic Sequence
题目如下: Given an array A of integers, return the length of the longest arithmetic subsequence in A. Re ...
- 对排序(Sort)的研究
这一篇主要是介绍一些数据排序的基本算法和高级算法并利用JavaScript来逐一实现, 算法的说明: 稳定:如果a原本在b前面,当a=b时,排序之后a仍然在b的前面 不稳定:如果a原本在b的前面,当a ...