原题链接:http://acm.hdu.edu.cn/showproblem.php?pid=6534

题意:

给你一个数组,对于第i个数来说,如果存在一个位置j,使得j>i并且a[j]-k<=a[i]<=a[j]+k,那么这对数就称为好的,有q个询问,问你l到r区间有多少对好的数。

思路:

离线询问,想到可以用莫队维护区间,新加入元素(或删除元素)x时要统计区间[x-k,x+k]内的元素个数,想到 可以利用树状数组存元素个数(cnt)(权值数组),区间和就是元素个数,数据<=1e9,因此需要离散化a[i],a[i]+k,a[i]-k,记离散化后对应的数组为p1,p2,p3,每次区间增加下标为i的元素时,用树状数组求(p3[i],p2[i])的元素和,同时update(p1[i],1)。删除元素同理,为了防止询问时统计到自身,需要先更新再询问。

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int maxn=27005;
const int maxv=maxn*3;
typedef long long ll;
ll res,ans[maxn];
struct Q{
ll l,r,id;
}query[maxn];
int h[maxn],a[maxn];
int aa[maxn*3],T[maxn*3];
int p1[maxn],p2[maxn],p3[maxn];
bool cmp(Q a,Q b){
return (h[a.l]^h[b.l])?a.l<b.l:( (h[a.l]&1)?a.r<b.r:a.r>b.r);
}
int lowbit(int i){
return i &(-i);
}
void update(int i,int val){
while(i<=maxv){
T[i]+=val;
i+=lowbit(i);
}
}
int sum(int i){//求区间[1,i]内所有元素的和
int res=0;
while(i>0){
res+=T[i];//从右往左累加求和
i-=lowbit(i);
}
return res;
}
int _query(int l,int r){
return sum(r)-sum(l-1);
}
inline void insert(int x){
res+=_query(p3[x],p2[x]);
update(p1[x],1);
}
inline void erase(int x){
update(p1[x],-1);
res-=_query(p3[x],p2[x]);
}
int main(){
int n,m,k;
cin>>n>>m>>k;
int block=sqrt(n);
for(int i=0;i<=n;i++) h[i]=i/block;
for(int i=1;i<=n;i++) scanf("%d",&a[i]);
int cnt=0;
//离散化
for(int i=1;i<=n;i++){
aa[++cnt]=a[i];
aa[++cnt]=a[i]+k;
aa[++cnt]=a[i]-k;
}
sort(aa+1,aa+1+cnt);
int size=unique(aa+1,aa+1+cnt)-(aa+1);
for(int i=1;i<=n;i++){
p1[i]=lower_bound(aa+1,aa+1+size,a[i])-aa;
p2[i]=lower_bound(aa+1,aa+1+size,a[i]+k)-aa;
p3[i]=lower_bound(aa+1,aa+1+size,a[i]-k)-aa;
}
for(int i=1;i<=m;i++){
scanf("%d%d",&query[i].l,&query[i].r);
query[i].id=i;
}
sort(query+1,query+1+m,cmp);
int l=1,r=0;
for(int i=1;i<=m;i++){
Q &q=query[i];
while(l<q.l)erase(l++);
while(l>q.l)insert(--l);
while(r>q.r)erase(r--);
while(r<q.r)insert(++r);
ans[q.id]=res;
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
}

201⑨湘潭邀请赛 Chika and Friendly Pairs(HDU6534)的更多相关文章

  1. HDU6534 Chika and Friendly Pairs(莫队,树状数组)

    HDU6534 Chika and Friendly Pairs 莫队,树状数组的简单题 #include<bits/stdc++.h> using namespace std; cons ...

  2. HDU - 6534 Chika and Friendly Pairs

    这个题其实也是很简单的莫队,题目要求是给一个序列,询问l-r区间内部,找到有多少对答案满足 i < j 并且 | a[ i ] -a[ j ] | <=k 也就是有多少对,满足差值小于k的 ...

  3. HDU-6534-Chika and Friendly Pairs (莫队算法,树状数组,离散化)

    链接: https://vjudge.net/contest/308446#problem/C 题意: Chika gives you an integer sequence a1,a2,-,an a ...

  4. 1250 Super Fast Fourier Transform(湘潭邀请赛 暴力 思维)

    湘潭邀请赛的一题,名字叫"超级FFT"最终暴力就行,还是思维不够灵活,要吸取教训. 由于每组数据总量只有1e5这个级别,和不超过1e6,故先预处理再暴力即可. #include&l ...

  5. 湘潭邀请赛 Hamiltonian Path

    湘潭邀请赛的C题,哈密顿路径,边为有向且给定的所有边起点小于终点,怎么感觉是脑筋急转弯? 以后一定要牢记思维活跃一点,把复杂的事情尽量简单化而不是简单的事情复杂化. #include<cstdi ...

  6. 湘潭邀请赛+蓝桥国赛总结暨ACM退役总结

    湘潭邀请赛已经过去三个星期,蓝桥也在上个星期结束,今天也是时候写一下总结了,这应该也是我的退役总结了~ --------------------------------湘潭邀请赛----------- ...

  7. XTU 1264 - Partial Sum - [2017湘潭邀请赛E题(江苏省赛)]

    2017江苏省赛的E题,当时在场上看错了题目没做出来,现在补一下…… 题目链接:http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id ...

  8. 2018湘潭邀请赛 AFK题解 其他待补...

    A.HDU6276:Easy h-index Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/O ...

  9. 2018湘潭邀请赛C题(主席树+二分)

    题目地址:https://www.icpc.camp/contests/6CP5W4knRaIRgU 比赛的时候知道这题是用主席树+二分,可是当时没有学主席树,就连有模板都不敢套,因为代码实在是太长了 ...

随机推荐

  1. sql优化 分字段统计查询

    select count(1) from pd_xxx_origin_xxx_data where create_time like '2019-02-23%' and source='20036' ...

  2. 初识Flink-从WorldCount开始

    Apache Flink是一个用于分布式流和批处理数据处理的开源平台.Flink的核心是流数据流引擎,为数据流上的分布式计算提供数据分发,通信和容错.Flink在流引擎之上构建批处理,覆盖本机迭代支持 ...

  3. Robot Framework 执行结果无法查看(tomcat部署)

    打开jenkins系统管理-命令行执行: System.setProperty("hudson.model.DirectoryBrowserSupport.CSP","& ...

  4. Charles 抓 HTTPS 包

    最新 Charles 破解版下载地址:http://charles.iiilab.com/ 关掉翻墙软件!!!!! 重启 Charles !!!!! 重启浏览器!!!!! 如果是抓手机的HTTPS包, ...

  5. Libgdx中TextButton的一些思考

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/caihongshijie6/article/details/37566183         由于有 ...

  6. rabbitmq-5-案例2-简单的案例+exchange

    Exchange交换机: sendMessage端,发送消息到Exchage1.2, 然后交换机通过路由键,将消息转发给队列queue中,最后客户端从队列中获取消息 交换属性: name:名称 typ ...

  7. Java中实现pdf在线查看和下载

    Java中实现PDF的在线查看和下载,可以以servlet来实现. /** * 支持在线打开和下载 * * @param filePath * @param response * @param isO ...

  8. 想要成长,总得立个flag

    国庆假期结束了,自己的成长却丝毫没有,所以啊,立个flag试试看,每天能发表一个小知识点,希望自己能够做到,加油

  9. 2018-10-8-如何安装-btsync

    title author date CreateTime categories 如何安装 btsync lindexi 2018-10-8 9:15:6 +0800 2018-2-13 17:23:3 ...

  10. Linux学习笔记之认识与学习Bash

    什么是shell:shell是一个翻译器,将所敲的命令翻译成CPU能理解的语言,之后CPU再去执行,CPU执行后返回给shell,shell再翻译成我们所能理解的语言并显示:终端并不是shell,而是 ...