제출 #1359090

#제출 시각아이디문제언어결과실행 시간메모리
1359090silence25서열 (APIO23_sequence)C++20
100 / 100
620 ms44064 KiB
#include "sequence.h"
#include "bits/stdc++.h"

#define ff first
#define ss second
#define pp pop_back
#define ll long long
#define pb push_back
#define ls(v) (int)v.size()
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
#define wr cout << "------------------------" << endl

using namespace std;

const int INF = 1e9 + 7;
const int N = 5e5 + 5;
int sgmax[N << 2];
int sgmin[N << 2];
int lz[N << 2];
int a[N];
vector<int> pos[N];

void push(int nd, int s, int e) {
    if (lz[nd]) {
        sgmin[nd] += lz[nd];
        sgmax[nd] += lz[nd];
        if (s != e) {
            lz[nd << 1] += lz[nd];
            lz[nd << 1 | 1] += lz[nd];
        }
        lz[nd] = 0;
    }
}

void build(int nd, int s, int e) {
    if (s == e) {
        sgmax[nd] = sgmin[nd] = s;
        return;
    }
    int mid = s + e >> 1;
    build(nd << 1, s, mid);
    build(nd << 1 | 1, mid + 1, e);
    sgmax[nd] = max(sgmax[nd << 1],  sgmax[nd << 1 | 1]);
    sgmin[nd] = min(sgmin[nd << 1],  sgmin[nd << 1 | 1]);
}

void upd(int nd, int s, int e, int l, int r, int val) {
    push (nd, s, e);
    if (s > r or l > e) return;
    if (l <= s and e <= r) {
        lz[nd] += val;
        push (nd, s, e);
        return;
    }
    int mid = s + e >> 1;
    upd(nd << 1, s, mid, l, r, val);
    upd(nd << 1 | 1, mid + 1, e, l, r, val);
    sgmax[nd] = max(sgmax[nd << 1],  sgmax[nd << 1 | 1]);
    sgmin[nd] = min(sgmin[nd << 1],  sgmin[nd << 1 | 1]);
}

int qrymin(int nd, int s, int e, int l, int r) {
    push (nd, s, e);
    if (s > r or l > e) return INF;
    if (l <= s and e <= r) {
        return sgmin[nd];
    }
    int mid = s + e >> 1;
    int L = qrymin(nd << 1, s, mid, l, r);
    int R = qrymin(nd << 1 | 1, mid + 1, e, l, r);
    return min(L, R);
}

int qrymax(int nd, int s, int e, int l, int r) {
    push (nd, s, e);
    if (s > r or l > e) return -INF;
    if (l <= s and e <= r) {
        return sgmax[nd];
    }
    int mid = s + e >> 1;
    int L = qrymax(nd << 1, s, mid, l, r);
    int R = qrymax(nd << 1 | 1, mid + 1, e, l, r);
    return max(L, R);
}

int sequence (int n, vector<int> A) {
    for (int i = 1;i<=n;++i) pos[i].clear();
    build(1, 0, n);
    for (int i = 1;i<=n;++i) pos[A[i - 1]].pb(i);
    
    int ans = 1;
    for (int x = 1;x<=n;++x) {
        if (pos[x].empty()) continue;
        int m = ls(pos[x]);
        vector<int> maxj1(m), maxj2(m);
        int j = 0;
        for (int i = 0;i<m;++i) {
            j = max(j, i);
            while (j < m) {
                int x1 = pos[x][i];
                int x2 = pos[x][j];
                int v1 = qrymax(1, 0, n, x2, n) - qrymin(1, 0, n, 0, x1 - 1);
                if (v1 >= 0) j += 1;
                else break;
            }
            maxj1[i] = j - 1;
        }
        for (auto p : pos[x]) upd(1, 0, n, p, n, -2);
        j = 0;
        for (int i = 0;i<m;++i) {
            j = max(j, i);
            while (j < m) {
                int x1 = pos[x][i];
                int x2 = pos[x][j];
                int v2 = qrymin(1, 0, n, x2, n) - qrymax(1, 0, n, 0, x1 - 1);
                if (v2 <= 0) j += 1;
                else break;
            }
            maxj2[i] = j - 1;
        }
        for (int i = 0;i<m;++i) {
            ans = max(ans, min(maxj1[i], maxj2[i]) - i + 1);
        }
    }
    
    return ans;
}

/*
7
1 2 3 1 2 3

9
1 1 2 3 4 3 2 1 1

14
2 6 2 5 3 4 2 1 4 3 5 6 3 2


*/
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…