51nod 1290 Counting Diff Pairs 莫队 + bit

一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[j]中,有多少对数,abs(A[i] - A[j]) <= K(abs表示绝对值)。

Input

第1行:3个数N,K,Q,中间用空格分隔,N为数组A的长度,K为差距,Q为查询的数量。(2 <= N <= 50000, 0 <= K <= 10^9, 1 <= Q <= 50000)
第2至N + 1行:每行1个数,对应数组中的数(1 <= A[i] <= 10^9)
第N + 2至N + M + 1行:每行2个数l, r中间用空格分隔(0 <= l <= r < N)

Output

输出共Q行,对于Q条查询的结果

莫队 + bit/主席树离散化的时候先预处理出所有的离散化值,不然会t

代码:
  1
  2   //File Name: nod1290.cpp
  3   //Author: long
  4   //Mail: [email protected]
  5   //Created Time: 2016年09月16日 星期五 17时22分07秒
  6
  7 #include <stdio.h>
  8 #include <string.h>
  9 #include <iostream>
 10 #include <algorithm>
 11 #include <math.h>
 12 #define LL long long
 13 #define hash _hash_
 14 using namespace std;
 15 const int MAXN = 50010;
 16 int hash[MAXN * 3],num[MAXN * 3],top,tot;
 17 void hash_init(){
 18     sort(num+1,num+top+1);
 19     tot = 0;
 20     hash[++tot] = num[1];
 21     for(int i=2;i<=top;i++)
 22         if(num[i] != num[i-1])
 23             hash[++tot] = num[i];
 24 }
 25 int hash_find(int x){
 26     int l = 1,r = tot,m;
 27     while(l <= r){
 28         m = l + r >> 1;
 29         if(hash[m] < x) l = m + 1;
 30         else r = m - 1;
 31     }
 32     return l;
 33 }
 34 int a[MAXN],b[MAXN],c[MAXN],bel[MAXN],bit[MAXN * 3],cur_l,cur_r,K;
 35 LL ans[MAXN],cur_ans;
 36 struct Query{
 37     int ql,qr,id;
 38 }que[MAXN];
 39 bool cmp(Query x,Query y){
 40     if(bel[x.ql] == bel[y.ql]) return x.qr < y.qr;
 41     return bel[x.ql] < bel[y.ql];
 42 }
 43 void update(int x,int add){
 44     for(int i=x;i<=tot;i+=i&-i)
 45         bit[i] += add;
 46 }
 47 int query(int x){
 48     int res = 0;
 49     for(int i=x;i>0;i-=i&-i)
 50         res += bit[i];
 51     return res;
 52 }
 53 int cal(int u){
 54     return query(c[u]) - query(b[u] - 1);
 55 }
 56 void update_l(int to_l){
 57     while(cur_l < to_l){
 58         update(a[cur_l],-1);
 59         cur_ans -= cal(cur_l);
 60         cur_l++;
 61     }
 62     while(cur_l > to_l){
 63         cur_l--;
 64         cur_ans += cal(cur_l);
 65         update(a[cur_l],1);
 66     }
 67 }
 68 void update_r(int to_r){
 69     while(cur_r < to_r){
 70         cur_r++;
 71         cur_ans += cal(cur_r);
 72         update(a[cur_r],1);
 73     }
 74     while(cur_r > to_r){
 75         update(a[cur_r],-1);
 76         cur_ans -= cal(cur_r);
 77         cur_r--;
 78     }
 79 }
 80 void solve(int n,int q){
 81     hash_init();
 82     for(int i=1;i<=n;i++){
 83         b[i] = hash_find(a[i] - K);
 84         c[i] = hash_find(a[i] + K);
 85         a[i] = hash_find(a[i]);
 86     }
 87     memset(ans,0,sizeof ans);
 88     int NUM = (int)sqrt(n + 0.5);
 89     for(int i=1;i<=n;i++)
 90         bel[i] = (i - 1) / NUM;
 91     sort(que+1,que+q+1,cmp);
 92     memset(bit,0,sizeof bit);
 93     update(a[1],1);
 94     cur_l = cur_r = 1;
 95     cur_ans = 0;
 96     for(int i=1;i<=q;i++){
 97         update_r(que[i].qr);
 98         update_l(que[i].ql);
 99         ans[que[i].id] = cur_ans;
100     }
101 }
102 int main(){
103     int n,q;
104     while(~scanf("%d %d %d",&n,&K,&q)){
105         top = 0;
106         for(int i=1;i<=n;i++){
107             scanf("%d",a + i);
108             num[++top] = a[i];
109             num[++top] = a[i] - K;
110             num[++top] = a[i] + K;
111         }
112         for(int i=1;i<=q;i++){
113             scanf("%d %d",&que[i].ql,&que[i].qr);
114             que[i].ql++,que[i].qr++,que[i].id = i;
115         }
116         solve(n,q);
117         for(int i=1;i<=q;i++)
118             printf("%lld\n",ans[i]);
119     }
120     return 0;
121 }
				
时间: 2024-09-27 04:35:08

51nod 1290 Counting Diff Pairs 莫队 + bit的相关文章

51nod 1290 Counting Diff Pairs | 莫队 树状数组

51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[j]中,有多少对数,abs(A[i] - A[j]) <= K(abs表示绝对值). 题解 莫队!//其实我就是搜索"51nod + 莫队"找到的这道题-- 七级算法题! 一道320分! 你值得拥有! 题解就是--用个普通的莫队,加上树状数组来统计符合条件的数个数,就好啦. 当增加/

Chika and Friendly Pairs(莫队+树状数组+离散化+预处理上下界)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6534 Chika and Friendly Pairs Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 524288/524288 K (Java/Others)Total Submission(s): 160    Accepted Submission(s): 52 Problem Description Chika gives y

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

[voj 1551]E - Pairs 2014年武汉大学邀请赛E题 莫队算法

题目大意 有n个数,m个查询,对于每个查询,询问指定区间,有多少个数对的绝对值小于等于2. 解题思路 莫队O^1.5 首先将询问离线处理左端点进行编号,每sqrt(n)个为一组 sort结构体 当左端点编号相同时,比较右端点大小.小的放在前面. 对于每组询问暴力处理,只需处理当前新加入(删除的数字在当前区间内有多少点和它的绝对值只差小于2即可) 唯一要注意的是加点是先更新答案再计数,删点是先计数器-1再更新答案 因为对于每个询问,左端点的修改量不超过sqrt(n) 右端点每一组最坏的复杂度是修改

whu oj 1551 Pairs (莫队算法)

problem_id=1551">题目链接 题目大意: 给出的询问,求出这个区间的里 差小于等于 2 的数字的对数. 思路分析: 莫队算法. 然后分析一下. 假设添加了一个数字.那么就要加它旁边相差为2 的数字的和. 反之降低一个.就要降低相差为2 的数字的和.再减去自己这个1.. #include <cstdio> #include <iostream> #include <cstring> #include <algorithm> #in

Codeforces Round #340 (Div. 2) E. XOR and Favorite Number 莫队算法

E. XOR and Favorite Number Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pair li and ri and asks you to count the number of pairs of integers i and j, such that l ≤ i ≤ j ≤ r and the xor

XOR and Favorite Number(莫队算法+分块)

E. XOR and Favorite Number time limit per test 4 seconds memory limit per test 256 megabytes input standard input output standard output Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pai

数据结构(莫队算法):HEOI2012 采花

[题目描述] 萧薰儿是古国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一排的,以便于公主采花.公主每次采花后会统计采到的花的颜色数,颜色数越多她会越高兴!同时,她有一癖好,她不允许最后自己采到的花中,某一颜色的花只有一朵.为此,公主每采一朵花,要么此前已采到此颜色的花,要么有相当正确的直觉告诉她,她必能再次采到此颜色的花.由于时间关系,公主只能走过花园连续的一段进行采花,便让女仆

CodeFroce Round 340 div2 E XOR and Favorite Number【莫队算法】

题面: Bob has a favorite number k and ai of length n. Now he asks you to answer m queries. Each query is given by a pair li and ri and asks you to count the number of pairs of integers i and j, such that l?≤?i?≤?j?≤?r and the xor of the numbers ai,?ai?