제출 #1347903

#제출 시각아이디문제언어결과실행 시간메모리
1347903nagorn_ph서열 (APIO23_sequence)C++20
12 / 100
46 ms70728 KiB
#include "sequence.h"
#include <bits/extc++.h>
#define int long long
#define emb emplace_back
#define pii pair <int32_t, int32_t>
#define tiii tuple <int32_t, int32_t, int32_t>
#define all(a) a.begin(), a.end()

using namespace std;
using namespace __gnu_pbds;

#define ordered_multiset tree <int, null_type, less_equal <int>, rb_tree_tag, tree_order_statistics_node_update>

const int N = 3e6 + 5;
const int inf = 1e18;

int n, a[N], fenwick[4][N];

void update(int idx, int num, int val){
    while (idx < N) {
        fenwick[num][idx] = min(fenwick[num][idx], val);
        idx += idx & -idx;
    }
}

int query(int num, int idx){
    int mx = inf;
    while (idx > 0) {
        mx = min(mx, fenwick[num][idx]);
        idx -= idx & -idx;
    }
    return mx;
}

int32_t sequence(int32_t Nn, vector<int32_t> A) {
    for (int i = 1; i < N; i++) fenwick[1][i] = fenwick[3][i] = inf;
    n = Nn;
    int freq[4][n + 1]; memset(freq, 0, sizeof freq);
    for (int i = 0; i < n; i++) {
        a[i + 1] = A[i];
        for (int j = 1; j <= 3; j++) {
            freq[j][i + 1] = freq[j][i] + (A[i] == j);
        }
    }
    int ans = freq[2][n];
    for (int i = 1; i <= 3; i++) {
        if (i == 2) continue;
        for (int j = 1; j <= n; j++) {
            if (a[j] != i) continue;
            if (2 * freq[i][j] >= j) ans = max(ans, freq[i][j]);
            ans = max(ans, freq[i][j] - query(i, 2 * freq[i][j] - j + (N/2)));
            update(2 * freq[i][j] - j + (N/2), i, freq[i][j]);
        }
    }
    return ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...