萌新求助莫队
查看原帖
萌新求助莫队
224663
kintsgi楼主2021/7/13 14:51

很多人好像都用莫队卡过了,求助

#include <bits/stdc++.h>
#define int long long

using namespace std;

int n, m;
const int maxn = 2e6;
struct Node { int block, l, r, id; } q[maxn];
int a[maxn], cnt[maxn], answer[maxn];
int ans;

inline int read(){
	int x = 0, f = 1;
	char ch = getchar();
	while (! isdigit(ch)) {if (ch == '-') f = -1; ch = getchar();}
	while (isdigit(ch)){x = x * 10 + ch - 48; ch = getchar();}
	return x * f;
}

inline void write(int x) {
    if(x > 9) write(x / 10);
    putchar(x % 10 + '0');
}

inline bool cmp(Node x, Node y) {
	if (x.block != y.block) return x.block < y.block;
	if (x.block & 1) return x.r < y.r;
	else return x.r > y.r;
}
	
inline void Delete(int x) {
	cnt[a[x]] --;
	if (cnt[a[x]] == 0) ans --;
}

inline void Add(int x) {
	cnt[a[x]] ++;
	if (cnt[a[x]] == 1) ans ++;
}

signed main() {
    
    n = read();
	
	for (int i = 1; i <= n; i ++) a[i] = read(); 
	
	m = read();
	
	int block = sqrt(n) + 900;
	
	for (int i = 1; i <= m; i ++) {
		q[i].l = read(), q[i].r = read();
		q[i].id = i;
		q[i].block = (q[i].l - 1) / block + 1;
	}
	
	sort(q + 1, q + m + 1, cmp);
	
	int l = 0, r = 0;
	int L, R;
	
	for (int i = 1; i <= m; i ++) {
		L = q[i].l;
		R = q[i].r;
		
		while (r > R) Delete(r --);
		while (r < R) Add(++ r);  
		
		while (l < L) Delete(l ++);
		while (l > L) Add(-- l);  
		
		answer[q[i].id] = ans;
	}
	
	for (int i = 1; i <= m; i ++) {
	    write(answer[i]);
	    printf("\n");
	}
}
2021/7/13 14:51
加载中...