Submission #14389

#TimeUsernameProblemLanguageResultExecution timeMemory
14389kriiiPalembang Bridges (APIO15_bridge)C++14
100 / 100
1323 ms22008 KiB
#include <stdio.h>
#include <functional>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
using namespace std;

struct intv{
	intv(long long s_, long long e_){
		s = s_; e = e_;
	}
	long long s,e;
};
bool cmpm(const intv &a, const intv &b){return a.s + a.e < b.s + b.e;}
vector<intv> seg;
set<int> xs;

map<int, int, greater<int> > A[2]; long long sza[2],sa[2];
map<int, int> B[2]; long long szb[2],sb[2];

int K,N;

void push(int i, int x)
{
	A[i][x]++; sza[i]++; sa[i] += x;
	int p = A[i].begin()->first;
	B[i][p]++; szb[i]++; sb[i] += p;
	if (--A[i][p] == 0) A[i].erase(p); sza[i]--; sa[i] -= p;
	if (szb[i] > sza[i]){
		p = B[i].begin()->first;
		A[i][p]++; sza[i]++; sa[i] += p;
		if (--B[i][p] == 0) B[i].erase(p); szb[i]--; sb[i] -= p;
	}
}

void pop(int i, int x)
{
	if (A[i].count(x)){
		if (--A[i][x] == 0) A[i].erase(x); sza[i]--; sa[i] -= x;
	}
	else if (B[i].count(x)){
		if (--B[i][x] == 0) B[i].erase(x); szb[i]--; sb[i] -= x;
	}
	while (sza[i] >= szb[i] + 2){
		int p = A[i].begin()->first;
		B[i][p]++; szb[i]++; sb[i] += p;
		if (--A[i][p] == 0) A[i].erase(p); sza[i]--; sa[i] -= p;
	}
	while (sza[i] + 1 <= szb[i]){
		int p = B[i].begin()->first;
		A[i][p]++; sza[i]++; sa[i] += p;
		if (--B[i][p] == 0) B[i].erase(p); szb[i]--; sb[i] -= p;
	}
}

long long sum(int i)
{
	if (A[i].empty()) return 0;
	long long pos = A[i].begin()->first, res = 0;
	res += pos * sza[i] - sa[i];
	res += sb[i] - pos * szb[i];
	return res;
}

int main()
{
	long long ans = 0;
	scanf ("%d %d ",&K,&N);
	while (N--){
		char a,b; int x,y;
		scanf ("%c %d %c %d ",&a,&x,&b,&y);
		if (a == b){
			ans += abs(x-y);
		}
		else{
			ans++;
			if (x > y) swap(x,y);
			seg.push_back(intv(x,y));

			push(0,x); push(0,y);
			xs.insert(x); xs.insert(y);
		}
	}

	if (K == 1){
		ans += sum(0);
	}
	else{
		sort(seg.begin(),seg.end(),cmpm);
		long long good = sum(0);
		for (auto p : seg){
			push(1,p.s); push(1,p.e);
			pop(0,p.s); pop(0,p.e);
			good = min(good,sum(0)+sum(1));
		}
		ans += good;
	}

	printf ("%lld\n",ans);

	return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:69:24: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf ("%d %d ",&K,&N);
                        ^
bridge.cpp:72:37: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf ("%c %d %c %d ",&a,&x,&b,&y);
                                     ^
#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...