Submission #1154039

#TimeUsernameProblemLanguageResultExecution timeMemory
1154039Sandarach151Akcija (COCI21_akcija)C++20
30 / 110
1 ms584 KiB
#include<iostream>
#include<set>
using namespace std;

#define int long long

struct info{
	int count;
	int weight;
	int empty;

	info(int a, int b, int c): count(a), weight(b), empty(c) {}
	info(){
		count=0;
		weight=0;
		empty=0;
	}
};

signed main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	int n, k;
	cin >> n >> k;
	pair<int, int> arr[n];
	for(int i=0; i<n; i++){
		int w, d;
		cin >> w >> d;
		arr[i] = make_pair(d-1, w);
	}
	sort(arr, arr+n);
	multiset<int, greater<int> > used;
	info dp[n];
	dp[0] = info(1, arr[0].second, arr[0].first);
	used.insert(arr[0].second);
	for(int i=1; i<n; i++){
		if(arr[i].first != arr[i-1].first){
			int cnt = dp[i-1].count+1;
			int wght = dp[i-1].weight+arr[i].second;
			int empty = dp[i-1].empty+(arr[i].first-arr[i-1].first-1);
			dp[i] = info(cnt, wght, empty);
			used.insert(arr[i].second);
		}
		else{
			if(dp[i-1].empty>0){
				int cnt = dp[i-1].count+1;
				int wght = dp[i-1].weight+arr[i].second;
				int empty = dp[i-1].empty-1;
				dp[i] = info(cnt, wght, empty);
				used.insert(arr[i].second);
			}
			else{
				if(arr[i].second < *used.begin()){
					int wght = dp[i-1].weight - *used.begin() + arr[i].second;
					used.erase(used.begin());
					used.insert(arr[i].second);
					dp[i] = dp[i-1];
					dp[i].weight = wght;
				}
				else{
					dp[i] = dp[i-1];
				}
			}
		}
	}
	cout << dp[n-1].count << ' ' << dp[n-1].weight << '\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...
#Verdict Execution timeMemoryGrader output
Fetching results...