主席树TLE(#9#10)
查看原帖
主席树TLE(#9#10)
319658
謝腾飞楼主2021/8/31 14:02

实在调不出来,救救孩子...

#include<iostream>
using namespace std;
const int N=1e6+5,M=1e6;
int a[N],before[N];
int root[N],idx;
int read(){
    char x;
    while((x = getchar()) > '9' || x < '0') ;
    int u = x - '0';
    while((x = getchar()) <= '9' && x >= '0') u = (u << 3) + (u << 1) + x - '0';
    return u;
}
struct node{
	int l,r;
	int sum;
}tr[N*50];
void pushup(int u){
	tr[u].sum=tr[tr[u].l].sum+tr[tr[u].r].sum;
}
void insert(int p,int &q,int l,int r,int c,int x){
	q=++idx;
	tr[q]=tr[p];
	if(l==r){
		tr[q].sum=c;
		return;
	}
	int mid=l+r>>1;
	if(x<=mid) insert(tr[p].l,tr[q].l,l,mid,c,x);
	else insert(tr[p].r,tr[q].r,mid+1,r,c,x);
	pushup(q); 
}
int ask(int p,int l,int r,int trL,int trR){
	if(trL>=l&&trR<=r){
		return tr[p].sum;
	}
	int mid=trL+trR>>1;
	int res=0;
	if(l<=mid) res+=ask(tr[p].l,l,r,trL,mid);
	if(r>mid) res+=ask(tr[p].r,l,r,mid+1,trR);
	return res;
}
int main(){
	int n,m;
	n=read();
	for(int i=1;i<=n;++i){
		a[i]=read();
		if(!before[a[i]]){
			insert(root[i-1],root[i],1,M,1,i);
		}
		else{
			int t;
			insert(root[i-1],t,1,M,0,before[a[i]]);
			insert(t,root[i],1,M,1,i);
		}
		before[a[i]]=i;
	}
	m=read();
	while(m--){
		int l,r;
		l=read();r=read();
		printf("%d\n",ask(root[r],l,r,1,M));
	}
	return 0;
}
2021/8/31 14:02
加载中...