제출 #363427

#제출 시각아이디문제언어결과실행 시간메모리
363427luciocfPalembang Bridges (APIO15_bridge)C++14
100 / 100
369 ms15456 KiB
#include <bits/stdc++.h>

#define ff first
#define ss second

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

const int maxn = 1e5+10;
const ll inf = 1e18+10;

struct Mediana
{
	multiset<int> lower, upper;
	ll cost_lower, cost_upper;

	void clear(void)
	{
		lower.clear(); upper.clear();
		cost_lower = cost_upper = 0;
	}

	void add(int x)
	{
		int tot = lower.size() + upper.size();

		if (tot%2)
		{
			if (x >= *upper.begin())
			{
				lower.insert(*upper.begin()); cost_lower += 1ll*(*upper.begin());
				cost_upper -= 1ll*(*upper.begin()); upper.erase(upper.begin());
				upper.insert(x); cost_upper += 1ll*x;
			}
			else
			{
				lower.insert(x); cost_lower += 1ll*x;
			}
		}
		else
		{
			if (x >= *upper.begin())
			{
				upper.insert(x); cost_upper += 1ll*x;
			}
			else
			{
				upper.insert(*lower.rbegin()); cost_upper += 1ll*(*lower.rbegin());
				cost_lower -= 1ll*(*lower.rbegin()); lower.erase(lower.find(*lower.rbegin()));
				lower.insert(x); cost_lower += 1ll*x;
			}
		}
	}

	ll get(void)
	{
		int med = *upper.begin();
		int sz_lower = lower.size(), sz_upper = upper.size();

		return (1ll*sz_lower*med - 1ll*sz_upper*med + cost_upper - cost_lower);
	}
} Med;

char t[2][maxn];
int pos[2][maxn];

ll pref[maxn], suf[maxn];

int main(void)
{
	int k, n;
	scanf("%d %d", &k, &n);

	for (int i = 1; i <= n; i++)
		scanf(" %c %d %c %d", &t[0][i], &pos[0][i], &t[1][i], &pos[1][i]);

	if (k == 1)
	{
		ll ans = 0;

		vector<int> v;

		for (int i = 1; i <= n; i++)
		{
			if (t[0][i] == t[1][i]) ans += 1ll*abs(pos[0][i]-pos[1][i]);
			else
			{
				v.push_back(pos[0][i]);
				v.push_back(pos[1][i]);
			}
		}

		if (v.size())
		{
			sort(v.begin(), v.end());

			int med = v[v.size()/2];

			for (auto x: v)
				ans += 1ll*abs(x-med);

			ans += 1ll*v.size()/2;
		}

		printf("%lld\n", ans);
		return 0;
	}

	ll ini = 0;
	vector<pii> v;

	for (int i = 1; i <= n; i++)
	{
		if (t[0][i] == t[1][i]) ini += 1ll*abs(pos[0][i]-pos[1][i]);
		else v.push_back({min(pos[0][i], pos[1][i]), max(pos[0][i], pos[1][i])});
	}

	if (v.size() == 0)
	{
		printf("%lld\n", ini);
		return 0;
	}

	sort(v.begin(), v.end(), [&] (pii a, pii b) {return 1ll*a.ff + 1ll*a.ss < 1ll*b.ff + 1ll*b.ss;});

	Med.clear();

	for (int i = 0; i < v.size(); i++)
	{
		Med.add(v[i].ff); Med.add(v[i].ss);

		pref[i] = Med.get();
	}

	Med.clear();

	for (int i = v.size()-1; i >= 0; i--)
	{
		Med.add(v[i].ff); Med.add(v[i].ss);

		suf[i] = Med.get();
	}

	ll ans = min(pref[v.size()-1], suf[0]) + ini;

	for (int i = 0; i < v.size()-1; i++)
		ans = min(ans, pref[i] + suf[i+1] + ini);

	printf("%lld\n", ans + v.size());
}

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

bridge.cpp: In function 'int main()':
bridge.cpp:130:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  130 |  for (int i = 0; i < v.size(); i++)
      |                  ~~^~~~~~~~~~
bridge.cpp:148:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::pair<int, int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  148 |  for (int i = 0; i < v.size()-1; i++)
      |                  ~~^~~~~~~~~~~~
bridge.cpp:74:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   74 |  scanf("%d %d", &k, &n);
      |  ~~~~~^~~~~~~~~~~~~~~~~
bridge.cpp:77:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   77 |   scanf(" %c %d %c %d", &t[0][i], &pos[0][i], &t[1][i], &pos[1][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...