Chika and Friendly Pairs(莫队+离散化+树状数组)

Chika and Friendly Pairs

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)
Total Submission(s): 1164    Accepted Submission(s): 421

Problem Description

Chika gives you an integer sequence a1,a2,…,an and m tasks. For each task, you need to answer the number of "friendly pairs" in a given interval.

friendly pair: for two integers ai and aj, if i<j and the absolute value of ai−aj is no more than a given constant integer K, then (i,j) is called a "friendly pair".A friendly pair (i,j) in a interval [L,R] should satisfy L≤i<j≤R.

Input

The first line contains 3 integers n (1≤n≤27000), m (1≤m≤27000) and K (1≤K≤109), representing the number of integers in the sequence a, the number of tasks and the given constant integer.
The second line contains n non-negative integers, representing the integers in the sequence a. Every integer of sequence a is no more than 109.
Then m lines follow, each of which contains two integers L, R (1≤L≤R≤n). The meaning is to ask the number of "friendly pairs" in the interval [L,R]。

Output

For each task, you need to print one line, including only one integer, representing the number of "friendly pairs" in the query interval.

Sample Input

7 5 3
2 5 7 5 1 5 6
6 6
1 3
4 6
2 4
3 4

Sample Output

0
2
1
3
1

Source

2019CCPC湖南全国邀请赛(广东省赛、江苏省赛)重现赛

解题思路:莫队维护区间,树状数组维护小于等于这个数的个数,  由于数很大要离散化.

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<cmath>
  6 using namespace std;
  7
  8 typedef long long ll;
  9
 10 int n,m,k,L,R;
 11 const int N=27007;
 12 int arr[N],brr[N],low[N],up[N],my[N],cnt[N];
 13 int ee[N],res;
 14
 15
 16 inline int read(){
 17     int x=0,f=1;
 18     char ch=getchar();
 19     while(ch<‘0‘||ch>‘9‘){
 20         if(ch==‘-‘)
 21             f=-1;
 22         ch=getchar();
 23     }
 24     while(ch>=‘0‘&&ch<=‘9‘){
 25         x=(x<<1)+(x<<3)+(ch^48);
 26         ch=getchar();
 27     }
 28     return x*f;
 29 }
 30
 31 int lowbits(int x){
 32     return x&(-x);
 33 }
 34
 35 void add(int x,int num){
 36     while(x<27000){
 37         cnt[x]+=num;
 38         x+=lowbits(x);
 39     }
 40 }
 41
 42 int sum(int x){
 43     int res=0;
 44     while(x){
 45         res+=cnt[x];
 46         x-=lowbits(x);
 47     }
 48     return res;
 49 }
 50
 51 struct Node{
 52     int l,r,id,ans;
 53     bool operator<(const Node&X)const{
 54 //        if(ans!=X.ans) return ans<X.ans;
 55 //        return r<X.r;
 56         return (ans^X.ans)?l<X.l:(ans&1)?r<X.r:r>X.r;
 57     }
 58 }A[N];
 59
 60
 61 int main(){
 62     scanf("%d%d%d",&n,&m,&k);
 63     for(int i=1;i<=n;i++) scanf("%d",&arr[i]),brr[i]=arr[i];
 64     sort(arr+1,arr+1+n);
 65     int size=unique(arr+1,arr+1+n)-arr-1;
 66     for(int i=1;i<=n;i++){
 67         low[i]=lower_bound(arr+1,arr+1+size,brr[i]-k)-arr-1;  //比x小的
 68         up[i]=upper_bound(arr+1,arr+1+size,brr[i]+k)-arr-1;  //等于y的
 69         my[i]=lower_bound(arr+1,arr+1+size,brr[i])-arr;
 70     }
 71     int big=sqrt(n);
 72     for(int i=1;i<=m;i++){
 73         A[i].l=read(),A[i].r=read();
 74         A[i].id=i;A[i].ans=(A[i].l-1)/big+1;    //分块在哪个块
 75     }
 76     sort(A+1,A+1+m);
 77     L=1,R=0;
 78     for(int i=1;i<=m;i++){
 79         while(L<A[i].l){
 80             add(my[L],-1);
 81             res-=sum(up[L])-sum(low[L]);
 82             L++;
 83         }
 84         while(L>A[i].l){
 85             L--;
 86             res+=sum(up[L])-sum(low[L]);
 87             add(my[L],1);
 88         }
 89         while(R>A[i].r){
 90             add(my[R],-1);
 91             res-=sum(up[R])-sum(low[R]);
 92             R--;
 93         }
 94         while(R<A[i].r){
 95             R++;
 96             res+=sum(up[R])-sum(low[R]);
 97             add(my[R],1);
 98         }
 99         ee[A[i].id]=res;
100     }
101     for(int i=1;i<=m;i++) printf("%d\n",ee[i]);
102     return 0;
103 }

原文地址:https://www.cnblogs.com/qq-1585047819/p/11369271.html

时间: 2024-10-04 17:49:23

Chika and Friendly Pairs(莫队+离散化+树状数组)的相关文章

【bzoj3289】Mato的文件管理 离散化+莫队算法+树状数组

原文地址:http://www.cnblogs.com/GXZlegend/p/6805224.html 题目描述 Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能访问.Mato每天随机选一个区间[l,r],他今天就看编号在此区间内的这些资料.Mato有一个习惯,他总是从文件大小从小到大看资料.他先把要看的文件按编号顺序依次拷贝出来,再用他写的排序程序给文件大小排序.排

BZOJ 3289: Mato的文件管理[莫队算法 树状数组]

3289: Mato的文件管理 Time Limit: 40 Sec  Memory Limit: 128 MBSubmit: 2399  Solved: 988[Submit][Status][Discuss] Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能访问.Mato每天随机选一个区间[l,r],他今天就看编号在此区间内的这些资料.Mat

【BZOJ3289】Mato的文件管理 莫队算法+树状数组

[BZOJ3289]Mato的文件管理 Description Mato同学从各路神犇以各种方式(你们懂的)收集了许多资料,这些资料一共有n份,每份有一个大小和一个编号.为了防止他人偷拷,这些资料都是加密过的,只能用Mato自己写的程序才能访问.Mato每天随机选一个区间[l,r],他今天就看编号在此区间内的这些资料.Mato有一个习惯,他总是从文件大小从小到大看资料.他先把要看的文件按编号顺序依次拷贝出来,再用他写的排序程序给文件大小排序.排序程序可以在1单位时间内交换2个相邻的文件(因为加密

[bzoj3289]Mato的文件管理_莫队_树状数组

Mato的文件管理 bzoj-3289 题目大意:给定一个n个数的序列.m次询问:一段区间中的逆序对个数. 注释:$1\le n\,mle 5\cdot 10^4$. 想法: 开始想这个题的大佬们,给您点儿提示吧:$O(nlogn\sqrt(n))$可过哦! 所以这个题就是莫队的裸题了. 我们的莫队上的区间在动的时候随时更新树状数组上的信息即可.. 然后碰见了一整块区间,我们就直接求逆序对即可, 最后,附上丑陋的代码... ... #include <iostream> #include &l

HDU 6278 - Just h-index - [莫队算法+树状数组+二分][2018JSCPC江苏省赛C题]

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6278 Time Limit: 6000/3000 MS (Java/Others) Memory Limit: 132768/132768 K (Java/Others) Problem Description The h-index of an author is the largest h where he has at least h papers with citations not les

BZOJ 3289:Mato的文件管理(莫队算法+树状数组)

http://www.lydsy.com/JudgeOnline/problem.php?id=3289 题意:…… 思路:求交换次数即求逆序对数.确定了这个之后,先离散化数组.然后在后面插入元素的话,就是在区间里面找比它大的元素数量,在前面插入元素的话,就是在区间里面找比它小的元素数量.删除操作类似.因为排序是从小到大排序,所以要找比它大的数量就是区间长度减去小于等于该元素的数量,所以是(R - L + 1 - sum(a[i])),要找比它小的数量就是(sum(a[i] - 1)).然后用莫

【BZOJ】3289: Mato的文件管理(莫队算法+树状数组)

http://www.lydsy.com/JudgeOnline/problem.php?id=3289 很裸的莫队... 离线了区间然后分块排序后,询问时搞搞就行了. 本题中,如果知道$[l, r]$后,考虑如何转移$[l, r+1]$,发现就是$a[r+1]$的颜色在这个区间的排名,然后$r-l+1-排名$就是需要移动的次数. 那么本题中因为只需要裸的排名,所以可以考虑用bit,即离散后搞. 然后就行了 #include <cstdio> #include <cstdio> #

BZOJ 2120: 数颜色 带修改的莫队算法 树状数组套主席树

https://www.lydsy.com/JudgeOnline/problem.php?id=2120 标题里是两种不同的解法. 带修改的莫队和普通莫队比多了个修改操作,影响不大,但是注意一下细节不要出现zz错误. 这道题修改的数量比较少可以写莫队,但是如果修改数量多或者是特别极限的数据大概是不行的吧. 1 #include<iostream> 2 #include<cstdio> 3 #include<algorithm> 4 #include<cstrin

poj 2299 Ultra-QuickSort 离散化 + 树状数组

题目链接:http://poj.org/problem?id=2299 离散化 + 树状数组 教科书例题般的题目 #include <iostream> #include <cstdio> #include <cstring> #include <queue> #include <cmath> #include <vector> #include <stack> #include <set> #include