记录编号 608679 评测结果 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
题目名称 4184.轻重数字 最终得分 100
用户昵称 Gravatar淮淮清子 是否通过 通过
代码语言 C++ 运行时间 69.244 s
提交时间 2025-10-28 19:57:21 内存使用 18.29 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<cmath>
#include<vector>
#include<unordered_map>
#include<cstring>
using namespace std;

const int MOD = 1e6 + 3;
const int MAXN = 5 * 1e5 + 5;

int kpos[2][MAXN], sum[2][MAXN], pos[2][MAXN];
int L[MAXN], R[MAXN], id[MAXN];
int dp[MAXN], even[MAXN], odd[MAXN];
int a[MAXN], pre[MAXN];
pair<int, int> lst[MAXN];
int n, tot = 0, B;

inline int read(){
    int x = 0, f = 1;
    char ch = getchar();
    while(ch < '0' || ch > '9'){
        if(ch == '-') f = -1;
        ch = getchar();
    }
    while(ch>='0' && ch<='9')
        x = x * 10 + ch - '0', ch = getchar();
    return x * f;
}


inline void update(int k, int l, int r, int x){
    if(l > r) return;
    int kl = id[l], kr = id[r];
    if(kl != kr){
        for(int i = kl + 1;i < kr;++ i){
            kpos[k][i] += x;
        }
        if(l == L[kl]){
            kpos[k][kl] += x;
        }
		else{
            for(int i = l;i <= R[kl];++ i){
                if(pos[k][i]){
                    sum[k][kl] = (sum[k][kl] + dp[i - 1]) % MOD;
                }
                pos[k][i] += x;
                if(pos[k][i]){
                    sum[k][kl] = (sum[k][kl] - dp[i - 1] + MOD) % MOD;
                }
            }
        }
        if(r == R[kr]){
            kpos[k][kr] += x;
        }
		else{
            for(int i = L[kr];i <= r;++ i){
                if(pos[k][i]){
                    sum[k][kr] = (sum[k][kr] + dp[i - 1]) % MOD;
                }
                pos[k][i] += x;
                if(pos[k][i]){
                    sum[k][kr] = (sum[k][kr] - dp[i - 1] + MOD) % MOD;
                }
            }
        }
    }
	else{
        if(l == L[kl] && r == R[kl]){
            kpos[k][kl] += x;
        }
		else {
            for(int i = l;i <= r;++ i){
                if(pos[k][i]){
                    sum[k][kl] = (sum[k][kl] + dp[i - 1]) % MOD;
                }
                pos[k][i] += x;
                if(pos[k][i]){
                    sum[k][kl] = (sum[k][kl] - dp[i - 1] + MOD) % MOD;
                }
            }
        }
    }
}

inline int query(int k, int l, int r){
    if(l > r) return 0;
    int res = 0;
    int kl = id[l], kr = id[r];
    if(kl != kr){
        for(int i = kl + 1;i < kr;++ i){
            if(!kpos[k][i]){
                res = (res + sum[k][i]) % MOD;
            }
        }
        if(l == L[kl]){
            if(!kpos[k][kl]){
                res = (res + sum[k][kl]) % MOD;
            }
        }
		else{
            for(int i = l; i <= R[kl]; i++){
                if(!pos[k][i] && !kpos[k][kl]){
                    res = (res + dp[i - 1]) % MOD;
                }
            }
        }
        if(r == R[kr]){
            if(!kpos[k][kr]){
                res = (res + sum[k][kr]) % MOD;
            }
        }
		else{
            for(int i = L[kr];i <= r;++ i){
                if (!pos[k][i] && !kpos[k][kr]){
                    res = (res + dp[i - 1]) % MOD;
                }
            }
        }
    }
	else{
        if(l == L[kl] && r == R[kl]){
            if(!kpos[k][kl]){
                res = (res + sum[k][kl]) % MOD;
            }
        }
		else{
            for(int i = l;i <= r;++ i){
                if (!pos[k][i] && !kpos[k][kl]){
                    res = (res + dp[i - 1]) % MOD;
                }
            }
        }
    }
    return res;
}

int main(){
	freopen("digit.in", "r", stdin);
	freopen("digit.out", "w", stdout);
	n = read();
	B = 300;
    for(int i = 1; i <= n; i += B){
        L[++ tot] = i;
        R[tot] = min(n, i + B - 1);
        for(int j = i;j <= R[tot];++ j){
            id[j] = tot;
        }
    }

//	for(int i = 1;i <= n;++ i){
//		cout << i << ' ' << id[i] << '\n;'
//	}

    dp[0] = 1;

    for(int i = 1;i <= n;++ i) a[i] = read();

    int leven = 0, lodd = 0, minL = 1;
    memset(lst, -1, sizeof(lst));

    for(int i = 1;i <= n;++ i){
        sum[0][id[i]] = (sum[0][id[i]] + dp[i - 1]) % MOD;
        sum[1][id[i]] = (sum[1][id[i]] + dp[i - 1]) % MOD;
        dp[i] = dp[i - 1];
        int v = a[i];
        if(lst[v].second != -1){
            update(lst[v].second & 1, lst[v].first + 1, lst[v].second, -1);
        }
        if(i & 1){
            lodd = max(lodd, odd[v]);
            odd[v] = i;
        }
		else{
            leven = max(leven, even[v]);
            even[v] = i;
        }
        lst[v] = {pre[v], i};
        update(lst[v].second & 1, lst[v].first + 1, lst[v].second, 1);
        pre[v] = i;
        minL = max(minL, min(odd[v], even[v]) + 1);
        if(leven < lodd){
            dp[i] = (dp[i] + query(1, max(minL, leven + 1), i - 1)) % MOD;
        }
		else if (lodd < leven){
            dp[i] = (dp[i] + query(0, max(minL, lodd + 1), i - 1)) % MOD;
        }
    }
    printf("%d", dp[n] % MOD);
    return 0;
}