原题链接: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. JS中获取元素使用getElementByID()、getElementsByName()、getElementsByTagName()的用法和区别

    Web标准下可以通过getElementById(), getElementsByName(), and getElementsByTagName()访问Documnent中的任一个标签:   1 g ...

  2. scrapy错误-[scrapy.core.scraper] ERROR: Spider error processing

    一.问题,就是我的callback没得回调函数 二:然后我查看源代码,发现: 三.我把解析页数的函数名设置为,def parse(self,response):  就没保错了 能运行成功 总结:在sp ...

  3. Redis项目实战,一些经验总结

    来源:https://my.oschina.net/u/920698/blog/3031587 背景 Redis 是一个开源的内存数据结构存储系统. 可以作为数据库.缓存和消息中间件使用. 支持多种类 ...

  4. APACHE两种域名跳转法简单完成重定向

    当我们变更网站域名,或者申请多个域名指向一个网站的时候,这个时候我们就会用到域名跳转(或者叫域名重定向redirect.域名转向).下面用最简单的文字讲两种apache的域名跳转方法. 假设我们想把w ...

  5. [fw]LINUX中断描述符初始化

    LINUX中断描述符初始化 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Univer ...

  6. HDU 1398 Square Coins(DP)

    Square Coins Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Tota ...

  7. HDU 1577 WisKey的眼神

    WisKey的眼神 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. casperjs-options

    The Casper class The easiest way to get a casper instance is to use the module's create() method: 最简 ...

  9. Java中 Map用法

    public static Map GetGoodTypes() { Map goodTypes=new HashMap(); goodTypes.put(1,"原材料"); go ...

  10. Nuget--基础连接已经关闭

    1.Nuget---基础连接已经关闭: 未能为 SSL/TLS 安全通道建立信任关系 修改一下 Package Source 改为 http://packages.nuget.org 2.Nuget- ...