Submission #707936

#TimeUsernameProblemLanguageResultExecution timeMemory
707936LittleCube도로 폐쇄 (APIO21_roads)C++14
100 / 100
269 ms48680 KiB
#include "roads.h"
#include <bits/stdc++.h>
#define ll long long
#define pll pair<ll, ll>
#define F first
#define S second
using namespace std;

struct kset
{
    vector<pll> ops;
    multiset<ll, greater<ll>> ms;
    int sz;
    ll sum = 0;
    void resize(int n)
    {
        sz = n;
        while (ms.size() > sz && *ms.begin() >= 0)
        {
            sum -= *ms.begin();
            ms.erase(ms.begin());
        }
    }
    void insert(ll k)
    {
        ops.emplace_back(pll(1, k));
        sum += k;
        ms.insert(k);
        if (ms.size() > sz && *ms.begin() >= 0)
        {
            ops.emplace_back(pll(0, *ms.begin()));
            sum -= *ms.begin();
            ms.erase(ms.begin());
        }
    }
    void undo()
    {
        while (!ops.empty())
        {
            auto [t, k] = ops.back();
            ops.pop_back();
            if (t == 1)
            {
                ms.erase(ms.find(k));
                sum -= k;
            }
            else
            {
                ms.insert(k);
                sum += k;
            }
        }
    }
} opt[100005];
ll dp[100005][2], d[100005], vis[100005];
vector<pll> E[100005];

void dfs(int u, int p, int k)
{
    vis[u] = 1;
    ll tot = dp[u][0] = dp[u][1] = 0;
    opt[u].ops.clear();
    for (auto [v, w] : E[u])
        if (d[v] < k)
            break;
        else if (v != p)
        {
            dfs(v, u, k);
            tot += dp[v][1];
            opt[u].insert(dp[v][0] + w - dp[v][1]);
        }
    dp[u][0] = tot + opt[u].sum - max(*opt[u].ms.begin(), 0LL);
    dp[u][1] = tot + opt[u].sum;
    opt[u].undo();
}

vector<ll> minimum_closure_costs(int N, vector<int> U, vector<int> V, vector<int> W)
{
    vector<ll> ans(N);
    vector<int> cur, nxt;
    for (int i = 0; i < N; i++)
        cur.emplace_back(i);
    for (int i = 0; i < N - 1; i++)
    {
        ++d[U[i]], ++d[V[i]];
        E[U[i]].emplace_back(pll(V[i], W[i]));
        E[V[i]].emplace_back(pll(U[i], W[i]));
        ans[0] += W[i];
    }
    for (int i = 0; i < N; i++)
        sort(E[i].begin(), E[i].end(), [&](pll p1, pll p2)
             { return d[p1.F] > d[p2.F]; });

    for (int k = 1; k < N; k++)
    {
        for (auto i : cur)
        {
            vis[i] = 0;
            opt[i].resize(d[i] - k);
        }
        for (auto i : cur)
            if (!vis[i])
            {
                dfs(i, -1, k);
                ans[k] += dp[i][1];
            }
        nxt.clear();
        for (auto i : cur)
            if (d[i] == k)
            {
                for (auto [j, w] : E[i])
                    if (d[j] > d[i])
                        opt[j].insert(w);
            }
            else
                nxt.emplace_back(i);
        cur.swap(nxt);
    }
    return ans;
}

/*
5
0 1 1
0 2 4
0 3 3
2 4 2

4
0 1 5
2 0 10
0 3 5
*/

Compilation message (stderr)

roads.cpp: In member function 'void kset::resize(int)':
roads.cpp:18:26: warning: comparison of integer expressions of different signedness: 'std::multiset<long long int, std::greater<long long int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   18 |         while (ms.size() > sz && *ms.begin() >= 0)
      |                ~~~~~~~~~~^~~~
roads.cpp: In member function 'void kset::insert(long long int)':
roads.cpp:29:23: warning: comparison of integer expressions of different signedness: 'std::multiset<long long int, std::greater<long long int> >::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   29 |         if (ms.size() > sz && *ms.begin() >= 0)
      |             ~~~~~~~~~~^~~~
roads.cpp: In member function 'void kset::undo()':
roads.cpp:40:18: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   40 |             auto [t, k] = ops.back();
      |                  ^
roads.cpp: In function 'void dfs(int, int, int)':
roads.cpp:63:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   63 |     for (auto [v, w] : E[u])
      |               ^
roads.cpp: In function 'std::vector<long long int> minimum_closure_costs(int, std::vector<int>, std::vector<int>, std::vector<int>)':
roads.cpp:111:27: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  111 |                 for (auto [j, w] : E[i])
      |                           ^
#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...