Submission #1051576

#TimeUsernameProblemLanguageResultExecution timeMemory
1051576lakshith_Jobs (BOI24_jobs)C++14
0 / 100
117 ms14420 KiB
/******************************************************************************

                              Online C++ Compiler.
               Code, Compile, Run and Debug C++ program online.
Write your code in this editor and press "Run" button to compile and execute it.

*******************************************************************************/

#include <bits/stdc++.h>
using namespace std;
int main()
{
    long long n,s;cin>>n>>s;
    vector<pair<long long,long long>>arr(n);
    for (int i = 0;i<n;++i){
        cin>>arr[i].first>>arr[i].second;
    }
    vector<int>parent(n);
    vector<long long>cost(n),pos(n,1),remaining(n,0);
    function<int(int,long long,long long)>findsets = [&](int v,long long c,long long r){
      if (parent[v] == v)return v;
      parent[v] = findsets(parent[v],cost[v] + c,r + remaining[v]);
      cost[v]+=c;
      remaining[v]+=r;
      return parent[v];
    };
    vector<int>order(n);
    iota(order.begin(),order.end(),0);
    sort(order.begin(),order.end(),[&](int i,int j){
        if (arr[i].second == arr[j].second)return arr[i].first > arr[j].first;
      return arr[i].second < arr[j].second;  
    });
    long long ans = 0;
    for (int i = 0;i<n;){
        int j = i;
        while(j < n && arr[order[i]].second == arr[order[j]].second){
            ++j;
        }
        //cout<<i<<" "<<j<<'\n';
        for (int kk = i;kk<j;++kk){
            int k = order[kk];
            if (arr[k].second == 0){
                cost[k] = arr[k].first;
                parent[k] = k;
                //if (-cost[k] + ans > s)pos[k] = 0;
                remaining[k] = arr[k].first;
                if (remaining[k] > 0){
                    ans+=remaining[k];
                    remaining[k] = 0;
                }
            }
            else{
                cost[k] = arr[k].first;
                remaining[k] = arr[k].first;
                int vv = findsets(arr[k].second - 1,0,0);
                if (-cost[vv] - ans > s){
                    pos[vv] = 0;
                }
                parent[k] = vv;
                //cout<<k<<" "<<vv<<" "<<remaining[vv]<<" "<<arr[k].first<<" "<<pos[vv]<<" "<<cost[vv]<<'\n';
                if (pos[vv] && remaining[vv] + arr[k].first > 0){
                    ans+=remaining[vv] + arr[k].first;
                    remaining[k] = 0;
                    remaining[vv] = 0;
                }
            }
        }
        //cout<<ans<<'\n';
        i = j;
    }
    cout<<ans<<'\n';
    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...