线段树大水题,我样例都没过哦!
查看原帖
线段树大水题,我样例都没过哦!
658786
STUDENT00楼主2022/10/21 20:26

哪位大佬帮我这位蒟蒻(菜鸟(小白))调调?

#include<bits/stdc++.h>
using namespace std;
int n,m,a[1000010],now=1,t[1000010],ans[1000010];
int tree[4000010];
struct node{
    int k,l,r;
} st[1000010];
bool cmp(node a,node b){
    return a.r<b.r;
}
void update(int l,int r,int rt,int a,int b){
    if(l==r){
        tree[rt]+=b;
        return;
    }
    int mid=(l+r)>>1;
    if(a<=mid) update(l,mid,rt<<1,a,b);
    else update(mid+1,r,rt<<1|1,a,b);
    tree[rt]=tree[rt<<1]+tree[rt<<1|1];
    return;
}
int query(int l,int r,int rt,int a,int b){
    if(a<=l&&b>=r) return tree[rt];
    int mid=(l+r)>>1,sum=0;
    if(a<=mid) sum+=query(l,mid,rt<<1,a,b);
    if(b>mid) sum+=query(mid+1,r,rt<<1|1,a,b);
    return sum;
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    scanf("%d",&m);
    for(int i=1;i<=m;i++){
    	st[i].k=i;
    	scanf("%d%d",&st[i].l,&st[i].r);
	}
    sort(st+1,st+m+1,cmp);
    for(int i=1;i<=m;i++){
        while(now<=st[i].r){
            if(t[a[now]]) update(1,m,1,t[a[now]],-1);
            update(1,m,1,i,1);
            t[a[now]]=i;
            now++;
        }
        ans[st[i].k]=query(1,m,1,st[i].l,st[i].r);
    }
    for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
    return 0;
}
2022/10/21 20:26
加载中...