莫队30ptsTLE
查看原帖
莫队30ptsTLE
808180
HDS_Acenaphthylene楼主2024/4/16 16:08
#include<bits/stdc++.h>
using namespace std;
int unit;
struct q{
	int l, r, id, x;
	bool operator<(const q &x){
    if (l / unit != x.l / unit) return l < x.l;
    if ((l / unit) & 1) return r < x.r;
    return r > x.r;
  }
}qs[100005];
int cnt[100005], a[100005], b[200005], n, nn, qn, ans[100005];
signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	int t;
	cin >> t;
	while(t--) {
		memset(cnt, 0, sizeof cnt);
		cin >> n;
		for(int i = 1;i <= n;i ++)
			cin >> a[i], b[i] = a[i];
		cin >> qn;
		unit = sqrt(qn);
		sort(b + 1, b + 1 + n);
		for(int i = 1;i <= qn;i ++)
			cin >> qs[i].l >> qs[i].r >> qs[i].x, qs[i].id = i, qs[i].x = (b[lower_bound(b + 1, b + 1 + n, qs[i].x) - b] != qs[i].x) ? n + 1 :( lower_bound(b + 1, b + 1 + n, qs[i].x) - b);
		for(int i = 1;i <= n;i ++)
			a[i] = lower_bound(b + 1, b + n + 1, a[i]) - b;
//		for(int i = 1;i < qn;i ++)
//			qs[i].x = lower_bound(b, b + nn, qs[i].x) - b;
//		sort(qs + 1, qs + 1 + qn);
		int l = 1, r = 1;
		cnt[a[1]] ++;
		for(int i = 1;i <= qn;i ++) {
			while(l < qs[i].l)
				cnt[a[l ++]] --;
			while(r > qs[i].l)
				cnt[a[r --]] --;
			while(l > qs[i].l)
				cnt[a[-- l]] ++;
			while(r < qs[i].r)
				cnt[a[++ r]] ++;
			ans[qs[i].id] = cnt[qs[i].x];
		}
		for(int i = 1;i <= qn;i ++)
			cout << ans[i] << "\n";
		cnt[a[1]] = 0;
	}
}
2024/4/16 16:08
加载中...