Submission #479800

# Submission time Handle Problem Language Result Execution time Memory
479800 2021-10-13T07:27:08 Z wiwiho Fireworks (APIO16_fireworks) C++14
0 / 100
1 ms 204 KB
#include <bits/stdc++.h>
#include <bits/extc++.h>

#define StarBurstStream ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define iter(a) a.begin(), a.end()
#define riter(a) a.rbegin(), a.rend()
#define lsort(a) sort(iter(a))
#define gsort(a) sort(riter(a))
#define pb(a) push_back(a)
#define eb(a) emplace_back(a)
#define pf(a) push_front(a)
#define ef(a) emplace_front(a)
#define pob pop_back()
#define pof pop_front()
#define mp(a, b) make_pair(a, b)
#define F first
#define S second
#define mt make_tuple
#define gt(t, i) get<i>(t)
#define tomax(a, b) ((a) = max((a), (b)))
#define tomin(a, b) ((a) = min((a), (b)))
#define topos(a) ((a) = (((a) % MOD + MOD) % MOD))
#define uni(a) a.resize(unique(iter(a)) - a.begin())
#define printv(a, b) {bool pvaspace=false; \
for(auto pva : a){ \
    if(pvaspace) b << " "; pvaspace=true;\
    b << pva;\
}\
b << "\n";}

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef unsigned long long ull;
typedef long double ld;

using pii = pair<int, int>;
using pll = pair<ll, ll>;
using pdd = pair<ld, ld>;
using tiii = tuple<int, int, int>;

const ll MOD = 1000000007;
const ll MAX = 2147483647;
const ll LLMAX = 1LL << 60;

template<typename A, typename B>
ostream& operator<<(ostream& o, pair<A, B> p){
    return o << '(' << p.F << ',' << p.S << ')';
}

ll ifloor(ll a, ll b){
    if(b < 0) a *= -1, b *= -1;
    if(a < 0) return (a - b + 1) / b;
    else return a / b;
}

ll iceil(ll a, ll b){
    if(b < 0) a *= -1, b *= -1;
    if(a > 0) return (a + b - 1) / b;
    else return a / b;
}

int n, m;
vector<vector<int>> g;
vector<int> c;
vector<multiset<ll>> dp;

void add(multiset<ll>& pq, ll t, int cnt){
    ll lst = LLMAX;
    while(cnt--){
        lst = *pq.rbegin();
        pq.erase(prev(pq.end()));
    }
    ll tmp = *pq.rbegin();
    pq.erase(prev(pq.end()));
    pq.insert(tmp + t);
    pq.insert(lst + t);
//    cerr << "add " << lst << " " << tmp << " " << t << "\n";
//    printv(pq, cerr);
}

void add(multiset<ll>& a, multiset<ll>& b){
    if(a.size() < b.size()) a.swap(b);
    for(ll i : b) a.insert(i);
}

void dfs(int now){
    dp[now].insert(0);
    dp[now].insert(0);
    int cnt = 0;
    for(int i : g[now]){
        dfs(i);
        cnt++;
        add(dp[now], dp[i]);
    }
    add(dp[now], c[now], max(1, cnt));
//    cerr << "dfs " << now << "  ";
//    printv(dp[now], cerr);
}

int main(){
    StarBurstStream

    cin >> n >> m;
    n += m;
    g.resize(n + 1);
    c.resize(n + 1);
    dp.resize(n + 1);
    ll sum = 0;
    for(int i = 2; i <= n; i++){
        int p;
        cin >> p >> c[i];
        g[p].eb(i);
        sum += c[i];
    }

    dfs(1);

    ll slope = max((int)g[1].size(), 1);
    slope -= dp[1].size();
    ll now = sum;
    ll lst = 0;
    ll ans = LLMAX;
    for(ll i : dp[1]){
        now += slope * (i - lst);
        slope++;
        lst = i;
        ans = min(ans, now);
    }

    cout << ans << "\n";

    return 0;
}
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 0 ms 204 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 204 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 0 ms 204 KB Output isn't correct
3 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 204 KB Output is correct
2 Incorrect 0 ms 204 KB Output isn't correct
3 Halted 0 ms 0 KB -