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 ...
随机推荐
- Python3安装教程
目录 1. 推荐阅读 2. 安装包下载 3. 安装步骤 1. 推荐阅读 Python基础入门一文通 | Python2 与Python3及VSCode下载和安装.PyCharm破解与安装.Python ...
- Linux系统启动过程浅析
经过老师的讲解以及查阅资料后,现对Linux系统启动做以浅析,仅是个人理解. 主要的步骤有以下几步: 第一步:Power On.用户按下电源开关的那一瞬间,叫Power On阶段 .在这个阶段,BIO ...
- nginx 重写
rewrite指令可在 server 块或者 location 块中配置. 语法: rewrite regex replacement [flag]; 1.rewrite 接收的 uri 不包含 ho ...
- CSS3 Animations
CSS Animations 是CSS的一个模块,它定义了如何用关键帧来随时间推移对CSS属性的值进行动画处理.关键帧动画的行为可以通过指定它们的持续时间,它们的重复次数以及它们如何重复来控制. an ...
- JMeter-性能测试之报表设定的注意事项
在使用 Jmeter 执行性能测试时,需要屏蔽以下模块: 结果树 图形结果 断言 具体的说明,可以见官网:http://jmeter.apache.org/usermanual/component_r ...
- 对Proxy的研究
概述 Proxy 用于修改某些操作的默认行为,等同于在语言层面做出修改,所以属于一种“元编程”(meta programming),即对编程语言进行编程. Proxy 可以理解成,在目标对象之前架设一 ...
- Map.Entry的由来和使用
首先,回忆和练习一下HashMap的遍历 package Exercise.exercise; import java.util.HashMap; import java.util.Iterator; ...
- Java浏览器弹出下载框,多个文件导出压缩包
项目里一直有这个功能,也一直没怎么注意,今天研究了一下 依据逻辑往下走: 首先是要下载的ajax的Java方法,只有返回值需要设定一下,其他的不用管: Map<String, Object> ...
- JS自定义 Map
<script>function HashMap(){this.map = {};}HashMap.prototype = { put : function(key, value){ th ...
- layer.js插件
官方网址: http://layer.layui.com/