给定一个数列 A = ( a 1 , a 2 , ⋯ , a n ) A=\left(a_{1}, a_{2}, \cdots, a_{n}\right) A=(a1,a2,⋯,an), 给出若干询问, 每次询问某个区间 [ l i , r i ] \left[l_{i}, r_{i}\right] [li,ri] 内恰好出现 k i k_{i} ki次的数有多少个。
输入第一行包含一个整数 n n n 表示数列长度。
第二行包含 n n n 个整数 a 1 , a 2 , ⋯ , a n a_{1}, a_{2}, \cdots, a_{n} a1,a2,⋯,an , 表示数列中的数。
第三行包含一个整数 m m m 表示询问次数。
接下来 m m m 行描述询问, 其中第 i i i 行包含三个整数 l i , r i , k i l_{i}, r_{i}, k_{i} li,ri,ki表示询问 [ l i , r i ] \left[l_{i}, r_{i}\right] [li,ri] 区 间内有多少数出现了 k i k_{i} ki次。
输出 m m m 行, 分别对应每个询问的答案。
3
1 2 2
5
1 1 1
1 1 2
1 2 1
1 2 2
1 3 2
1
0
2
0
1
1 ≤ n , m ≤ 100000 , 1 ≤ a 1 , a 2 , ⋯ , a n ≤ 100000 , 1 ≤ l i ≤ r i ≤ n , 1 ≤ k i ≤ n 。 1≤n,m≤100000,1≤a1 ,a2 ,⋯,an≤100000,1≤li≤ r_{i} \leq n, 1 \leq k_{i} \leq n_{\text {。 }} 1≤n,m≤100000,1≤a1,a2,⋯,an≤100000,1≤li≤ri≤n,1≤ki≤n。 。
莫队的模板题,学过的能一眼看出来,没学过下面链接跳转学习一下:
莫队
#include
using namespace std;
typedef long long LL;
typedef unsigned long long uLL;
typedef pair<int, int> PII;
#define pb(s) push_back(s);
#define SZ(s) ((int)s.size());
#define ms(s,x) memset(s, x, sizeof(s))
#define all(s) s.begin(),s.end()
const int inf = 0x3f3f3f3f;
const int mod = 1000000007;
const int N = 200010;
// 莫队
int n, q, c[N], cnt[N], freq[N], ans[N];
int sq;
struct query
{
int l, r, k, id;
bool operator<(const query &o) const
{
if (l / sq != o.l / sq)
return l < o.l;
if (l / sq & 1)
return r < o.r;
return r > o.r;
}
} que[N];
void add(int x) {
cnt[freq[c[x]]]--;
freq[c[x]]++;
cnt[freq[c[x]]]++;
};
void del (int x) {
cnt[freq[c[x]]]--;
freq[c[x]]--;
cnt[freq[c[x]]]++;
};
void solve()
{
cin >> n;
sq = sqrt(n);
for (int i = 1; i <= n; ++i) {
cin >> c[i];
}
cin >> q;
for (int i = 0; i < q; ++i) {
int l, r, k;
cin >> l >> r >> k;
que[i] = {l, r, k, i};
}
int B = 500;
sort(que, que + q);
int l = 1, r = 0;
for (int i = 0; i < q; ++i) {
while (r < que[i].r) r++, add(r);
while (l > que[i].l) l--, add(l);
while (r > que[i].r) del(r), r--;
while (l < que[i].l) del(l), l++;
ans[que[i].id] = cnt[que[i].k];
}
for (int i = 0; i < q; ++i) {
cout << ans[i] << '\n';
}
}
int main()
{
ios_base :: sync_with_stdio(false);
cin.tie(nullptr);
int t = 1;
while (t--)
{
solve();
}
return 0;
}