Submission #650883

#TimeUsernameProblemLanguageResultExecution timeMemory
650883AmirHPalembang Bridges (APIO15_bridge)C++14
100 / 100
443 ms15928 KiB
#include<bits/stdc++.h>


using namespace std;
typedef long long int ll;


#define pb push_back
#define faster ios::sync_with_stdio(0), cin.tie(0), cout.tie(0)
#define pii pair<int, int>

const int MAX_N = 2e5+25;

ll n, k;
vector<pair<ll, pair<ll, ll>>> v;
vector<pair<ll, ll>> vtx;
ll sum = 0;
multiset<ll> a, b;
multiset<ll> c, d;
ll suma, sumb, sumc, sumd;
ll mini = 1e18;

void print() {
	ll res = 0;
	ll p1 = 0;
	ll p2 = 0;
	ll p3 = 0;
	ll p4 = 0;
	if(a.size() > 0)
		p1 = ((*a.rbegin()) * a.size()) - suma;
	if(b.size() > 0)
		p2 = sumb - ((*a.rbegin()) * b.size());
	if(c.size() > 0) 
		p3 += ((*c.rbegin()) * c.size()) - sumc;
	if(d.size() > 0)
		p4 += sumd - ((*c.rbegin()) * d.size());
	res = p1 + p2 + p3 + p4;
 	mini = min(mini, res);
}

void handle(multiset<ll> & s, multiset<ll> & f, ll & sum1, ll & sum2) {
	while(s.size() > f.size() && s.size() - f.size() >= 2) {
		ll x = *s.rbegin();
		sum1 -= x;
		sum2 += x;
		s.erase(s.find(x));
		f.insert(x);
	}
	while(f.size() > s.size()) {
		ll x = *f.begin();
		sum1 += x;
		sum2 -= x;
		f.erase(f.begin());
		s.insert(x);
	}
}

void add(int y) {
	if(a.size() == 0) {
		a.insert(y);
		suma += y;
	}
	else {
		if(y > *a.rbegin()) {
			sumb += y;
			b.insert(y);
		}
		else {
			suma += y;
			a.insert(y);
		}
	}
	if(y > *c.rbegin()) {
		d.erase(d.find(y));
		sumd -= y;
	}
	else {
		sumc -= y;
		c.erase(c.find(y));
	}
	handle(a, b, suma, sumb);
	handle(c, d, sumc, sumd);
}

void solve() {
	sort(v.begin(), v.end());
	for(auto i : v) {
		vtx.pb({i.second.first, i.second.second});
	}
	for(auto i : vtx) {
		c.insert(i.first);
		c.insert(i.second);
		sumc += i.first;
		sumc += i.second;
	}
	handle(c, d, sumc, sumd);
	print();
	for(int i = 0; i < vtx.size(); i++) {
		add(vtx[i].first);
		add(vtx[i].second);
		print();
	}
}

void input() {
	cin >> k >> n;
	if(k == 1) {
		vector<int> cnt;
		for(int i = 1; i <= n; i++) {
			char a, b; 
			ll x, y;
			cin >> a >> x >> b >> y;
			if(a != b) {
				sum++;
				cnt.pb(x);
				cnt.pb(y);
			}
			else {
				sum += abs(x - y);
			}
		}
		sort(cnt.begin(), cnt.end());
		ll mid = cnt[(cnt.size() - 1) / 2];
		for(auto i : cnt) {
			sum += abs(i - mid);
		}
		cout << sum;
	}
	else {
		for(int i = 1; i <= n; i++) {
			char a, b; 
			ll x, y;
			cin >> a >> x >> b >> y;
			if(a != b)
				v.pb({x + y, {x, y}});
			else
				sum += abs(x - y);
		}
		if(v.size() == 0)
			cout << sum;
		else {
			solve();
			cout << sum + mini + v.size();
		}
	}
}

int main() {
	faster;
	input();
}

Compilation message (stderr)

bridge.cpp: In function 'void solve()':
bridge.cpp:98:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   98 |  for(int i = 0; i < vtx.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...