原题链接: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. 10. Jmeter-后置处理器一

    jmeter-后置处理器介绍与使用一 今天我们先讲 CSS/JQuery Extractor JSON Extractor Boundary Extractor 正则表达式提取器 CSS/JQuery ...

  2. 【C#学习笔记】 List.AddRange 方法

    [官方笔记] 将指定集合的元素添加到 List 的末尾 命名空间:System.Collections.Generic程序集:mscorlib(在 mscorlib.dll 中) public: vo ...

  3. git update-index --assume-unchanged on directory 转摘自:http://stackoverflow.com/questions/12288212/git-update-index-assume-unchanged-on-directory

    30down votefavorite 16 git 1.7.12 I want to mark all files below a given directory as assume-unchang ...

  4. 2018-2-13-win10-uwp-HttpClient-post错误

    title author date CreateTime categories win10 uwp HttpClient post错误 lindexi 2018-2-13 17:23:3 +0800 ...

  5. 基于AtomicReference的单例模式写法

    AtomicReference类主要属性(来源于jdk1.7中的源码) public class AtomicReference<V> implements java.io.Seriali ...

  6. vue框架中什么是MVVM

    前端页面中使用MVVM的思想,即MVVM是整个视图层view的概念,属于视图层的概念. MVVM是前端视图层的分层开发思想,将页面分成了Model, View,和VM:其中VM是核心,因为VM是V和M ...

  7. [REPRINT] Java 101: Classes and objects in Java

    http://www.javaworld.com/article/2979739/learn-java/java-101-classes-and-objects-in-java.html?page=3 ...

  8. Java8 使用stream 实现wordcount

    案例: public static void main(String[] args) { List<String> items = Arrays.asList("apple&qu ...

  9. 【Flutter学习】页面跳转之路由及导航

    一,概述 移动应用通常通过成为‘屏幕’或者‘页面’的全屏元素显示其内容,在Flutter中,这些元素统称为路由,它们由导航器Navigator组件管理.导航器管理一组路由Route对象,并提供了管理堆 ...

  10. 【Flutter学习】事件处理与通知之事件处理

    一,概述 移动应用中一个必不可少的环节就是与用户的交互,在Flutter中提供的手势检测为GestureDetector. Flutter中的手势系统分为二层: 第一层是触摸原事件(指针) Point ...