제출 #90782

#제출 시각아이디문제언어결과실행 시간메모리
90782YottaByteSchools (IZhO13_school)C++14
0 / 100
2073 ms35720 KiB
#include <iostream>
#include <queue>

using namespace std;

#define pb push_back
#define mk make_pair
#define fr first
#define sc second
#define ll long long
#define int long long
#define pii pair < int, int >

const int N = 3e5 + 1;

priority_queue < pair < int, pii > > v;
priority_queue < pair < int, pii > > vm;
priority_queue < pair < int, pii >, vector < pair < int, pii > >, greater < pair < int, pii > > > pq;
ll ans;
int u[N], um[N], us[N], ii;

int maxim()
{
	int id = vm.top().sc.sc;
	int res = vm.top().fr;
	if(!vm.size())
	{
		return -1e11;
	}
	while(u[id] && vm.size())
	{
		vm.pop();
		id = vm.top().sc.sc;
		res = vm.top().fr;
	}
	
	ii = id;
	return res;
}

int maxs(priority_queue < pair < int, pii > > temp)
{
	int id = temp.top().sc.sc;
	int res = temp.top().fr;

	if(!temp.size())
	{
		return 1e11;
	}
	
	while(u[id] && temp.size())
	{
		temp.pop();
		id = temp.top().sc.sc;
		res = temp.top().fr;
	}
	
	return res;
}

main()
{
	int n, m, s;
	cin >> n >> m >> s;
	for(int i = 1; i <= n; i++)
	{
		int a, b;
		cin >> a >> b;
		v.push( { b, {a, i} } );
		vm.push( { a, {b, i} } );
		pq.push( { a, {b, i} } );
	}
	
	int cnt = n - m - s;
	if(m + s == n)
	{
		while(s--)
		{
			int mx = v.top().fr, id = v.top().sc.sc;
			
			v.pop();
			
			u[id] = 1;
			
			//cout << id + 1 << endl;
			
			u[id] = 1;
			ans += mx;
		}
		
		while(cnt)
		{
			int id = pq.top().sc.sc;
			int mn = pq.top().fr;
			pq.pop();
			
			if(u[id]) continue;
			
		//puts("Del");
			//cout << id + 1 << endl;
			
			cnt--;
			u[id] = 1;
			ans -= mn;
		}
	}
	else
	{
		while(m--)
		{
			int mx = vm.top().fr;
			int id = vm.top().sc.sc;
			us[id] = vm.top().sc.fr;
			vm.pop();
			
			u[id] = 1;
			um[id] = mx;
			
			ans += mx;
		}
		
		while(s)
		{
			int mx = v.top().fr;
			int id = v.top().sc.sc;
			v.pop();
			
			if(um[id])
			{
				int mxm = maxim();
				int tmp = ans + us[id] - um[id] + mxm;
				
				mx = maxs(v);
				if(ans + mx < tmp)
				{
					ans = tmp;
					s--;
					u[ii] = 1;
					um[ii] = mxm;
					us[ii] = mx;
					if(vm.size())
						vm.pop();
				}
			}
			else
			{
				u[id] = 1;
				ans += mx;
				s--;
			}
		}
	}
	
	cout << ans << endl;
}
/*
3 1 1
5 2
4 1
6 4

7 2 3
9 8
10 6
3 5
1 7
5 7
6 3
5 4

4 1 1
6 16
2 14
4 5
15 19
*/

컴파일 시 표준 에러 (stderr) 메시지

school.cpp:61:6: warning: ISO C++ forbids declaration of 'main' with no type [-Wreturn-type]
 main()
      ^
#Verdict Execution timeMemoryGrader output
Fetching results...