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;
}

转载于:https://www.cnblogs.com/acfunction/p/10163361.html

题解【51nod 1290 Counting Diff Pairs】相关推荐

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

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

  2. Educational Codeforces Round 113 (Rated for Div. 2) D. Inconvenient Pairs

    Educational Codeforces Round 113(Rated for Div. 2)的其他题解点我 D. Inconvenient Pairs 原题链接 题目大意: 在一个大小为 1e ...

  3. Allegro学习之PCB SI后仿真流程

    目录 ................................................................................................. ...

  4. 博弈论入门之威佐夫博弈

    威佐夫博弈 威佐夫博弈是一类经典的博弈问题 有两堆石子,两个顶尖聪明的人在玩游戏,每次每个人可以从任意一堆石子中取任意多的石子或者从两堆石子中取同样多的石子,不能取得人输,分析谁会获得胜利 博弈分析 ...

  5. asp子窗口读取父窗口数据_算法与数据结构基础 - 数组(Array)

    数组基础 数组是最基础的数据结构,特点是O(1)时间读取任意下标元素,经常应用于排序(Sort).双指针(Two Pointers).二分查找(Binary Search).动态规划(DP)等算法.顺 ...

  6. 基于RNA-seq的基因表达分析

    我的青春     最近在做一些小麦基因的表达分析,想到使用RNA-seq的数据进行生物信息学分析,并且比我做实验用的组织还要多. 序列预处理 下载数据之后,首先要对数据进行低质量序列和载体序列等污染序 ...

  7. HyperLynx(十四)高级分析技术

    1.BoardSim中的差分对 2.建立SPICE电路连接 1.BoardSim中的差分对 对差分引脚的分析是通过为其指定差分模型完成的.差分引脚在IBIS文件中有严格的定义,但是选定了差分模型后,用 ...

  8. allegro设置差分线

    allegro设置差分线 差分 线宽 线距_Allegro PCB快速调整差分对线宽线距 原文链接:https://blog.csdn.net/qq_39299370/article/details/ ...

  9. Allegro PCB快速调整差分对线宽与线距

    详细介绍Allegro pcb快速调整差分对线宽与线距详细步骤. 在PCB设计中可能由艺参数的变化,导到PCB 阻抗发生变化.相对单端线来说,只要改变一下线宽就行.Allegro 软件里很容易改变差对 ...

  10. 差分 线宽 线距_如何更改已布好的差分线的线宽线距?

    板子已经布好了,但是做差分阻抗匹配时需要稍微调整下差分对的线宽线距,有什么方法可以很好的调整吗? 16.0之前的没有办法改! 回复 flyingc381 的帖子 之后的呢?我用的16.3 没有人了解吗 ...

最新文章

  1. animated bar chart race下载_下载腾讯会议
  2. 漂亮的HTML表格 - ebirdfighter的日志 - 网易博客
  3. 深度探索va_start、va_arg、va_end
  4. 熟悉linux的安全与优化
  5. LINUx打包命令汇总
  6. mysql主从不同步 tar_Mysql主从不同步问题处理案例
  7. RippleNet:知识图谱与推荐系统联合学习 CIKM 2018
  8. Python3爬虫入门之beautifulsoup库的使用
  9. ideadebug热更新_Spring Boot 在IDEA中debug时的hot deployment(热部署)
  10. 关于Unity中OnGUI()的简单使用
  11. 0配置EF连接MySql数据库_第八节:EF Core连接MySql数据库
  12. 带grub的软盘镜像制作
  13. 超好用的Redis管理及监控工具:TreeNMS
  14. 科三十六项操作方法指导
  15. JAVA_OPTS设置详解
  16. 罗格斯的计算机科学博士奖学金,本科直博如何“牛”转乾坤斩获全奖博士录取,师兄制胜申请经历大揭秘!...
  17. enigma机的原理
  18. 记一次npm安装依赖奇怪的gyp报python错误
  19. 拯救者15isk加装固态硬盘
  20. Windows电脑使用心得

热门文章

  1. 老版本xcode下载_下载xcode旧版历史版本
  2. cpu(s)和%CPU的的区别
  3. android 输入框失去焦点,AutoCompleteTextView默认首次失去焦点
  4. java判断map是否为空_Java自定义Exception
  5. js base64编码_使用psd.js将PSD转成SVG -- 基础篇(文字amp;图片)
  6. 云计算虚拟化之Docker上如何安装Mongodb?
  7. RPC框架dubbo架构原理及使用说明
  8. php+nginx环境 两错误解决
  9. 【iptables】编写iptables防火墙规则-2
  10. 数据安全超级守护进程