제출 #1340474

#제출 시각아이디문제언어결과실행 시간메모리
1340474iamhereforfunFeast (NOI19_feast)C++20
0 / 100
281 ms17988 KiB
// Starcraft 2 enjoyer //

#include <bits/stdc++.h>

// #pragma GCC target("avx2")
// #pragma GCC optimize("O3")
// #pragma GCC optimize("unroll-loops")

using namespace std;

#define LSOne(X) ((X) & -(X))

const int N = 3e5 + 5;
const int M = 2e5 + 5;
const int LG = 20;
const int INF = 1e9 + 5;
const int K = 2;
const int C = 26;
const int B = 1000;
const int MOD = 998244353;

long long n, k, a[N], pos[N], parent[N], sz[N], val[N], type[N], sum;
vector<pair<int, int>> v;
long long ans, cur;
set<pair<int, int>> ms1, ms2;

void del(int val, int id)
{
    // cout << val << " " << id << "del\n";
    auto it = ms1.find({val, id});
    if (it != ms1.end())
    {
        sum -= val;
        ms1.erase(it);
        if (!ms2.empty())
        {
            if (prev(ms2.end())->first >= 0)
            {
                ms1.insert(*prev(ms2.end()));
                sum += prev(ms2.end())->first;
                ms2.erase(prev(ms2.end()));
            }
        }
    }
    else
    {
        ms2.erase(ms2.find({val, id}));
    }
}

void add(int val, int id)
{
    // cout << val << " " << id << "add\n";
    if (ms1.empty())
    {
        if (val > 0)
        {
            ms1.insert({val, id});
            sum += val;
        }
        else
        {
            ms2.insert({val, id});
        }
    }
    else
    {
        if (ms1.size() < k)
        {
            if (val > 0)
            {
                ms1.insert({val, id});
                sum += val;
            }
            else
            {
                ms2.insert({val, id});
            }
        }
        else
        {
            if (ms1.begin()->first < val)
            {
                sum -= ms1.begin()->first;
                ms2.insert(*ms1.begin());
                ms1.erase(*ms1.begin());
                ms1.insert({val, id});
                sum += val;
            }
            else
            {
                ms2.insert({val, id});
            }
        }
    }
}

int getParent(int x)
{
    return parent[x] == x ? x : parent[x] = getParent(parent[x]);
}

void update(int a, int b)
{
    a = getParent(a);
    b = getParent(b);
    if (a != b)
    {
        del(val[a], a);
        del(val[b], b);
        if (sz[a] < sz[b])
        {
            swap(a, b);
        }
        parent[b] = a;
        sz[a] += sz[b];
        val[a] += val[b];
        add(val[a], a);
    }
}

bool chkConnect(int a, int b)
{
    return getParent(a) == getParent(b);
}

inline void solve()
{
    cin >> n >> k;
    ans = 0;
    cur = 0;
    for (int x = 1; x <= n; x++)
    {
        cin >> a[x];
        v.push_back({a[x], x});
        parent[x] = x;
        sz[x] = 1;
        val[x] = 0;
    }
    sort(v.rbegin(), v.rend());
    for (int x = 0; x < n; x++)
    {
        pos[v[x].second] = x;
    }
    for (auto &[w, id] : v)
    {
        val[id] = w;
        add(w, id);
        if (id > 1)
        {
            if (pos[id - 1] < pos[id])
            {
                update(id - 1, id);
            }
        }
        if (id < n)
        {
            if (pos[id + 1] < pos[id])
            {
                update(id + 1, id);
            }
        }
        // cout << sum << " " << w << " " << id << "\n";
        ans = max(ans, sum);
    }
    cout << ans << "\n";
}

signed main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int t = 1;
    // cin >> t;
    for (int x = 1; x <= t; x++)
    {
        solve();
    }
    return 0;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...