Submission #776384

# Submission time Handle Problem Language Result Execution time Memory
776384 2023-07-07T19:21:53 Z Tenis0206 Sequence (APIO23_sequence) C++17
100 / 100
972 ms 63848 KB
#include <bits/stdc++.h>

using namespace std;

const int nmax = 5e5;

int dif;

int n;
int v[nmax + 5];

vector<int> l[nmax + 5];

int st[nmax + 5], dr[nmax + 5];

int pst[nmax + 5], pdr[nmax + 5];

struct arbore_lazy
{
    pair<int,int> ai[4 * nmax + 5];
    int lazy[4 * nmax + 5];
private:
    pair<int,int> Merge(pair<int,int> a, pair<int,int> b)
    {
        pair<int,int> rez;
        rez.first = min(a.first,b.first);
        rez.second = max(a.second,b.second);
        return rez;
    }
    void propag(int nod)
    {
        if(lazy[nod]==0)
        {
            return;
        }
        lazy[nod*2] += lazy[nod];
        lazy[nod*2+1] += lazy[nod];
        ai[nod*2].first += lazy[nod], ai[nod*2].second += lazy[nod];
        ai[nod*2+1].first += lazy[nod], ai[nod*2+1].second += lazy[nod];
        lazy[nod] = 0;
    }
public:
    void update(int ua, int ub, int val, int nod, int a, int b)
    {
        if(ua<=a && ub>=b)
        {
            ai[nod].first += val;
            ai[nod].second += val;
            lazy[nod] += val;
            return;
        }
        propag(nod);
        int mij = (a + b) >> 1;
        if(ua<=mij)
        {
            update(ua,ub,val,nod*2,a,mij);
        }
        if(ub>mij)
        {
            update(ua,ub,val,nod*2+1,mij+1,b);
        }
        ai[nod] = Merge(ai[nod*2],ai[nod*2+1]);
    }
    pair<int,int> query(int qa, int qb, int nod, int a, int b)
    {
        if(qa<=a && qb>=b)
        {
            return ai[nod];
        }
        propag(nod);
        int mij = (a + b) >> 1;
        if(qa<=mij && qb>mij)
        {
            return Merge(query(qa,qb,nod*2,a,mij),query(qa,qb,nod*2+1,mij+1,b));
        }
        if(qa<=mij)
        {
            return query(qa,qb,nod*2,a,mij);
        }
        return query(qa,qb,nod*2+1,mij+1,b);
    }
};

arbore_lazy asp;

struct arbore_de_intervale
{
    int ai[8 * nmax + 15];
    void update(int poz, int val, int nod, int a, int b, bool as = false)
    {
        if(a==b)
        {
            if(as)
            {
                ai[nod] = val;
            }
            ai[nod] = min(ai[nod],val);
            return;
        }
        int mij = (a + b) >> 1;
        if(poz<=mij)
        {
            update(poz,val,nod*2,a,mij,as);
        }
        else
        {
            update(poz,val,nod*2+1,mij+1,b,as);
        }
        ai[nod] = min(ai[nod*2],ai[nod*2+1]);
    }
    int query(int qa, int qb, int nod, int a, int b)
    {
        if(qa > qb)
        {
            return nmax;
        }
        if(qa<=a && qb>=b)
        {
            return ai[nod];
        }
        int mij = (a + b) >> 1;
        if(qa<=mij && qb>mij)
        {
            return min(query(qa,qb,nod*2,a,mij),query(qa,qb,nod*2+1,mij+1,b));
        }
        if(qa<=mij)
        {
            return query(qa,qb,nod*2,a,mij);
        }
        return query(qa,qb,nod*2+1,mij+1,b);
    }
};

arbore_de_intervale aicnt;

vector<int> a;

int get_val(int val)
{
    int st = 1;
    int dr = a.size();
    int poz = 0;
    while(st<=dr)
    {
        int mij = (st + dr) >> 1;
        if(a[mij-1]<=val)
        {
            poz = mij;
            st = mij + 1;
        }
        else
        {
            dr = mij - 1;
        }
    }
    return poz;
}

bool cmpst(int a, int b)
{
    return (a + st[a] < b + st[b]);
}

bool cmpdr(int a, int b)
{
    return (a + dr[a] < b + dr[b]);
}

int sequence(int N, vector<int> A)
{
    n = N;
    for(int i=1; i<=n; i++)
    {
        v[i] = A[i - 1];
        l[v[i]].push_back(i);
    }
    for(int i=1; i<=n; i++)
    {
        asp.update(i,n,+1,1,1,n);
    }
    int rez = 0;
    for(int i=1;i<=2*n+2;i++)
    {
        aicnt.update(i,nmax,1,1,2*n+2,1);
    }
    for(int val=1; val<=n; val++)
    {
        int nr = l[val].size();
        if(!nr)
        {
            continue;
        }
        for(auto it : l[val])
        {
            asp.update(it,n,-1,1,1,n);
        }
        if(l[val].front() != 1)
        {
            pair<int,int> sp = asp.query(1,l[val].front()-1,1,1,n);
            st[0] = sp.first;
            dr[0] = sp.second;
            st[0] = min(st[0], 0);
            dr[0] = max(dr[0], 0);
        }
        else
        {
            st[0] = 0;
            dr[0] = 0;
        }
        for(int i=0; i<nr; i++)
        {
            int u = n;
            if(i + 1 < nr)
            {
                u = l[val][i + 1] - 1;
            }
            pair<int,int> sp = asp.query(l[val][i],u,1,1,n);
            st[i + 1] = sp.first;
            dr[i + 1] = sp.second;
        }
        for(int i=0;i<=nr;i++)
        {
            pst[i] = i, pdr[i] = i;
        }
        sort(pst,pst+nr+1,cmpst);
        sort(pdr,pdr+nr+1,cmpdr);
        int poz = 0;
        a.clear();
        for(int i=0;i<=nr;i++)
        {
            a.push_back(st[i] - i);
            a.push_back(dr[i] - i);
        }
        sort(a.begin(),a.end());
        for(int p=0;p<=nr;p++)
        {
            int j = pdr[p];
            while(poz <= nr && pst[poz] + st[pst[poz]] <= dr[j] + j)
            {
                int i = pst[poz];
                aicnt.update(get_val(dr[i]-i),i,1,1,2*n+2);
                ++poz;
            }
            rez = max(rez, j - aicnt.query(get_val(st[j]-j),2*n+2,1,1,2*n+2));
        }
        for(int i=0;i<=nr;i++)
        {
            aicnt.update(get_val(dr[i]-i),nmax,1,1,2*n+2,1);
        }
        for(auto it : l[val])
        {
            asp.update(it,n,-1,1,1,n);
        }
    }
    return rez;
}

#ifdef home

int main()
{
    freopen("nr.in","r",stdin);
    freopen("nr.out","w",stdout);
    int nn;
    cin>>nn;
    vector<int> vv(nn);
    for(int i=1; i<=nn; i++)
    {
        cin>>vv[i - 1];
    }
    cout<<sequence(nn,vv)<<'\n';
    return 0;
}

#endif // home
# Verdict Execution time Memory Grader output
1 Correct 12 ms 27732 KB Output is correct
2 Correct 11 ms 27732 KB Output is correct
3 Correct 11 ms 27720 KB Output is correct
4 Correct 11 ms 27732 KB Output is correct
5 Correct 12 ms 27676 KB Output is correct
6 Correct 12 ms 27732 KB Output is correct
7 Correct 12 ms 27732 KB Output is correct
8 Correct 15 ms 27732 KB Output is correct
9 Correct 12 ms 27732 KB Output is correct
10 Correct 11 ms 27760 KB Output is correct
11 Correct 12 ms 27732 KB Output is correct
12 Correct 13 ms 27632 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 27732 KB Output is correct
2 Correct 11 ms 27732 KB Output is correct
3 Correct 11 ms 27720 KB Output is correct
4 Correct 11 ms 27732 KB Output is correct
5 Correct 12 ms 27676 KB Output is correct
6 Correct 12 ms 27732 KB Output is correct
7 Correct 12 ms 27732 KB Output is correct
8 Correct 15 ms 27732 KB Output is correct
9 Correct 12 ms 27732 KB Output is correct
10 Correct 11 ms 27760 KB Output is correct
11 Correct 12 ms 27732 KB Output is correct
12 Correct 13 ms 27632 KB Output is correct
13 Correct 14 ms 27760 KB Output is correct
14 Correct 13 ms 27732 KB Output is correct
15 Correct 14 ms 27732 KB Output is correct
16 Correct 12 ms 27784 KB Output is correct
17 Correct 14 ms 27856 KB Output is correct
18 Correct 13 ms 27780 KB Output is correct
19 Correct 13 ms 27860 KB Output is correct
20 Correct 13 ms 27760 KB Output is correct
21 Correct 15 ms 27856 KB Output is correct
22 Correct 13 ms 27860 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 27732 KB Output is correct
2 Correct 648 ms 55884 KB Output is correct
3 Correct 689 ms 55756 KB Output is correct
4 Correct 692 ms 50524 KB Output is correct
5 Correct 640 ms 54796 KB Output is correct
6 Correct 642 ms 54988 KB Output is correct
7 Correct 734 ms 48872 KB Output is correct
8 Correct 689 ms 49048 KB Output is correct
9 Correct 744 ms 52956 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 11 ms 27732 KB Output is correct
2 Correct 668 ms 58384 KB Output is correct
3 Correct 667 ms 52608 KB Output is correct
4 Correct 667 ms 52808 KB Output is correct
5 Correct 684 ms 58476 KB Output is correct
6 Correct 605 ms 54096 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 842 ms 61580 KB Output is correct
2 Correct 810 ms 61564 KB Output is correct
3 Correct 819 ms 60988 KB Output is correct
4 Correct 829 ms 61076 KB Output is correct
5 Correct 720 ms 57668 KB Output is correct
6 Correct 723 ms 57668 KB Output is correct
7 Correct 673 ms 56460 KB Output is correct
8 Correct 659 ms 56152 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 27732 KB Output is correct
2 Correct 11 ms 27732 KB Output is correct
3 Correct 11 ms 27720 KB Output is correct
4 Correct 11 ms 27732 KB Output is correct
5 Correct 12 ms 27676 KB Output is correct
6 Correct 12 ms 27732 KB Output is correct
7 Correct 12 ms 27732 KB Output is correct
8 Correct 15 ms 27732 KB Output is correct
9 Correct 12 ms 27732 KB Output is correct
10 Correct 11 ms 27760 KB Output is correct
11 Correct 12 ms 27732 KB Output is correct
12 Correct 13 ms 27632 KB Output is correct
13 Correct 14 ms 27760 KB Output is correct
14 Correct 13 ms 27732 KB Output is correct
15 Correct 14 ms 27732 KB Output is correct
16 Correct 12 ms 27784 KB Output is correct
17 Correct 14 ms 27856 KB Output is correct
18 Correct 13 ms 27780 KB Output is correct
19 Correct 13 ms 27860 KB Output is correct
20 Correct 13 ms 27760 KB Output is correct
21 Correct 15 ms 27856 KB Output is correct
22 Correct 13 ms 27860 KB Output is correct
23 Correct 120 ms 33284 KB Output is correct
24 Correct 121 ms 33356 KB Output is correct
25 Correct 121 ms 33284 KB Output is correct
26 Correct 116 ms 32440 KB Output is correct
27 Correct 115 ms 32452 KB Output is correct
28 Correct 115 ms 32428 KB Output is correct
29 Correct 106 ms 32616 KB Output is correct
30 Correct 106 ms 32840 KB Output is correct
31 Correct 114 ms 34964 KB Output is correct
32 Correct 125 ms 34612 KB Output is correct
33 Correct 121 ms 33892 KB Output is correct
34 Correct 121 ms 33976 KB Output is correct
35 Correct 124 ms 34016 KB Output is correct
36 Correct 128 ms 33976 KB Output is correct
37 Correct 120 ms 33980 KB Output is correct
38 Correct 120 ms 33868 KB Output is correct
# Verdict Execution time Memory Grader output
1 Correct 12 ms 27732 KB Output is correct
2 Correct 11 ms 27732 KB Output is correct
3 Correct 11 ms 27720 KB Output is correct
4 Correct 11 ms 27732 KB Output is correct
5 Correct 12 ms 27676 KB Output is correct
6 Correct 12 ms 27732 KB Output is correct
7 Correct 12 ms 27732 KB Output is correct
8 Correct 15 ms 27732 KB Output is correct
9 Correct 12 ms 27732 KB Output is correct
10 Correct 11 ms 27760 KB Output is correct
11 Correct 12 ms 27732 KB Output is correct
12 Correct 13 ms 27632 KB Output is correct
13 Correct 14 ms 27760 KB Output is correct
14 Correct 13 ms 27732 KB Output is correct
15 Correct 14 ms 27732 KB Output is correct
16 Correct 12 ms 27784 KB Output is correct
17 Correct 14 ms 27856 KB Output is correct
18 Correct 13 ms 27780 KB Output is correct
19 Correct 13 ms 27860 KB Output is correct
20 Correct 13 ms 27760 KB Output is correct
21 Correct 15 ms 27856 KB Output is correct
22 Correct 13 ms 27860 KB Output is correct
23 Correct 648 ms 55884 KB Output is correct
24 Correct 689 ms 55756 KB Output is correct
25 Correct 692 ms 50524 KB Output is correct
26 Correct 640 ms 54796 KB Output is correct
27 Correct 642 ms 54988 KB Output is correct
28 Correct 734 ms 48872 KB Output is correct
29 Correct 689 ms 49048 KB Output is correct
30 Correct 744 ms 52956 KB Output is correct
31 Correct 668 ms 58384 KB Output is correct
32 Correct 667 ms 52608 KB Output is correct
33 Correct 667 ms 52808 KB Output is correct
34 Correct 684 ms 58476 KB Output is correct
35 Correct 605 ms 54096 KB Output is correct
36 Correct 842 ms 61580 KB Output is correct
37 Correct 810 ms 61564 KB Output is correct
38 Correct 819 ms 60988 KB Output is correct
39 Correct 829 ms 61076 KB Output is correct
40 Correct 720 ms 57668 KB Output is correct
41 Correct 723 ms 57668 KB Output is correct
42 Correct 673 ms 56460 KB Output is correct
43 Correct 659 ms 56152 KB Output is correct
44 Correct 120 ms 33284 KB Output is correct
45 Correct 121 ms 33356 KB Output is correct
46 Correct 121 ms 33284 KB Output is correct
47 Correct 116 ms 32440 KB Output is correct
48 Correct 115 ms 32452 KB Output is correct
49 Correct 115 ms 32428 KB Output is correct
50 Correct 106 ms 32616 KB Output is correct
51 Correct 106 ms 32840 KB Output is correct
52 Correct 114 ms 34964 KB Output is correct
53 Correct 125 ms 34612 KB Output is correct
54 Correct 121 ms 33892 KB Output is correct
55 Correct 121 ms 33976 KB Output is correct
56 Correct 124 ms 34016 KB Output is correct
57 Correct 128 ms 33976 KB Output is correct
58 Correct 120 ms 33980 KB Output is correct
59 Correct 120 ms 33868 KB Output is correct
60 Correct 948 ms 58320 KB Output is correct
61 Correct 972 ms 56340 KB Output is correct
62 Correct 952 ms 56552 KB Output is correct
63 Correct 802 ms 49240 KB Output is correct
64 Correct 864 ms 49364 KB Output is correct
65 Correct 812 ms 49184 KB Output is correct
66 Correct 702 ms 50724 KB Output is correct
67 Correct 706 ms 50632 KB Output is correct
68 Correct 783 ms 59988 KB Output is correct
69 Correct 685 ms 63848 KB Output is correct
70 Correct 886 ms 58980 KB Output is correct
71 Correct 966 ms 56844 KB Output is correct
72 Correct 972 ms 56664 KB Output is correct
73 Correct 966 ms 56880 KB Output is correct
74 Correct 957 ms 57664 KB Output is correct
75 Correct 928 ms 57196 KB Output is correct