Submission #1360832

#TimeUsernameProblemLanguageResultExecution timeMemory
1360832sim_pleSequence (APIO23_sequence)C++20
0 / 100
80 ms34372 KiB
/*
    written by sim_ple
*/
#include <bits/stdc++.h>
#include "sequence.h"
using namespace std;

// #define int long long
#define N 500005
#define itn int
#define all(x) x.begin() , x.end()
int pref1[N] , pref2[N] , pref3[N];
int v1[N] , v2[N] , v3[N] , v4[N];
int mx1[N << 2] , mx2[N << 2] , mx3[N << 2] , mx4[N << 2];

void build1(int node , int l , int r){
    if(l == r){
        mx1[node] = v1[l];
        return;
    }
    int md = (l + r) / 2;
    build1(node << 1 , l , md);
    build1(node << 1 | 1 , md + 1 , r);
    mx1[node] = max(mx1[node << 1] , mx1[node << 1 | 1]);
}

void build2(int node , int l , int r){
    if(l == r){
        mx2[node] = v2[l];
        return;
    }
    int md = (l + r) / 2;
    build2(node << 1 , l , md);
    build2(node << 1 | 1 , md + 1 , r);
    mx2[node] = max(mx2[node << 1] , mx2[node << 1 | 1]);
}

void build3(int node , int l , int r){
    if(l == r){
        mx3[node] = v3[l];
        return;
    }
    int md = l + r >> 1;
    build3(node << 1 , l , md);
    build3(node << 1 | 1 , md + 1 , r);
    mx3[node] = max(mx3[node << 1] , mx3[node << 1 | 1]);
}

void build4(int node , int l , int r){
    if(l == r){
        mx4[node] = v4[l];
        return;
    }
    int md = l + r >> 1;
    build4(node << 1 , l , md);
    build4(node << 1 | 1 , md + 1 , r);
    mx4[node] = max(mx4[node << 1] , mx4[node << 1 | 1]);
}

int find1(int node , int l , int r, int idx , int val){
    if(l > idx) return -1;
    if(l == r) return mx1[node];
    int md = l + r >> 1;
    if(mx1[node << 1] >= val){
        return find1(node << 1 , l , md , idx , val);
    }
    else{
        return find1(node << 1 | 1 , md + 1 , r , idx , val);
    }
}

int find2(int node , int l , int r, int idx , int val){
    if(l > idx) return -1;
    if(l == r) return mx2[node];
    int md = l + r >> 1;
    if(mx2[node << 1] >= val){
        return find2(node << 1 , l , md , idx , val);
    }
    else{
        return find2(node << 1 | 1 , md + 1 , r , idx , val);
    }
}

int find3(int node , int l , int r, int idx , int val){
    if(l > idx) return -1;
    if(l == r) return mx3[node];
    int md = l + r >> 1;
    if(mx3[node << 1] >= val){
        return find3(node << 1 , l , md , idx , val);
    }
    else{
        return find3(node << 1 | 1 , md + 1 , r , idx , val);
    }
}

int find4(int node , int l , int r , int idx , int val){
    if(l > idx) return -1;
    if(l == r) return mx4[node];
    int md = l + r >> 1;
    if(mx4[node << 1] >= val){
        return find4(node << 1 , l , md , idx ,val);
    }
    else{
        return find4(node << 1 | 1 , md + 1 , r , idx , val);
    }
}

int sequence(int n , vector<int> a){
    for(int i = 1; i <= n; i++){
        pref1[i] = pref1[i - 1];
        pref2[i] = pref2[i - 1];
        pref3[i] = pref3[i - 1];
        if(a[i] == 1) pref1[i]++;
        else if(a[i] == 2) pref2[i]++;
        else pref3[i]++;
        v1[i] = pref2[i] + pref3[i] - pref1[i];
        v2[i] = pref1[i] + pref2[i] - pref3[i];
        v3[i] = pref3[i] - pref1[i] - pref2[i];
        v4[i] = pref1[i] - pref3[i] - pref2[i];
    } 
    build1(1 , 1 , n);
    build2(1 , 1 , n);
    build3(1 , 1 , n);
    build4(1 , 1 , n);
    int ans = 0;
    for(int i = 2; i <= n; i++){
        int r1 = find1(1 , 1 , n , i - 1 , v1[i]);
        int r2 = find2(1 , 1 , n , i - 1 , v2[i]);
        int r3 = find3(1 , 1 , n , i - 1 , v3[i]);
        int r4 = find4(1 , 1 , n , i - 1 , v4[i]);
        if(r1 > 0) ans = max(ans , pref1[i] - pref1[r1]);
        if(r3 > 0) ans = max(ans , pref2[i] - pref2[r3]);
        if(r4 > 0) ans = max(ans , pref2[i] - pref2[r4]);
        if(r2 > 0) ans = max(ans , pref3[i] - pref3[r2]);
        if(pref1[i] >= pref2[i] + pref3[i]) ans = max(ans , pref1[i]);
        if(pref3[i] >= pref1[i] + pref2[i]) ans = max(ans , pref3[i]);
        if(pref2[i] >= abs(pref1[i] - pref3[i])) ans = max(ans , pref2[i]);
     }
     return ans;
}


// void solve1(){
//     int n;
//     cin >> n;
//     vector<int> a(n + 1);
//     for(int i = 0; i < n; i++){
//         cin >> a[i];
//     }
//     cout << sequence(n , a) << endl;
// }

// int32_t main() {
//     ios::sync_with_stdio(0); cin.tie(0);


//     freopen("a.in", "r", stdin);
//     freopen("a.out", "w", stdout);

//     int t = 1;
//     //cin >> t;
//     while(t--) solve1();
//     return 0;
// }
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...