제출 #561981

#제출 시각아이디문제언어결과실행 시간메모리
561981maximath_1Palembang Bridges (APIO15_bridge)C++11
100 / 100
95 ms6936 KiB
#include <bits/stdc++.h>
using namespace std;

#define ll long long
int k, n;
vector<pair<int, int> > p;
ll ans = 0ll;

ll solvek1(){
	if(p.empty()) return 0ll;

	ll res = 0ll;
	vector<int> cr;
	for(int i = 0; i < p.size(); i ++){
		cr.push_back(p[i].first);
		cr.push_back(p[i].second);
		res -= (ll)(p[i].first + p[i].second);
	}

	sort(cr.begin(), cr.end());
	for(int i = 2 * (int)p.size() - 1; i >= (int)p.size(); i --)
		res += 2ll * cr[i];

	return res + (int)p.size();
}

bool cmp(pair<int, int> a, pair<int, int> b){
	return a.first + a.second < b.first + b.second;
}

vector<ll> comp(){
	priority_queue<int> mx;
	priority_queue<int, vector<int>, greater<int> > mn;
	ll sum_mx = (ll)p[0].first, sum_mn = (ll)p[0].second;

	mx.push((int)sum_mx); mn.push((int)sum_mn);
	vector<ll> tmp; tmp.push_back(sum_mn - sum_mx);

	for(int i = 1; i < p.size(); i ++){
		int mxt = mx.top(), mnt = mn.top();
		int lf = p[i].first, rg = p[i].second;
		if(lf <= mxt && rg <= mxt){
			mx.pop();
			mx.push(lf); mx.push(rg);
			mn.push(mxt);
			sum_mx += lf + rg - mxt;
			sum_mn += mxt;
		}else if(lf >= mnt && rg >= mnt){
			mn.pop();
			mn.push(lf); mn.push(rg);
			mx.push(mnt);
			sum_mn += lf + rg - mnt;
			sum_mx += mnt;
		}else{
			mx.push(lf); mn.push(rg);
			sum_mx += lf; sum_mn += rg;
		}
		tmp.push_back(sum_mn - sum_mx);
	}
	
	return tmp;
}

ll solvek2(){
	if(p.empty()) return 0ll;

	sort(p.begin(), p.end(), cmp);
	vector<ll> asc = comp();
	reverse(p.begin(), p.end());
	vector<ll> dec = comp();

	ll res = 1e18;
	for(int i = 0; i < (int)p.size() - 1; i ++)
		res = min(res, asc[i] + dec[(int)p.size() - i - 2]);
	return min(res + (ll)p.size(), solvek1());
}

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);

	cin >> k >> n;
	for(int i = 0; i < n; i ++){
		string tp1, tp2; int p1, p2;
		cin >> tp1 >> p1 >> tp2 >> p2;
		if(tp1 == tp2)
			ans += (ll)abs(p1 - p2);
		else
			p.push_back({min(p1, p2), max(p1, p2)});
	}

	cout << ans + (k == 1 ? solvek1() : solvek2()) << endl;
	return 0;
}

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

bridge.cpp: In function 'long long int solvek1()':
bridge.cpp:14:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   14 |  for(int i = 0; i < p.size(); i ++){
      |                 ~~^~~~~~~~~~
bridge.cpp: In function 'std::vector<long long int> comp()':
bridge.cpp:39:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   39 |  for(int i = 1; i < p.size(); i ++){
      |                 ~~^~~~~~~~~~
#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...