답안 #1024113

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1024113 2024-07-15T12:07:06 Z NValchanov Global Warming (CEOI18_glo) C++17
62 / 100
75 ms 11468 KB
#include <bits/stdc++.h>

#define endl '\n'

using namespace std;

typedef long long ll;

const ll MAXN = 2e5 + 10;
const ll MAXA = 4e18 + 10;
const ll MAXX = 1e9 + 10;

struct update
{
    ll idx;
    ll val;
    ll old;

    update()
    {
        idx = 0;
        val = old = -1;
    }

    update(ll _idx, ll _val, ll _old)
    {
        idx = _idx;
        val = _val;
        old = _old;
    }
};

ll n, x;
ll a[MAXN];
vector < update > updates;
ll lis[MAXN];
ll lis_suff[MAXN];
ll ans;

void read()
{
    cin >> n >> x;
    for(ll i = 0; i < n; i++)
    {
        cin >> a[i];
    }
}

void find_lis_suff()
{
    ll len = 1;

    lis_suff[0] = -MAXA;
    lis_suff[1] = -a[n - 1];

    updates.push_back(update(1, a[n - 1], 0));

    for(ll i = n - 2; i >= 0; i--)
    {
        ll j = lower_bound(lis_suff, lis_suff + len + 1, -a[i]) - lis_suff;

        updates.push_back(update(j, a[i], -lis_suff[j]));

        lis_suff[j] = -a[i];

        len = max(len, j);
    }

    ans = len;

    /* 

    for(update u : updates)
    {
        cout << "Change at position " << u.idx << " : from " << u.old << " to " << u.val << endl;
        cout << "idx : " << u.idx << endl;
        cout << "old : " << u.old << endl;
        cout << "val : " << u.val << endl;
    }

    */

    for(ll i = 1; i <= n; i++)
    {
        lis_suff[i] *= -1;
    }
}

void rollback()
{
    assert(!updates.empty());

    update u = updates.back();

    lis_suff[u.idx] = u.old;

    updates.pop_back();
}

ll bs(ll k)
{
    ll left = 0;
    ll right = n + 1;
    ll mid;

    while(right - left > 1)
    {
        mid = left + (right - left) / 2;

        if(lis_suff[mid] != 0 && lis_suff[mid] > k)
            left = mid;
        else
            right = mid;
    }

    return left;
}

void check(ll len)
{
    for(int i = len - 10; i <= len; i++)
    {
        ll val = lis[i] - x;

        ll pos = bs(val);

        ans = max(ans, i + pos);
    }
}

void print()
{
    cout << "Reversed LIS : " << endl;
    for(ll i = 1; i <= n; i++)
    {
        cout << lis_suff[i] << " ";
    }
    cout << endl << endl;
    cout << "Normal LIS : " << endl;
    for(ll i = 1; i <= n; i++)
    {
        cout << lis[i] << " ";
    }
    cout << endl << endl;
}

void solve()
{
    ll len = 1;

    lis[0] = -MAXA;
    lis[1] = a[0];

    rollback();

   /// print();    

    check(len);

    for(ll i = 1; i < n; i++)
    {
        ll j = lower_bound(lis, lis + len + 1, a[i]) - lis;

        lis[j] = a[i];

        len = max(len, j);

        rollback();

        ///print();

        check(len);
    }

    ans = max(ans, len);

   /// cout << "Answer : " << ans << endl;

   cout << ans << endl;
}

int main()
{
    ios_base :: sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    read();
    find_lis_suff();
    solve();

    return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Correct 1 ms 4444 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 1 ms 4444 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4444 KB Output is correct
10 Correct 1 ms 4440 KB Output is correct
11 Correct 1 ms 4564 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Correct 1 ms 4444 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 1 ms 4444 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4444 KB Output is correct
10 Correct 1 ms 4440 KB Output is correct
11 Correct 1 ms 4564 KB Output is correct
12 Correct 1 ms 4440 KB Output is correct
13 Correct 1 ms 4444 KB Output is correct
14 Correct 1 ms 4444 KB Output is correct
15 Correct 1 ms 4444 KB Output is correct
16 Correct 1 ms 4444 KB Output is correct
17 Correct 1 ms 4444 KB Output is correct
18 Correct 0 ms 4444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Correct 1 ms 4444 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 1 ms 4444 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4444 KB Output is correct
10 Correct 1 ms 4440 KB Output is correct
11 Correct 1 ms 4564 KB Output is correct
12 Correct 1 ms 4440 KB Output is correct
13 Correct 1 ms 4444 KB Output is correct
14 Correct 1 ms 4444 KB Output is correct
15 Correct 1 ms 4444 KB Output is correct
16 Correct 1 ms 4444 KB Output is correct
17 Correct 1 ms 4444 KB Output is correct
18 Correct 0 ms 4444 KB Output is correct
19 Correct 1 ms 4444 KB Output is correct
20 Incorrect 1 ms 4444 KB Output isn't correct
21 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 75 ms 10700 KB Output is correct
2 Correct 69 ms 10948 KB Output is correct
3 Correct 69 ms 10944 KB Output is correct
4 Correct 73 ms 10948 KB Output is correct
5 Correct 63 ms 10420 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 17 ms 5840 KB Output is correct
2 Correct 17 ms 5840 KB Output is correct
3 Correct 17 ms 5840 KB Output is correct
4 Correct 16 ms 4308 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 15 ms 4304 KB Output is correct
7 Correct 18 ms 5840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 34 ms 7372 KB Output is correct
2 Correct 35 ms 7144 KB Output is correct
3 Correct 67 ms 10188 KB Output is correct
4 Correct 72 ms 11192 KB Output is correct
5 Correct 31 ms 6080 KB Output is correct
6 Correct 56 ms 10700 KB Output is correct
7 Correct 57 ms 11468 KB Output is correct
8 Correct 31 ms 7116 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4444 KB Output is correct
2 Correct 1 ms 4444 KB Output is correct
3 Correct 1 ms 4444 KB Output is correct
4 Correct 1 ms 4444 KB Output is correct
5 Correct 1 ms 4444 KB Output is correct
6 Correct 1 ms 4444 KB Output is correct
7 Correct 1 ms 4444 KB Output is correct
8 Correct 1 ms 4444 KB Output is correct
9 Correct 1 ms 4444 KB Output is correct
10 Correct 1 ms 4440 KB Output is correct
11 Correct 1 ms 4564 KB Output is correct
12 Correct 1 ms 4440 KB Output is correct
13 Correct 1 ms 4444 KB Output is correct
14 Correct 1 ms 4444 KB Output is correct
15 Correct 1 ms 4444 KB Output is correct
16 Correct 1 ms 4444 KB Output is correct
17 Correct 1 ms 4444 KB Output is correct
18 Correct 0 ms 4444 KB Output is correct
19 Correct 1 ms 4444 KB Output is correct
20 Incorrect 1 ms 4444 KB Output isn't correct
21 Halted 0 ms 0 KB -