Submission #961478

# Submission time Handle Problem Language Result Execution time Memory
961478 2024-04-12T07:23:01 Z hmm789 Sequence (APIO23_sequence) C++17
13 / 100
2000 ms 85680 KB
#include "sequence.h"
#include <bits/stdc++.h>
using namespace std;

struct node {
    int s, e, m, mn, mx, lz;
    node *l, *r;
    node(int _s, int _e) {
        s = _s, e = _e, m = (s+e)/2, mn = mx = lz = 0;
        if(s != e) {
            l = new node(s, m);
            r = new node(m+1, e);
        }
    }
    void prop() {
        if(lz == 0) return;
        mn += lz;
        mx += lz;
        if(s != e) {
            l->lz += lz;
            r->lz += lz;
        }
        lz = 0;
    }
    void radd(int x, int y, int val) {
        prop();
        if(x <= s && e <= y) {lz += val; return;}
        else if(x > m) r->radd(x, y, val);
        else if(y <= m) l->radd(x, y, val);
        else l->radd(x, y, val), r->radd(x, y, val);
        l->prop(); r->prop();
        mn = min(l->mn, r->mn);
        mx = max(l->mx, r->mx);
    }
    int rmin(int x, int y) {
        prop();
        if(x <= s && e <= y) return mn;
        else if(x > m) return r->rmin(x, y);
        else if(y <= m) return l->rmin(x, y);
        else return min(l->rmin(x, y), r->rmin(x, y));
    }
    int rmax(int x, int y) {
        prop();
        if(x <= s && e <= y) return mx;
        else if(x > m) return r->rmax(x, y);
        else if(y <= m) return l->rmax(x, y);
        else return max(l->rmax(x, y), r->rmax(x, y));
    }
} *root;

int sequence(int n, std::vector<int> a) {
    reverse(a.begin(), a.end());
    a.push_back(0);
    reverse(a.begin(), a.end());
    int ans = 0;
    vector<int> pos[n+2];
    for(int i = 1; i <= n; i++) pos[i].push_back(0);
    for(int i = 1; i <= n; i++) pos[a[i]].push_back(i);
    for(int i = 1; i <= n; i++) pos[i].push_back(n+1);
    root = new node(0, n);
    for(int i = 1; i <= n; i++) {
        if(a[i] > 1) root->radd(i, n, 1);
    }
    for(int i = 1; i <= n; i++) { // value i
        int l = 1, r = (int)pos[i].size()-1, m;
        while(l < r) {
            m = (l+r)/2;
            bool ok = false;
            for(int j = 1; j < pos[i].size()-m; j++) {
                int mn1 = root->rmin(pos[i][j-1], pos[i][j]-1);
                int mx1 = root->rmax(pos[i][j-1], pos[i][j]-1);
                int mn2 = root->rmin(pos[i][j+m-1], pos[i][j+m]-1);
                int mx2 = root->rmax(pos[i][j+m-1], pos[i][j+m]-1);
                if(mn2 < mn1) swap(mn1, mn2), swap(mx1, mx2);
                if(mn1+m >= mn2 && mn1+m <= mx2) {
                    ok = true;
                    break;
                }
                if(mx1 > mx2) swap(mn1, mn2), swap(mx1, mx2);
                if(mx2-m >= mn1 && mn2-m <= mx1) {
                    ok = true;
                    break;
                }
            }
            if(ok) l = m+1;
            else r = m;
        }
        ans = max(ans, l-1);
        for(int j : pos[i]) if(j != 0 && j != n+1) root->radd(j, n, -1);
        for(int j : pos[i+1]) if(j != 0 && j != n+1) root->radd(j, n, -1);
    }
    return ans;
}

Compilation message

sequence.cpp: In function 'int sequence(int, std::vector<int>)':
sequence.cpp:69:30: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |             for(int j = 1; j < pos[i].size()-m; j++) {
      |                            ~~^~~~~~~~~~~~~~~~~
# Verdict Execution time Memory Grader output
1 Correct 1 ms 432 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Incorrect 0 ms 348 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 432 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Incorrect 0 ms 348 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 432 KB Output is correct
2 Correct 540 ms 85316 KB Output is correct
3 Correct 578 ms 84104 KB Output is correct
4 Correct 453 ms 83284 KB Output is correct
5 Correct 560 ms 85680 KB Output is correct
6 Correct 530 ms 85016 KB Output is correct
7 Correct 517 ms 83480 KB Output is correct
8 Incorrect 896 ms 83468 KB Output isn't correct
9 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 344 KB Output is correct
2 Execution timed out 2061 ms 82776 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 873 ms 83508 KB Output is correct
2 Correct 963 ms 82096 KB Output is correct
3 Correct 913 ms 82204 KB Output is correct
4 Correct 887 ms 82220 KB Output is correct
5 Correct 748 ms 82716 KB Output is correct
6 Correct 817 ms 83464 KB Output is correct
7 Correct 584 ms 82520 KB Output is correct
8 Correct 652 ms 83732 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 1 ms 432 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Incorrect 0 ms 348 KB Output isn't correct
8 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 432 KB Output is correct
2 Correct 1 ms 344 KB Output is correct
3 Correct 1 ms 344 KB Output is correct
4 Correct 0 ms 348 KB Output is correct
5 Correct 1 ms 344 KB Output is correct
6 Correct 0 ms 348 KB Output is correct
7 Incorrect 0 ms 348 KB Output isn't correct
8 Halted 0 ms 0 KB -