比赛 NOIP2025模拟赛1 评测结果 AAAAAAAAAA
题目名称 接竹竿 最终得分 100
用户昵称 djyqjy 运行时间 0.351 s
代码语言 C++ 内存使用 5.46 MiB
提交时间 2025-11-24 09:44:52
显示代码纯文本
#include<bits/stdc++.h>
#define pir pair<int,int>
#define fi first
#define se second
#define pb push_back
#define mp make_pair
using namespace std;
inline int re()
{
    int f=1,num=0;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') num=num*10+c-'0',c=getchar();
    return num*f;
}
const int N=15010;
int T;
int n,q;
int a[N];
int nxt[N],pos[N];
pair<int,int> to[N][20]; //跳一次能到哪;中间有几个空缺
void clear()
{
    return;
}
void work()
{
    clear();
    n=re();
    for(int i=1;i<=n;i++) a[i]=re();
    for(int i=1;i<=13;i++) pos[i]=n+1;
    for(int i=n;i>=1;i--)
    {
        nxt[i]=pos[a[i]];
        pos[a[i]]=i;
    }
    // for(int i=1;i<=n;i++) cout<<nxt[i]<<' ';cout<<endl;
    for(int i=1;i<=n;i++)
    {
        int idx=n+1;
        for(int j=i;j<=n;j++)
        {
            if(nxt[j]<=n)
            {
                idx=j;
                break;
            }
        }
        if(idx==n+1) to[i][0]=mp(n+1,n-i+1);
        else to[i][0]=mp(nxt[idx],idx-i);
    }
    // for(int i=1;i<=n;i++) cout<<i<<' '<<to[i][0].fi<<' '<<to[i][0].se<<endl;
    for(int j=1;j<=18;j++)
    {
        for(int i=1;i<=n;i++)
        {
            if(to[i][j-1].fi+1>=n+1||to[to[i][j-1].fi+1][j-1].fi==n+1) to[i][j]=mp(n+1,n-i+1);
            else to[i][j]=mp(to[to[i][j-1].fi+1][j-1].fi,to[i][j-1].se+to[to[i][j-1].fi+1][j-1].se);
        }
    }
    // cout<<"********"<<to[2][1].fi<<' '<<to[2][1].se<<endl;
    q=re();
    for(int i=1,l,r;i<=q;i++)
    {
        l=re();r=re();
        int ans=0,now=l;
        for(int k=18;k>=0;k--)
        {
        // cout<<"***"<<k<<' '<<ans<<' '<<now<<endl;
            if(to[now][k].fi<=r) ans+=to[now][k].se,now=to[now][k].fi+1;
            if(now>r) break;
        }
        // cout<<"***"<<ans<<' '<<now<<endl;
        if(now<=r)
        {
            ans+=r-now+1;
            for(int j=now;j<=r;j++)
            {
                if(nxt[j]<=r) ans-=nxt[j]-j+1,j=nxt[j];
            }
        }
        printf("%d\n",ans);
    }
    return;
}
int main()
{
    freopen("bamboo.in","r",stdin);
    freopen("bamboo.out","w",stdout);
    T=re();
    while(T--) work();
    return 0;
}