TLE求助
查看原帖
TLE求助
310790
RYANGSJ楼主2022/4/5 18:22

RT,为什么会TLE?

#include<bits/stdc++.h>
#define int long long
#define end putchar('\n')
#define space putchar(' ')
using namespace std;
int n,a[2000005],q,bl[2000005],h,t[2000005],ans,out[2000005];
struct PIII{
    int first,second,id;
}p[2000005];
inline int read(){
    register char ch=getchar();
    register int f=1,res=0;
    while(ch<'0'||ch>'9'){
        if(ch=='-')f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9'){
        res*=10;
        res+=(ch-'0');
        ch=getchar();
    }
    return res*f;
}
inline void write(register int x){
    if(x<0){
        putchar('-');
        x=-x;
    }
    if(x<=9){
        putchar(x+'0');
    }else{
        write(x/10);
        putchar(x%10+'0');
    }
}
inline bool cmp(register PIII x,register PIII y){
    if(bl[x.first]==bl[y.second]){
        if(x.first&1){
            return x.second<y.second;
        }else{
            return x.second>y.second;
        }
    }return x.first<y.first;
}
inline void del(register int x){
    t[a[x]]--;
    if(!t[a[x]])ans--;
}
inline void add(register int x){
    if(!t[a[x]])ans++;
    t[a[x]]++;
}
signed main(){
    n=read();
    for(register int i=1;i<=n;i++){
        a[i]=read();
    }
    q=read();
    for(register int i=1;i<=q;i++){
        p[i].first=read(),p[i].second=read();
        p[i].id=i;
    }
    register int h=sqrt(n);
    for(int i=1;i<=n;i++){
        bl[i]=i/h+1;
    }
    sort(p+1,p+1+q,cmp);
    register int l=1,r=1;
    ans=1,t[a[1]]=1;
    for(register int i=1;i<=q;i++){
        int ll=p[i].first,rr=p[i].second;
        while(r<rr)r++,add(r);
        while(r>rr)del(r),r--;
        while(l<ll)del(l),l++;
        while(l>ll)l--,add(l);
        out[p[i].id]=ans;
    }
    for(register int i=1;i<=q;i++){
        write(out[i]),end;
    }
    return 0;
}
2022/4/5 18:22
加载中...