Submission #1064607

#TimeUsernameProblemLanguageResultExecution timeMemory
1064607Misha_YuzvikJobs (BOI24_jobs)C++14
43 / 100
2047 ms73048 KiB
# include <bits/stdc++.h>
using namespace std;
# define For(i , l , r) for(long long i = (l); i <= (r); i++)
# define Rep(i , n) For(i , 0 , (n) - 1)
# define size(x) (long long)x.size()
# define MAXN 500005
# define MAXK 1000005
# define all(x) x.begin(),x.end()
typedef long long ll;
typedef long double ld;
const ll inf = 1e7 + 7;
const ll mod = 1e9 + 9;
const ld eps = 0.0000001;
ll n , m , K , ans = 0 , q , finish;
vector<vector<ll> >g(MAXN);
vector<ll>val(MAXN);
vector<ll>root(MAXN);
multiset<pair<ll , ll> >stv[MAXN];
void init(ll N) {
    For (i , 0 , N) {
        root[i] = i;
    }
}
ll get_r(ll x) {
    if (root[x] == x) return x;
    else return root[x] = get_r(root[x]);
}
void check(multiset<pair<ll , ll> >&st) {
    ll prev = -1e18;
    for (auto it = st.begin(); it != st.end(); it++) {
           if (it->first < prev) assert(0);
           if (it->first < 0 || it->second < 0) assert(0);
           prev = it->second;
    }
}
void insert_pair(multiset<pair<ll , ll> >&st , ll ai , ll bi) {
         if (size(st) == 0) {
              st.insert({ai , bi});
              return;
         }
         auto it = st.lower_bound({ai , -1e18});
         auto itl = it , itr = it;
         if (it != st.begin()) {
             it--;
             if (it->second >= ai) {
                itl = it;
                bi = bi - ai + it->second; 
                ai = it->first; // kurwa
             }
             it++;
         }
         while (it != st.end() && it->first <= bi) {
             bi = bi - it->first + it->second;
             it++;
         }
         itr = it;
         if (itl != itr) st.erase(itl , itr);
         st.insert({ai , bi});
         check(st);
}
ll Union(ll x , ll y) {
    ll r1 = get_r(x) , r2 = get_r(y);
    if (r1 == r2) assert(0);
    if (size(stv[r1]) > size(stv[r2])) swap(r1 , r2);
    root[r2] = r1;
    auto& st = stv[r1];
    for (auto [ai , bi] : stv[r2]) {
         insert_pair(st , ai , bi);
    }
    return r1;
}
void dfs(ll v , ll p) {
       pair<ll , ll>cur;
       if (val[v] < 0) cur = {abs(val[v]) , 0};
       else cur = {0 , val[v]};
       ll rv = -1;
       for (auto to : g[v]) {
            if (to == p) continue;
            dfs(to , v);
            if (rv == -1) rv = get_r(to);
            else rv = Union(rv , to);
       }
       if (rv == -1) {
            if (val[v] > 0) {
                  insert_pair(stv[v] , cur.first , cur.second);
            }
            return;
       }
       auto &st = stv[rv];
       root[v] = rv;
       if (val[v] > 0) {
           insert_pair(st , cur.first , cur.second);
       }  else if (val[v] < 0) {
           while (size(st) > 0 && cur.first >= cur.second) {
                 auto [a1 , b1] = *st.begin();
                 cur.first = cur.first - cur.second + a1;
                 cur.second = b1;
                 st.erase(st.begin());
           }
           if (cur.first < cur.second)  insert_pair(st , cur.first , cur.second);
       }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    ll val0;
    cin >> n >> val0;
    For (i , 1 , n) {
         ll p;
         cin >> val[i] >> p;
         g[i].push_back(p);
         g[p].push_back(i);
    }
    val[0] = val0;
    // For (i , 1 , n) cin >> val[i];
    // Rep (i , n - 1) {
    //     ll u , v;
    //     cin >> u >> v;
    //     g[u].push_back(v);
    //     g[v].push_back(u);
    // }
    // n++;
    // val[n] = 1e18;
    // g[n].push_back(finish);
    // g[finish].push_back(n);
    init(n);
    dfs(0 , -1);
    auto& wyn = stv[get_r(0)];
    ll sum = 0;
    for (auto [ai , bi] : wyn) {
          if (sum >= ai) sum = sum - ai + bi;
       //   cerr << ai << ' ' << bi << "\n";
    }
    cout << sum - val0;
   // cerr << 1 << endl;
   // if (sum >= 1e17) cout << "TAK";
   // else cout << "NIE";
}

Compilation message (stderr)

Main.cpp: In function 'll Union(ll, ll)':
Main.cpp:67:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   67 |     for (auto [ai , bi] : stv[r2]) {
      |               ^
Main.cpp: In function 'void dfs(ll, ll)':
Main.cpp:95:23: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
   95 |                  auto [a1 , b1] = *st.begin();
      |                       ^
Main.cpp: In function 'int main()':
Main.cpp:130:15: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  130 |     for (auto [ai , bi] : wyn) {
      |               ^
#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...