萌新妹子刚学 OI 求助 P1972
查看原帖
萌新妹子刚学 OI 求助 P1972
489394
_Error_楼主2021/4/13 22:23

TLE on #10

话说主席树的复杂度是对的吧,为啥也要卡

#include <cstdio>

#define maxn 1000005

inline char nc () {  
    static char buf[1 << 21], *p1 = buf, *p2 = buf;
    return p1 == p2 && (p2 = (p1 = buf) + fread (buf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++;
}

#define nc getchar

inline int read () {
    register int x(0), f(1); char ch = nc ();
    while (ch < '0' || ch > '9') {if (ch == '-') f = ~f +1; ch = nc ();}
    while (ch >= '0' && ch <= '9') {x = (x<<3) + (x<<1) + (ch^48); ch = nc ();}
    return x * f;
}

inline void write(int X)
{
	if(X<0) {X=~(X-1); putchar('-');}
	if(X>9) write(X/10);
	putchar(X%10+'0');
}

struct tree{
	int l, r, val;
}hjt[maxn * 22];

int top, n, m, a[maxn], root[maxn], next[maxn], head[maxn];

inline void change(int l, int r, int last, int &now, int k){
	hjt[now = ++top] = hjt[last];
	hjt[now].val++;
	if(l == r) return;
	register int mid = l + r >> 1;
	if(k <= mid) change(l, mid, hjt[last].l, hjt[now].l, k);
	else change(mid + 1, r, hjt[last].r, hjt[now].r, k); 
}

inline int ask(int l, int r, int L, int R, int k){
	if(l == r) return hjt[R].val - hjt[L].val;
	register int mid = l + r >> 1;
	if(k <= mid) return ask(l, mid, hjt[L].l, hjt[R].l, k) + hjt[hjt[R].r].val - hjt[hjt[L].r].val;
	else return ask(mid + 1, r, hjt[L].r, hjt[R].r, k);
}

int main(){
	scanf("%d",&n);
	for(register int i = 1; i <= n; i++){
		a[i] = read();
		if(head[a[i]]) next[head[a[i]]] = i;
		head[a[i]] = i;
	}
	for(register int i = 1; i <= n; i++){
		if(!next[i]) next[i] = n + 1;
		change(1, n + 1, root[i-1], root[i], next[i]);
    }
	scanf("%d",&m);
	for(register int i = 1, start, end; i <= m; i++){
		start = read(), end = read();
		write(ask(1, n + 1, root[start-1], root[end], end + 1));
		puts("");
	}
	return 0;
}
2021/4/13 22:23
加载中...