更好的阅读体验

Portal

Portal1: Codeforces

Portal2: Luogu

Description

The Little Elephant loves playing with arrays. He has array \(a\), consisting of \(n\) positive integers, indexed from \(1\) to \(n\). Let's denote the number with index \(i\) as \(a_i\).

Additionally the Little Elephant has \(m\) queries to the array, each query is characterised by a pair of integers \(l_j\) and \(r_j (1 \le l_j \le r_j \le n)\). For each query \(l_j, r_j\) the Little Elephant has to count, how many numbers \(x\) exist, such that number \(x\) occurs exactly \(x\) times among numbers \(a_{l_j}, a_{l_j + 1}, \cdots , a_{r_j}\).

Help the Little Elephant to count the answers to all queries.

Input

The first line contains two space-separated integers \(n\) and \(m (1 \le n, m \le 105)\) - the size of array a and the number of queries to it. The next line contains \(n\) space-separated positive integers \(a_1, a_2, \cdots , a_n (1 \le ai \le 10^9)\). Next \(m\) lines contain descriptions of queries, one per line. The \(j\)-th of these lines contains the description of the \(j\)-th query as two space-separated integers \(l_j\) and \(r_j (1 \le l_j \le r_j \le n)\).

Output

In \(m\) lines print \(m\) integers - the answers to the queries. The \(j\)-th line should contain the answer to the \(j\)-th query.

Sample Input1

7 2
3 1 2 2 3 3 7
1 7
3 4

Sample Output

3
1

Description in Chinese

小象喜欢和数组玩。现在有一个数组\(a\),含有\(n\)个正整数,记第\(i\)个数为\(a_i\)。

现在有\(m\)个询问,每个询问包含两个正整数\(l_j\)和\(r_j (1 \le l_j \le r_j \le n)\),小象想知道在\(a_{l_j}到\)a_{r_j}\(之中有多少个数\)x\(,其出现次数也为\)x$。

Solution

我们先看题目,发现只有查询,没有修改,所以可以用普通的莫队解决。

题目中的\(a_i\)的范围是\(\in [1, 10^9]\),而数的总数的范围是\(\in [1, 10^5]\),所以当这个数大于\(10^5\)了,这个数就不可能为所求的\(x\)忽略这个数后就不用进行离散化了。

Code

#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cmath> using namespace std; const int MAXN = 100005;
int n, m, nowans, a[MAXN], bl[MAXN], ans[MAXN], cnt[MAXN];
struct node {
int l, r, id;
bool operator < (const node &x) const {//排序的规则
return bl[l] == bl[x.l] ? r < x.r : bl[l] < bl[x.l];
}
} info[MAXN];
inline void add(int x) {
if (a[x] > n) return ;//如果数值超了n的范围就退出
if (cnt[a[x]] == a[x]) nowans--;
cnt[a[x]]++;
if (cnt[a[x]] == a[x]) nowans++;
}
inline void dec(int x) {
if (a[x] > n) return ;
if (cnt[a[x]] == a[x]) nowans--;
cnt[a[x]]--;
if (cnt[a[x]] == a[x]) nowans++;
}
int main() {
scanf("%d%d", &n, &m);
int block = (int)sqrt(n);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
bl[i] = i / block;
}
for (int i = 1; i <= m; i++) {
scanf("%d%d", &info[i].l, &info[i].r);//莫队是离线算法,需要记录询问的左右端点
info[i].id = i;//记录每个询问的编号
}
sort(info + 1, info + m + 1);
memset(cnt, 0, sizeof(cnt));
int l = 1, r = 0;
for (int i = 1; i <= m; i++) {//莫队
while (l < info[i].l) dec(l++);
while (l > info[i].l) add(--l);
while (r < info[i].r) add(++r);
while (r > info[i].r) dec(r--);
ans[info[i].id] = nowans;
}
for (int i = 1; i <= m; i++)
printf("%d\n", ans[i]);
return 0;
}

『题解』Codeforces220B Little Elephant and Array的更多相关文章

  1. 『题解』洛谷P1063 能量项链

    原文地址 Problem Portal Portal1:Luogu Portal2:LibreOJ Portal3:Vijos Description 在\(Mars\)星球上,每个\(Mars\)人 ...

  2. 『Python』内存分析_list和array

    零.预备知识 在Python中,列表是一个动态的指针数组,而array模块所提供的array对象则是保存相同类型的数值的动态数组.由于array直接保存值,因此它所使用的内存比列表少.列表和array ...

  3. 『题解』Codeforces1142B Lynyrd Skynyrd

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Recently Lynyrd and Skynyrd went to a ...

  4. 『题解』Codeforces446C DZY Loves Fibonacci Numbers

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description In mathematical terms, the sequence \( ...

  5. 『题解』Codeforces1142A The Beatles

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description Recently a Golden Circle of Beetlovers ...

  6. 『题解』洛谷P1993 小K的农场

    更好的阅读体验 Portal Portal1: Luogu Description 小\(K\)在\(\mathrm MC\)里面建立很多很多的农场,总共\(n\)个,以至于他自己都忘记了每个农场中种 ...

  7. 『题解』洛谷P2296 寻找道路

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 在有向图\(\mathrm G\)中,每条边的长度均为\(1\),现给定起点和终点 ...

  8. 『题解』洛谷P1351 联合权值

    更好的阅读体验 Portal Portal1: Luogu Portal2: LibreOJ Description 无向连通图\(\mathrm G\)有\(n\)个点,\(n - 1\)条边.点从 ...

  9. 『题解』Codeforces656E Out of Controls

    更好的阅读体验 Portal Portal1: Codeforces Portal2: Luogu Description You are given a complete undirected gr ...

随机推荐

  1. Python3程序设计指南:01 过程型程序设计快速入门

    大家好,从本文开始将逐渐更新Python教程指南系列,为什么叫指南呢?因为本系列是参考<Python3程序设计指南>,也是作者的学习笔记,希望与读者共同学习. .py文件中的每个估计都是顺 ...

  2. JNDI-Injection-Exploit

    介绍 最近把自己之前写的JNDI注入利用工具改了一下push到了github,地址:https://github.com/welk1n/JNDI-Injection-Exploit,启动后这个工具开启 ...

  3. Podman 使用指南

    原文链接:Podman 使用指南 Podman 原来是 CRI-O 项目的一部分,后来被分离成一个单独的项目叫 libpod.Podman 的使用体验和 Docker 类似,不同的是 Podman 没 ...

  4. vue-cli中使用jquery

    一.安装依赖 npm install jquery --save 二.全局导入(必须先安装依赖) 第一步 在webpack.base.conf.js里加入(新版的可能找不到这个文件,你可以npm in ...

  5. Redis系列(一):Redis简介

    一.Redis概述 Redis是一个开源(遵循BSD协议)Key-Value数据结构的内存存储系统,用作数据库.缓存和消息代理.它支持5种数据结构:字符串string.哈希hash.列表list.集合 ...

  6. (未完)XSS漏洞实战靶场笔记

    记录下自己写的XSS靶场的write up,也是学习了常见xss漏洞类型的实战场景

  7. Circle Problem From 3Blue1Brown (分圆问题)

    Background\text{Background}Background Last night, lots of students from primary school came to our c ...

  8. [Luogu3878] [TJOI2010]分金币

    题目描述 现在有n枚金币,它们可能会有不同的价值,现在要把它们分成两部分,要求这两部分金币数目之差不超过1,问这样分成的两部分金币的价值之差最小是多少? 输入输出格式 输入格式: 每个输入文件中包含多 ...

  9. Hello World ! 节日快乐!

    节日快乐! 世界你好,Hello World Java public class HelloWorld{ public static void main(String[] args) { System ...

  10. 【Spring Cloud】全家桶介绍(一)

    一.微服务架构 1.微服务架构简介 1.1.分布式:不同的功能模块部署在不同的服务器上,减轻网站高并发带来的压力. 1.2.集群:多台服务器上部署相同应用构成一个集群,通过负载均衡共同向外提供服务. ...