2019CCPC湘潭邀请赛 Chika and Friendly Pairs(莫队+树状数组)

2024-04-16 01:18

本文主要是介绍2019CCPC湘潭邀请赛 Chika and Friendly Pairs(莫队+树状数组),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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湖南全国邀请赛(广东省赛、江苏省赛)重现赛

题意: 询问某个区间内差值不大于k的数对数目。
思路:
莫队算法就是双指针加排序,通过分块,按块排序,块内排右指针。
由此在块的内部相邻左端点变化最大为 n \sqrt n n ,而右端点是单调的,可以不计。
那么m次询问均摊下来最大 m n m\sqrt n mn ,观察n和m的范围,越为3e4,莫队可行!

我们用双指针维护到当前询问区间,区间变化对答案的影响可以用树状数组记录。
这类似与逆序对,你求与x差距不大于k的数,就是 s u m ( x + k ) − s u m ( x − k − 1 ) sum(x + k) - sum(x - k - 1) sum(x+k)sum(xk1)
当然,数字很大,再离散化一遍就好了。

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>using namespace std;const int maxn = 1e5 + 7;struct Query {int l,r,id;
}q[maxn];int a[maxn];
int t[maxn],tot,cnt,sqr;
int L,R,num,ans[maxn];
int mp[maxn][2];
int c[maxn];void init() {sort(t + 1,t + 1 + tot);cnt = unique(t + 1,t + 1 + tot) - t - 1;
}int Find(int x) {return lower_bound(t + 1,t + 1 + cnt,x) - t;
}int cmp(Query a,Query b) {return a.l / sqr == b.l / sqr ? a.r < b.r : a.l < b.l;
}void add(int x,int v) {while(x < maxn) {c[x] += v;x += x & (-x);}
}int sum(int x) {int res = 0;while(x) {res += c[x];x -= x & (-x);}return res;
}void Add(int x) {num += sum(mp[a[x]][1]) - sum(mp[a[x]][0]);add(a[x],1);
}void Del(int x) {add(a[x],-1);num -= sum(mp[a[x]][1]) - sum(mp[a[x]][0]);
}int main() {int n,m,k;scanf("%d%d%d",&n,&m,&k);for(int i = 1;i <= n;i++) {scanf("%d",&a[i]);t[++tot] = a[i];t[++tot] = a[i] - k - 1;t[++tot] = a[i] + k;}init();for(int i = 1;i <= m;i++) {scanf("%d%d",&q[i].l,&q[i].r);q[i].id = i;}for(int i = 1;i <= n;i++) {int now = Find(a[i]);mp[now][0] = Find(a[i] - k - 1);mp[now][1] = Find(a[i] + k);a[i] = now;}sqr = sqrt(n);sort(q + 1,q + 1 + m,cmp);L = 1,R = 0;for(int i = 1;i <= m;i++) {int l = q[i].l,r = q[i].r;int id = q[i].id;while(L < l) {Del(L++);}while(L > l) {Add(--L);}while(R < r) {Add(++R);}while(R > r) {Del(R--);}ans[id] = num;}for(int i = 1;i <= m;i++) {printf("%d\n",ans[i]);}return 0;
}

这篇关于2019CCPC湘潭邀请赛 Chika and Friendly Pairs(莫队+树状数组)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


原文地址:
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.chinasem.cn/article/907434

相关文章

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问

MySQL查询JSON数组字段包含特定字符串的方法

《MySQL查询JSON数组字段包含特定字符串的方法》在MySQL数据库中,当某个字段存储的是JSON数组,需要查询数组中包含特定字符串的记录时传统的LIKE语句无法直接使用,下面小编就为大家介绍两种... 目录问题背景解决方案对比1. 精确匹配方案(推荐)2. 模糊匹配方案参数化查询示例使用场景建议性能优

关于集合与数组转换实现方法

《关于集合与数组转换实现方法》:本文主要介绍关于集合与数组转换实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、Arrays.asList()1.1、方法作用1.2、内部实现1.3、修改元素的影响1.4、注意事项2、list.toArray()2.1、方

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

JAVA数组中五种常见排序方法整理汇总

《JAVA数组中五种常见排序方法整理汇总》本文给大家分享五种常用的Java数组排序方法整理,每种方法结合示例代码给大家介绍的非常详细,感兴趣的朋友跟随小编一起看看吧... 目录前言:法一:Arrays.sort()法二:冒泡排序法三:选择排序法四:反转排序法五:直接插入排序前言:几种常用的Java数组排序

Java数组初始化的五种方式

《Java数组初始化的五种方式》数组是Java中最基础且常用的数据结构之一,其初始化方式多样且各具特点,本文详细讲解Java数组初始化的五种方式,分析其适用场景、优劣势对比及注意事项,帮助避免常见陷阱... 目录1. 静态初始化:简洁但固定代码示例核心特点适用场景注意事项2. 动态初始化:灵活但需手动管理代

C++中初始化二维数组的几种常见方法

《C++中初始化二维数组的几种常见方法》本文详细介绍了在C++中初始化二维数组的不同方式,包括静态初始化、循环、全部为零、部分初始化、std::array和std::vector,以及std::vec... 目录1. 静态初始化2. 使用循环初始化3. 全部初始化为零4. 部分初始化5. 使用 std::a

shell编程之函数与数组的使用详解

《shell编程之函数与数组的使用详解》:本文主要介绍shell编程之函数与数组的使用,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录shell函数函数的用法俩个数求和系统资源监控并报警函数函数变量的作用范围函数的参数递归函数shell数组获取数组的长度读取某下的

C++原地删除有序数组重复项的N种方法

《C++原地删除有序数组重复项的N种方法》给定一个排序数组,你需要在原地删除重复出现的元素,使得每个元素只出现一次,返回移除后数组的新长度,不要使用额外的数组空间,你必须在原地修改输入数组并在使用O(... 目录一、问题二、问题分析三、算法实现四、问题变体:最多保留两次五、分析和代码实现5.1、问题分析5.

Java中数组转换为列表的两种实现方式(超简单)

《Java中数组转换为列表的两种实现方式(超简单)》本文介绍了在Java中将数组转换为列表的两种常见方法使用Arrays.asList和Java8的StreamAPI,Arrays.asList方法简... 目录1. 使用Java Collections框架(Arrays.asList)1.1 示例代码1.