답안 #1024117

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
1024117 2024-07-15T12:14:38 Z NValchanov Global Warming (CEOI18_glo) C++17
62 / 100
41 ms 11252 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 = max(0LL, len - 50); i <= len; i++)
    {
        
    }

    ll val = lis[len] - x;

    ll pos = bs(val);

    ans = max(ans, len + 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 4440 KB Output is correct
2 Correct 1 ms 4440 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 4444 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4440 KB Output is correct
2 Correct 1 ms 4440 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 4444 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
12 Correct 1 ms 4444 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 0 ms 4444 KB Output is correct
17 Correct 1 ms 4444 KB Output is correct
18 Correct 1 ms 4444 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4440 KB Output is correct
2 Correct 1 ms 4440 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 4444 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
12 Correct 1 ms 4444 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 0 ms 4444 KB Output is correct
17 Correct 1 ms 4444 KB Output is correct
18 Correct 1 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 41 ms 10940 KB Output is correct
2 Correct 38 ms 11208 KB Output is correct
3 Correct 39 ms 10620 KB Output is correct
4 Correct 38 ms 10948 KB Output is correct
5 Correct 30 ms 10956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 10 ms 5836 KB Output is correct
2 Correct 9 ms 5900 KB Output is correct
3 Correct 10 ms 5840 KB Output is correct
4 Correct 8 ms 4304 KB Output is correct
5 Correct 1 ms 4440 KB Output is correct
6 Correct 8 ms 4304 KB Output is correct
7 Correct 8 ms 5840 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 18 ms 7628 KB Output is correct
2 Correct 20 ms 7116 KB Output is correct
3 Correct 37 ms 10196 KB Output is correct
4 Correct 30 ms 11252 KB Output is correct
5 Correct 16 ms 6092 KB Output is correct
6 Correct 27 ms 11212 KB Output is correct
7 Correct 26 ms 11208 KB Output is correct
8 Correct 17 ms 7112 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 4440 KB Output is correct
2 Correct 1 ms 4440 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 4444 KB Output is correct
11 Correct 1 ms 4444 KB Output is correct
12 Correct 1 ms 4444 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 0 ms 4444 KB Output is correct
17 Correct 1 ms 4444 KB Output is correct
18 Correct 1 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 -