记录编号 608636 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 轻重数字 最终得分 100
用户昵称 Gravatar梦那边的美好TT 是否通过 通过
代码语言 C++ 运行时间 33.587 s
提交时间 2025-10-28 16:56:03 内存使用 88.03 MiB
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
const int MOD=1000003;
const int MAXN=500010;
int n,ecnt;
int a[MAXN],f[MAXN],pre[MAXN],nxt[MAXN],lst[MAXN];
struct Evt{
    bool t;
    int y,l,r,v;
    bool operator<(const Evt& o)const{return y<o.y;}
}evts[MAXN<<2];
struct Dat{
    int mx,cnt;
    Dat(int m=0,int c=0):mx(m),cnt(c){}
    friend Dat operator+(const Dat& a,const Dat& b){
        Dat res;
        res.mx=max(a.mx,b.mx);
        res.cnt=0;
        if(res.mx==a.mx)res.cnt=(res.cnt+a.cnt)%MOD;
        if(res.mx==b.mx)res.cnt=(res.cnt+b.cnt)%MOD;
        return res;
    }
};
struct Seg{
    struct Node{
        int tag;
        Dat dat;
        Node(int t=0,const Dat& d=Dat()):tag(t),dat(d){}
        void add(int v){dat.mx+=v;tag+=v;}
    }tr[MAXN<<2];
    void up(int p){tr[p].dat=tr[p<<1].dat+tr[p<<1|1].dat;}
    void down(int p){
        if(tr[p].tag){
            tr[p<<1].add(tr[p].tag);
            tr[p<<1|1].add(tr[p].tag);
            tr[p].tag=0;
        }
    }
    void build(int p=1,int l=1,int r=n){
        tr[p]=Node();
        if(l==r)return;
        int m=(l+r)>>1;
        build(p<<1,l,m);
        build(p<<1|1,m+1,r);
    }
    void upd(int L,int R,int v,int p=1,int l=1,int r=n){
        if(L<=l&&r<=R){tr[p].add(v);return;}
        down(p);
        int m=(l+r)>>1;
        if(L<=m)upd(L,R,v,p<<1,l,m);
        if(m<R)upd(L,R,v,p<<1|1,m+1,r);
        up(p);
    }
    void set(int x,int v,int p=1,int l=1,int r=n){
        if(l==r){tr[p].dat=Dat(l,v);return;}
        down(p);
        int m=(l+r)>>1;
        if(x<=m)set(x,v,p<<1,l,m);
        else set(x,v,p<<1|1,m+1,r);
        up(p);
    }
}seg[2];
void add(int& x,int y){x=(x+y)%MOD;if(x<0)x+=MOD;}
void addevt(bool t,int l,int r,int y1,int y2,int v){
    if(l<=r&&y1<=y2){
        evts[++ecnt]={t,y1,l,r,v};
        evts[++ecnt]={t,y2+1,l,r,-v};
    }
}
void proci(int i){
    if(a[i]==a[i+1])return;
    bool t=i&1;
    int l=pre[i],r=nxt[i];
    int L=pre[i+1],R=nxt[i+1];
    if(l<1&&L<1&&r>n&&R>n)return;
    if(R>r){swap(l,L);swap(r,R);t=!t;}
    if(l<=L){addevt(t,l+1,i,i+1,r-1,1);addevt(t,L+1,i,i+1,R-1,-1);}
    else{addevt(!t,L+1,l,i+1,R-1,1);addevt(t,l+1,i,R,r-1,1);}
}
int main(){
    freopen("digit.in","r",stdin);
    freopen("digit.out","w",stdout);
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin>>n;
    for(int i=1;i<=n;++i)cin>>a[i];
    memset(lst,0,sizeof(lst));
    for(int i=1;i<=n;++i){
        pre[i]=lst[a[i]];
        if(lst[a[i]])nxt[lst[a[i]]]=i;
        lst[a[i]]=i;
    }
    for(int i=1;i<=n;++i) if(lst[i]&&!nxt[lst[i]])nxt[lst[i]]=n+1;
    seg[0].build();seg[1].build();
    seg[0].set(1,1);seg[1].set(1,1);
    f[0]=1;ecnt=0;
    for(int i=1;i<n;++i)proci(i);
    sort(evts+1,evts+ecnt+1);
    int eptr=1;
    for(int i=1;i<=n;++i){
        while(eptr<=ecnt&&evts[eptr].y<=i){
            seg[evts[eptr].t].upd(evts[eptr].l,evts[eptr].r,evts[eptr].v);
            eptr++;
        }
        f[i]=0;
        Dat d0=seg[0].tr[1].dat;
        if(d0.mx==i)add(f[i],d0.cnt);
        Dat d1=seg[1].tr[1].dat;
        if(d1.mx==i)add(f[i],d1.cnt);
        add(f[i],MOD-f[i-1]);
        if(i<n){seg[0].set(i+1,f[i]);seg[1].set(i+1,f[i]);}
    }
    cout<<(f[n]%MOD+MOD)%MOD<<endl;
    return 0;
}