我是靠谱客的博主 魁梧黄豆,最近开发中收集的这篇文章主要介绍Codeforces Round #136 (Div. 1) B. Little Elephant and Array(简单莫队),觉得挺不错的,现在分享给大家,希望可以做个参考。
概述
题意:给你n个数,m次询问,每次询问一个区间[l, r],问这个区间内元素出现个数等于元素本身的有几个。(n, m <= 1e5)
思路:裸的莫队,因为每个数比较大,离散化下就好了。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+5;
int n, m, unit, tmp;
int a[maxn], aa[maxn], Hash[maxn];
int num[maxn], ans[maxn];
struct node
{
int id, l, r, blk;
bool operator <(const node &a) const
{
if(blk == a.blk) return r < a.r;
else return blk < a.blk;
}
}op[maxn];
void add(int id)
{
num[aa[id]]++;
if(num[aa[id]] == a[id]) tmp++;
if(num[aa[id]] == a[id]+1) tmp--;
}
void del(int id)
{
num[aa[id]]--;
if(num[aa[id]] == a[id]) tmp++;
if(num[aa[id]] == a[id]-1) tmp--;
}
void solve()
{
tmp = 0;
memset(num, 0, sizeof(num));
int l = 1, r = 0;
for(int i = 1; i <= m; i++)
{
while(r < op[i].r) add(++r);
while(r > op[i].r) del(r--);
while(l < op[i].l) del(l++);
while(l > op[i].l) add(--l);
ans[op[i].id] = tmp;
}
for(int i = 1; i <= m; i++)
printf("%dn", ans[i]);
}
int main(void)
{
while(cin >> n >> m)
{
unit = (int)sqrt(n);
for(int i = 1; i <= n; i++)
scanf("%d", &a[i]), Hash[i] = a[i];
sort(Hash+1, Hash+1+n);
int d = unique(Hash+1, Hash+1+n)-Hash-1;
for(int i = 1; i <= n; i++)
aa[i] = lower_bound(Hash+1, Hash+1+d, a[i])-Hash;
for(int i = 1; i <= m; i++)
scanf("%d%d", &op[i].l, &op[i].r), op[i].id = i, op[i].blk = op[i].l/unit;
sort(op+1, op+1+m);
solve();
}
return 0;
}
最后
以上就是魁梧黄豆为你收集整理的Codeforces Round #136 (Div. 1) B. Little Elephant and Array(简单莫队)的全部内容,希望文章能够帮你解决Codeforces Round #136 (Div. 1) B. Little Elephant and Array(简单莫队)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复