Description

求区间内有多少对 \((i,j)\) 满足 \(|a_i - a_j| \leq k\)

Solution

可以莫队做(万能的莫队)

只需要考虑加入一个数会产生多少贡献即可

离散化的时候把 \(a_i,a_i - k, a_i+k\) 全部放进去。

加入一个数的时候只需要维护 \([a_i - k,a_i+k]\) 有多少个数,并且把 \(a_i\) 这个位置加上 1

删除亦然。这个可以用树状数组方便地维护。

具体实现的时候,因为树状数组是 sum(r) - sum(l-1) ,所以可以直接把 \(a_i,a_i - k-1, a_i+k\) 放进去离散化,求贡献就不用 -1 了

总复杂度 \(O(n \sqrt n \log n)\)

Code

#include <bits/stdc++.h>
using namespace std;
const int N = 100050;
int n, k, q, blo, c[N * 2], now, ans[N], tmp[2 * N], MX;
struct Query {
int l, r, id;
inline bool operator < (const Query &x) const {
return l / blo == x.l / blo ? r < x.r : l / blo < x.l / blo;
}
} Q[N];
struct node {
int id, lk, rk, val, se;
} a[N];
inline int lb(int x) { return x & (-x); }
inline void add(int x, int d) {
for(int i = x; i <= MX; i += lb(i))
c[i] += d;
}
inline int sum(int x) {
int ret = 0;
for(int i = x; i; i -= lb(i))
ret += c[i];
return ret;
}
inline void ADD(int x) {
now += sum(a[x].rk) - sum(a[x].lk);
add(a[x].val, 1);
}
inline void DEL(int x) {
add(a[x].val, -1);
now -= sum(a[x].rk) - sum(a[x].lk);
}
int main() { int cnt = 0;
scanf("%d %d %d", &n, &k, &q); blo = sqrt(q);
for(int i = 1; i <= n; i++) {
scanf("%d", &a[i].val);
a[i].lk = a[i].val - k - 1, a[i].rk = a[i].val + k;
tmp[++cnt] = a[i].lk;
tmp[++cnt] = a[i].rk;
tmp[++cnt] = a[i].val;
} sort(tmp + 1, tmp + cnt + 1);
int len = unique(tmp + 1, tmp + cnt + 1) - tmp - 1;
for(int i = 1; i <= n; i++) {
a[i].val = lower_bound(tmp + 1, tmp + len + 1, a[i].val) - tmp;
a[i].lk = lower_bound(tmp + 1, tmp + len + 1, a[i].lk) - tmp;
a[i].rk = lower_bound(tmp + 1, tmp + len + 1, a[i].rk) - tmp;
MX = max(a[i].rk, MX);
}
for(int i = 1; i <= q; i++) {
scanf("%d %d", &Q[i].l, &Q[i].r); Q[i].id = i;
Q[i].l++, Q[i].r++;
} sort(Q + 1, Q + q + 1);
int L = 1, R = 0;
for(int i = 1; i <= q; i++) {
int l = Q[i].l, r = Q[i].r;
while(L > l) ADD(--L);
while(R < r) ADD(++R);
while(L < l) DEL(L++);
while(R > r) DEL(R--);
ans[Q[i].id] = now;
}
for(int i = 1; i <= q; i++) printf("%d\n", ans[i]);
return 0;
}

题解【51nod 1290 Counting Diff Pairs】的更多相关文章

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

    51nod 1290 Counting Diff Pairs | 莫队 树状数组 题面 一个长度为N的正整数数组A,给出一个数K以及Q个查询,每个查询包含2个数l和r,对于每个查询输出从A[i]到A[ ...

  2. 51nod 1290 Counting Diff Pairs 莫队 + bit

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

  3. [LeetCode 题解]:Swap Nodes in Pairs

    前言   [LeetCode 题解]系列传送门:  http://www.cnblogs.com/double-win/category/573499.html   1.题目描述 Given a li ...

  4. leetcode 题解 || Swap Nodes in Pairs 问题

    problem: Given a linked list, swap every two adjacent nodes and return its head. For example, Given ...

  5. LeetCode题解之Swap Nodes in Pairs

    1.题目描述 2.问题分析 对两个节点进行交换操作 3.代码 ListNode* swapPairs(ListNode* head) { if( !head || head->next == N ...

  6. leetcode个人题解——#24 Swap Nodes in Pairs

    因为不太熟悉链表操作,所以解决方法烦了点,空间时间多有冗余. 代码中l,r分别是每一组的需要交换的左右指针,temp是下一组的头指针,用于交换后链接:res是交换后的l指针,用于本组交换后尾指针在下一 ...

  7. 【题解】CF#403 D-Beautiful Pairs of Numbers

    这题还挺对胃口的哈哈~是喜欢的画风!回家路上一边听歌一边想到的解法,写出来记录一下…… 首先,由于 \(b_{k} < a_{k + 1}\) ,所以我们可以看作是在一个长度为 n 的序列上选择 ...

  8. 题解 51nod 1597 有限背包计数问题

    题目传送门 题目大意 给出 \(n\),第 \(i\) 个数有 \(i\) 个,问凑出 \(n\) 的方案数. \(n\le 10^5\) 思路 呜呜呜,傻掉了... 首先想到根号分治,分别考虑 \( ...

  9. Counting The Important Pairs CodeChef - TAPAIR

    https://vjudge.net/problem/CodeChef-TAPAIR 合法的删除方法: 第一种:桥边与其余任意边(1)桥*(桥-1)/2(两条桥边)(2)桥*(m-桥)(桥边+其他边) ...

随机推荐

  1. textarea拖拽控制

    一.用处 textarea默认时允许用户以拖拽形式来改变textarea大小,但textarea的大小变化会撑大其父节点,有时会破坏整体布局,有时我们并不希望textarea随意拖拽. forklif ...

  2. OO前三次作业简单总结

    随着几周的进行,OO课堂已经经历过三次课下作业.在这三次作业中,我被扣了一些分数,也发现了自己几次作业中一些存在的共同的问题. 首先以第三次作业为例分析,我程序的类图如下 一共九个类,其中Als_sc ...

  3. 第四节 Linux目录文件及文件基本操作

    一.Linux目录结构 Linux 的目录与 Windows 的目录的区别: 一种不同是体现在目录与存储介质(磁盘,内存,DVD 等)的关系上,以往的 Windows 一直是以存储介质为主的,主要以盘 ...

  4. c++中的函数重载

    函数多态也称为函数重载. (1)函数重载指的是可以有多个同名的函数,因此对名称进行了重载. (2)函数重载的关键在于函数的参数列表,也称为函数特征标.如果两个函数的参数数目和参数类型相同,同时参数的排 ...

  5. Prism6下的MEF:添加Logger

    上篇已经简单的构建了一个Prism的程序,现在我们需要添加一个Logger,Prism本身自带一个功能简单的TextLogger,但是我们希望能用.Net常用的Log4net.所以我们需要重载掉Boo ...

  6. sqlserver trigger(触发器)-更新某几列数据时触发【转】

    CREATE TRIGGER [dbo].[updataAlarmLevel]ON [dbo].[Alarm_Alarm_Info]AFTER INSERT, UPDATE – 在更新和插入之后ASB ...

  7. shutdown&&isTerminated

    shutdownvoid shutdown()启动一次顺序关闭,执行以前提交的任务,但不接受新任务.若已经关闭,则调用没有其他作用.抛出:SecurityException - 如果安全管理器存在并且 ...

  8. [转帖] 固定硬盘接口 U.2和M.2

    U.2接口 U.2接口别称SFF-8639,是由固态硬盘形态工作组织(SSD Form Factor Work Group)推出的接口规范.U.2不但能支持SATA-Express规范,还能兼容SAS ...

  9. [转帖学习]Howto Shrink a Thin Provisioned Virtual Disk (VMDK)

    Howto Shrink a Thin Provisioned Virtual Disk (VMDK) Posted by fgrehl on November 24, 2014Leave a com ...

  10. mybatis的mapper参数传递

    简单参数传递 简单参数传递是指: 传递单个基本类型参数,数字类型.String 传递多个基本类型参数 parameterType 属性可以省略: 传递单个基本类型参数  SQL语句中参数的引用名称并不 ...