Submission #339476

#TimeUsernameProblemLanguageResultExecution timeMemory
339476amunduzbaev학교 설립 (IZhO13_school)C++14
95 / 100
129 ms16608 KiB
/** made by amunduzbaev **/

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp> 
#include <ext/pb_ds/tree_policy.hpp> 
#include <ext/rope>

using namespace __gnu_pbds;
using namespace __gnu_cxx;
using namespace std;

#define ff first
#define ss second
#define pb push_back
#define mp make_pair
#define ub upper_bound
#define lb lower_bound
#define ll long long
#define ld long double
#define pii pair<int, int>
#define pll pair<ll, ll>
#define sz(x) (int)x.size()
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(),x.rend()
#define fastios ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
#define vll vector<ll>
#define vii vector<int>
#define vpii vector<pii>
#define vpll vector<pll>
#define cnt(a)__builtin_popcount(a)
template<class T> bool umin(T& a, const T& b) {return a > b? a = b, true:false;}
template<class T> bool umax(T& a, const T& b) {return a < b? a = b, true:false;}

typedef tree<pii,null_type,less<pii>,rb_tree_tag,tree_order_statistics_node_update> ordered_set;

const int N = 3e5+5;
const int mod = 1e9+7;
const ll inf = 1e18;
const ld Pi = acos(-1);
ll s, n, m, k, ans, ss[N], mm[N];
pii a[N], tmp[N];
void solve(){
	cin>>n>>m>>s;	
	vector<pii> dif;
	for(int i=0;i<n;i++){
		cin>>a[i].ff>>a[i].ss;
		dif.pb({a[i].ff - a[i].ss, i});
	}
	sort(all(dif));
	for(int i=0;i<n;i++) tmp[i] = a[dif[i].ss];
	priority_queue<int> tpp;
	for(int i=n-1;i>=n-m;i--) { tpp.push(-tmp[i].ff); mm[i] = tmp[i].ff; if(i < n-1) mm[i] += mm[i+1]; }
	for(int i=n-m-1;i>=0;i--){
		int sub = 0, add = 0;
		if(tmp[i].ff > tpp.top()*-1){
			sub = tpp.top()*-1;
			tpp.pop();
			add = tmp[i].ff;
			tpp.push(-tmp[i].ff);
		}
		mm[i] = mm[i+1] - sub + add;
	}
	while(!tpp.empty()) tpp.pop();
	for(int i=0;i<s;i++){
		tpp.push(-tmp[i].ss);
		ss[i] = tmp[i].ss;
		if(i) ss[i] += ss[i-1];
	}
	
	for(int i=s;i<n;i++){
		int sub = 0, add = 0;
		if(tmp[i].ss > tpp.top() * -1){
			sub = tpp.top()*-1;
			add = tmp[i].ss;
			tpp.pop();
			tpp.push(-tmp[i].ss);
		}
		ss[i] = ss[i-1] - sub + add;
	}
	
	for(int i=0;i<n;i++) ans = max(ans, ss[i] + mm[i+1]); //cout<<ss[i]<<" " <<mm[i]<<"\n";
	cout<<ans<<"\n";
	return;
}

int main(){
	fastios
	int t = 1;
	if(t) solve();
	else {
		cin>>t;
		while (t--) solve();
	}
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...