码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2019-08-17 18:28:08      阅读:122      评论:0      收藏:0      [点我收藏+]

标签:answer   scanf   ota   离散化   sub   div   memory   tin   lines   

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 aiaj 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 Li<jR.
 

 

Input
The first line contains 3 integers n (1n27000)m (1m27000) and K (1K109), 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 LR (1LRn). 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
 
解题思路:莫队维护区间,树状数组维护小于等于这个数的个数,  由于数很大要离散化.
 
技术图片
  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 }
View Code

 

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

标签:answer   scanf   ota   离散化   sub   div   memory   tin   lines   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!