제출 #763117

#제출 시각아이디문제언어결과실행 시간메모리
763117vjudge1Financial Report (JOI21_financial)C++17
100 / 100
846 ms66888 KiB
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const ll maxn = 3e5;

struct gay
{
    ll value;
    ll index;
};
ll par[maxn], top[maxn];
ll find(ll a) {return par[a] = par[a]==a ? a : find(par[a]);}

bool same(ll a, ll b) {return find(a) == find(b);}

void init(ll n)
{
    for (ll i = 1; i <= n; ++i)
    {
        par[i] = i;
        top[i] = i;
    }
}
void united(ll a, ll b) 
{
    a = find(a);
    b = find(b);
    if (a == b) return;

    par[b] = a;
    top[a] = min(top[a], top[b]);
}
bool cmp(const gay &a, const gay &b) 
{
    if (a.value != b.value) return a.value < b.value;
    return a.index > b.index;

}
ll tree[4 * maxn];

void update(ll id, ll l, ll r, ll pos, ll val)
{
    if (l == r)
    {
        tree[id] = val;
        return;
    }
    
    ll mid = (l + r) >> 1;
    if (pos <= mid) update(id << 1, l, mid, pos, val);
    else update((id << 1) + 1, mid + 1, r, pos, val);

    tree[id] = max(tree[id * 2], tree[id * 2 + 1]);
}

ll get(ll id, ll l, ll r, ll ql, ll qr)
{
    if (l > qr || r < ql) return 0;
    if (l >= ql && r <= qr) return tree[id];

    ll mid = (l + r) >> 1;

    if (qr <= mid) return get(id << 1, l, mid, ql, qr);
    else if (ql >= mid + 1) return get((id << 1) + 1, mid + 1, r, ql, qr);
    else return max(get(id << 1, l, mid, ql, qr), get((id << 1) + 1, mid + 1, r, ql, qr));
}

int main()
{
    ll n, d;
    cin >> n >> d;
    init(n);
    gay a[n + 1];
    a[0].value = 0;
    set<ll> mark;
    map<ll, ll> bullshit;
    for (ll i = 1; i <= n; ++i) 
    {
        cin >> a[i].value;
        mark.insert(a[i].value);
        a[i].index = i;
    }
    ll mark2 = 0;
    for (auto cum: mark) bullshit[cum] = ++mark2;

    for (ll i = 1; i <= n; ++i) 
    {
        a[i].value = bullshit[a[i].value];
        //update(1, 1, n, i, a[i].value);
        //cout << a[i].value << " ";
    }
    //cout << endl;
    sort(a + 1, a + n + 1, cmp);
    //for (ll i = 1; i <= n; ++i) cout << a[i].value << " " <<  a[i].index << ") ";
    //cout << endl;
    set<ll> sex;
    ll maxt = -1;
    for (ll i = 1; i <= n; ++i)
    {
        auto omg = sex.lower_bound(a[i].index);
        if (omg != sex.end()) 
        {
            if (d - abs(*omg - a[i].index) >= 0) united(*omg, a[i].index);
        }
        
        if (omg != sex.begin()) 
        {
            omg--;
            if (d - abs(*omg - a[i].index) >= 0) united(*omg, a[i].index);
        }
        sex.insert(a[i].index);
        ll dp = 1;
        ll shit = find(a[i].index);
        if (top[shit] <= a[i].index - 1) dp = max(dp, 1 + get(1, 1, n, top[shit], a[i].index - 1));
        update(1, 1, n, a[i].index, dp);
        //maxt = max(maxt, dp);
    }
    cout << get(1, 1, n, 1, n);
    
    
    //for (ll i = 1; i <= n; ++i) cout << a[i].index << " ";

    


}
// ll dp[maxn];
// int main()
// {
//     ll n, d;
//     cin >> n >> d;
//     ll a[n + 1];
//     ll maxt = -1;
//     for (ll i = 1; i <= n; ++i) cin >> a[i];
//     dp[1] = 1;
//     for (ll i = 2; i <= n; ++i) 
//     {
//         for (ll j = i - 1; j >= i - d; --j)
//         {
//             if (j <= 0) break;
//             if (a[i] > a[j]) dp[i] = max(dp[i], dp[j] + 1);
//         }
//         maxt = max(maxt, dp[i]);
//     }
//     cout << maxt;
// }

컴파일 시 표준 에러 (stderr) 메시지

Main.cpp: In function 'int main()':
Main.cpp:97:8: warning: unused variable 'maxt' [-Wunused-variable]
   97 |     ll maxt = -1;
      |        ^~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...