牛客网多校训练第一场 J - Different Integers(树状数组 + 问题转换)
链接:
https://www.nowcoder.com/acm/contest/139/J
题意:
给出n个整数的序列a(1≤ai≤n)和q个询问(1≤n,q≤1e5),每个询问包含两个整数L和R(1≤L,R≤n)。
对于每个询问,输出a[1...L]和a[R...n]的不同数字的个数。
分析:
将原数组复制一份拼接到末尾,把询问a[1...L]和a[R...n]转换为询问a[R...L+n]。
设kind[i]为a[1...i]出现的数字种类,
则询问a[L...R]的答案为 kind[R] - kind[L-1] +(a[1...L-1]和a[L...R]同时出现的数字种类)。
可以用树状数组维护a[1...L-1]和a[L...R]同时出现的数字种类。
如果a[i]在区间1...L-1出现过,则对应的树状数组位置的值应为1。查询时只需查询区间L...R。
可以对询问区间按左端点排序,左端点每次右移时把对应的数的下一个位置在树状数组里加1即可。
代码:
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std; const int MAXS = 1e6 + ;
int sf[MAXS];
void add(int p, int v, int n) {
while(p <= n) sf[p] += v, p += p&-p;
}
int sum(int p) {
int res = ;
while(p) res += sf[p], p -= p&-p;
return res;
} struct REGION {
int L, R, id;
bool operator < (const REGION& that) const {
return L < that.L;
}
} r[MAXS];
int a[MAXS], kind[MAXS], nxt[MAXS], rec[MAXS], ans[MAXS]; int main() {
int n, q;
while(~scanf("%d%d", &n, &q)) {
for(int i = ; i <= n; i++) scanf("%d", &a[i]);
for(int i = ; i < q; i++) {
scanf("%d%d", &r[i].R, &r[i].L);
r[i].R += n;
r[i].id = i;
}
memcpy(a+n+, a+, n*sizeof(int));
n *= ;
memset(rec, false, sizeof(rec));
for(int i = ; i <= n; i++) {
if(rec[a[i]]) kind[i] = kind[i-];
else kind[i] = kind[i-] + , rec[a[i]] = true;
}
memset(rec, false, sizeof(rec));
for(int i = n; i > ; i--) {
nxt[i] = rec[a[i]];
rec[a[i]] = i;
}
sort(r, r + q);
memset(sf, , sizeof(sf));
for(int p = , i = ; i < q; i++) {
while(p < r[i].L) add(nxt[p], , n), p++;
ans[r[i].id] = kind[r[i].R]-kind[r[i].L-] + sum(r[i].R)-sum(r[i].L-);
}
for(int i = ; i < q; i++) printf("%d\n", ans[i]);
}
return ;
}
牛客网多校训练第一场 J - Different Integers(树状数组 + 问题转换)的更多相关文章
- 牛客网多校第5场 H subseq 【树状数组+离散化】
题目:戳这里 学习博客:戳这里 题意:给n个数为a1~an,找到字典序第k小的序列,输出该序列所有数所在位置. 解题思路:先把所有序列预处理出来,方法是设一个数组为dp,dp[i]表示以i为开头的序列 ...
- 牛客网多校第5场 I vcd 【树状数组+离散化处理】【非原创】
题目:戳这里 学习博客:戳这里 作者:阿狸是狐狸啦 n个点,一个点集S是好的,当且仅当对于他的每个子集T,存在一个右边无限延长的矩形,使的这个矩形包含了T,但是和S-T没有交集. 求有多少个这种集合. ...
- 牛客网多校训练第一场 I - Substring(后缀数组 + 重复处理)
链接: https://www.nowcoder.com/acm/contest/139/I 题意: 给出一个n(1≤n≤5e4)个字符的字符串s(si ∈ {a,b,c}),求最多可以从n*(n+1 ...
- 牛客网多校训练第一场 F - Sum of Maximum(容斥原理 + 拉格朗日插值法)
链接: https://www.nowcoder.com/acm/contest/139/F 题意: 分析: 转载自:http://tokitsukaze.live/2018/07/19/2018ni ...
- 牛客网多校训练第一场 E - Removal(线性DP + 重复处理)
链接: https://www.nowcoder.com/acm/contest/139/E 题意: 给出一个n(1≤n≤1e5)个整数(范围是1至10)的序列,求从中移除m(1≤m≤min(n-1, ...
- 牛客网多校训练第一场 D - Two Graphs
链接: https://www.nowcoder.com/acm/contest/139/D 题意: 两个无向简单图都有n(1≤n≤8)个顶点,图G1有m1条边,图G2有m2条边,问G2有多少个子图与 ...
- 牛客网多校训练第一场 B - Symmetric Matrix(dp)
链接: https://www.nowcoder.com/acm/contest/139/B 题意: 求满足以下条件的n*n矩阵A的数量模m:A(i,j) ∈ {0,1,2}, 1≤i,j≤n.A(i ...
- 牛客网多校训练第一场 A - Monotonic Matrix(Lindström–Gessel–Viennot lemma)
链接: https://www.nowcoder.com/acm/contest/139/A 题意: 求满足以下条件的n*m矩阵A的数量模(1e9+7):A(i,j) ∈ {0,1,2}, 1≤i≤n ...
- 牛客网多校训练第二场D Kth Minimum Clique
链接:https://ac.nowcoder.com/acm/contest/882/D来源:牛客网 Given a vertex-weighted graph with N vertices, fi ...
随机推荐
- Firebird Internal Function
火鸟自定义内置函数,方便.强大. 特点:只可以返回单值,不能返回多行. 若想返回多行table,可以定义存储过程 Procedure,用suspend返回. 自定义内置函数,示例:返回当前批次号. c ...
- MVVM - 事件转命令2
在使用MVVM模式时, 按照模式的规则是尽量不直接使用事件. 所以对于以前一直使用事件模式的同行来说确实有点头疼. 还好微软给我们提供了几种间接使用事件(命令)的方法, 下面我就来看看这几种方法: I ...
- 自动收缩数据库T-SQL
alter database 数据库名 set auto_update_statistics off alter database 数据库名 set auto_update_statistics on
- mysql表锁、行锁、索引之间暧昧的关系
MySQL的innodb存储引擎支持行级锁,innodb的行锁是通过给索引项加锁实现的,这就意味着只有通过索引条件检索数据时,innodb才使用行锁,否则使用表锁.根据当前的数据更新语句(UPDATE ...
- 多个tomcat配置
在centos7.3下搭建jenkins自动部署环境,需要一个tomcat来启动jenkins,另一个用来自动部署的位置,因此需要两个tomcat同时运行,并且在自动构建后能够启动项目,又不会关闭je ...
- 插入排序——Python实现
一.排序思想 排序思想参见:https://www.cnblogs.com/luomeng/p/10583124.html 二.python实现 def InsertSort(arrs): " ...
- 一、python简单爬取静态网页
一.简单爬虫框架 简单爬虫框架由四个部分组成:URL管理器.网页下载器.网页解析器.调度器,还有应用这一部分,应用主要是NLP配合相关业务. 它的基本逻辑是这样的:给定一个要访问的URL,获取这个ht ...
- sql:查询创建表的结构
--显示所有用户表: --1 SELECT SCHEMA_NAME(schema_id) As SchemaName , name As TableName from sys.tables ORDER ...
- Python入门-生成器和生成器表达式
昨天我们说了迭代器,那么和今天说的生成器是什么关系呢? 一.生成器 什么是生成器?说白了生成器的本质就是迭代器. 在Python中中有三种方式来获取生成器. 1.通过生成器函数 2.通过各种推导式来实 ...
- ASP.NET内容页中访问母版页中的对象
在ASP.NET2.0开始,提供了母版页的功能.母版页由一个母版页和多个内容页构成.母版页的主要功能是为ASP.NET应用程序中的页面创建相同的布局和界面风格.母版页的使用与普通页面类似,可以在其中放 ...