主席树92pts tle9,10求助
查看原帖
主席树92pts tle9,10求助
830714
7y29楼主2024/1/10 14:55
#include <bits/stdc++.h>
using namespace std;
//#define int long long
typedef pair<int,int> PII;
const  int N=1e6+10;
struct node{
    int l,r,cnt;
}tr[N<<5];
inline void read(int &x){
	char ch=getchar();int f=1;x=0;
	while(!isdigit(ch) && ch^'-') ch=getchar();
	if(ch=='-') f=-1,ch=getchar();
	while(isdigit(ch)) x=x*10+ch-'0',ch=getchar();
	x*=f;
}
void write(int x){
    if(x<0)
        putchar('-'),x=-x;
    if(x>9)
        write(x/10);
    putchar(x%10+'0');
    return;
}
int root[N];
int tot;
int insert(int p,int l,int r,int x,int v){
    int q=++tot;
    tr[q]=tr[p];
    tr[q].cnt+=v;
    if(l==r){
        return q;
    }
    int mid=(l+r)>>1;
    if(x<=mid){
        tr[q].l=insert(tr[q].l,l,mid,x,v);
    }else{
        tr[q].r=insert(tr[q].r,mid+1,r,x,v);
    }
    return q;
}
int query(int p,int ll,int rr,int l,int r){
    if(ll>=l&&rr<=r){
        return tr[p].cnt;
    }
    int mid=(ll+rr)>>1;
    int ans=0;
    if(l<=mid)ans+=query(tr[p].l,ll,mid,l,r);
    if(r>mid)ans+=query(tr[p].r,mid+1,rr,l,r);
    return ans;
}
int main(){
    //ios::sync_with_stdio(false);
   // cin.tie(0);cout.tie(0);
   int n,m;
    read(n);
    unordered_map<int,int>mp;
    //root[0]=build(1,n); 
    for(int i=1;i<=n;i++){
        int x;
        read(x);
        root[i]=insert(root[i-1],1,n,i,1);
        if(mp.count(x)){
            root[i]=insert(root[i],1,n,mp[x],-1);
        }
        mp[x]=i;
    }
    read(m);
    for(int i=1;i<=m;i++){
        int l,r;
       read(l);read(r);
         write(query(root[r],1,n,l,r));
         puts("");
    }
}

2024/1/10 14:55
加载中...