60pts 怎么优化
查看原帖
60pts 怎么优化
956406
zly_love_ts楼主2024/8/29 21:25
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+7;

int n,m;
int num[N],cnt[1000007],out[N*4];

struct Query{
    int l,r;
    int id;
}q[N*4];

int len;

bool cmp(Query x,Query y){
    if(x.l/len==y.l/len){
        if(x.l/len%2){
            return x.r<y.r;
        }
        return x.r>y.r;
    }
    else{
        return x.l<y.l;
    }
}

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;
}

int main()
{
    read(n);
    for(int i=1;i<=n;i++){
        read(num[i]);
    }
    read(m);
    len=n/sqrt(m);
    for(int i=0;i<m;i++){
        read(q[i].l);
        read(q[i].r);
        q[i].id=i;
    }
    sort(q,q+m,cmp);
    int ll=1,rr=1;
    int ans=1;
    cnt[num[ll]]++;
    for(int i=0;i<m;i++){
        while(rr<q[i].r){
            rr++;
            cnt[num[rr]]++;
            if(cnt[num[rr]]==1){
                ans++;
            }
        }
        while(rr>q[i].r){
            cnt[num[rr]]--;
            if(cnt[num[rr]]==0){
                ans--;
            }
            rr--;
        }
        while(ll>q[i].l){
            ll--;
            cnt[num[ll]]++;
            if(cnt[num[ll]]==1){
                ans++;
            }
        }
        while(ll<q[i].l){
            cnt[num[ll]]--;
            if(cnt[num[ll]]==0){
                ans--;
            }
            ll++;
        }
        out[q[i].id]=ans;
    }
    for(int i=0;i<m;i++){
        printf("%d\n",out[i]);
    }
    return 0;
}

2024/8/29 21:25
加载中...