20ptsWA 求调
查看原帖
20ptsWA 求调
685964
shuqiang楼主2024/12/11 14:02
#include<iostream>

using namespace std;

const int N = 1e4 + 5e3 + 10, M = 13, inf = 1e9;
int t, n, q, wl, wr, a[N], r[N], rn[M], nxt[N][M], cnt = 0;

int read_int(){
    int x = 0; char ch = ' '; while(!isdigit(ch)) ch = getchar();
    while(isdigit(ch)) {x = x * 10 + ch - '0'; ch = getchar();} return x;
}

int main(){
	t = read_int();
	while(t--){
		for(int i = 0; i < M; i++) rn[i] = inf;
		n = read_int();
		for(int i = 1; i <= n; i++){
			a[i] = read_int();
			if(rn[a[i]] != inf){
				r[rn[a[i]]] = i;
			}
			r[i] = inf; rn[a[i]] = i;
		}
		for(int i = 1; i <= n; i++) nxt[i][0] = r[i];
		for(int i = 1; i < M; i++){
			for(int j = 1; j <= n; j++){
				if(nxt[j][i-1]+1 > n) nxt[j][i] = inf;
				else nxt[j][i] = nxt[nxt[j][i-1]+1][i-1];
			}
		}
		q = read_int();
		while(q--){
			wl = read_int(); wr = read_int();
			cnt = 0;
			for(int i = wl; i <= wr;){
				if(r[i] > wr){
					cnt++; i++;
					continue;
				}
				for(int j = M-1; j >= 0; j--){
					if(nxt[i][j] <= wr) i = nxt[i][j] + 1;
				}
			}
			cout << cnt << '\n';
		}
	}
	return 0;
} 
2024/12/11 14:02
加载中...