제출 #25504

#제출 시각아이디문제언어결과실행 시간메모리
25504gabrielsimoesPalembang Bridges (APIO15_bridge)C++14
22 / 100
79 ms8256 KiB
#include <bits/stdc++.h>
using namespace std;
 
typedef long long ll;
typedef pair<ll,ll> pll;

#define med q1.top()

struct Median{
	priority_queue<ll, vector<ll>, less<ll>> q1;
	priority_queue<ll, vector<ll>, greater<ll>> q2;
	ll sum1, sum2;
	
	Median() : sum1(0), sum2(0) {};
	void insert(ll x) {
		if (!q1.empty() && x >= med) q2.push(x), sum2 += x;
		else q1.push(x), sum1 += x;
		
		if (q1.size() > q2.size()+1) {
			q2.push(q1.top());
			sum2 += q1.top();
			sum1 -= q1.top();
			q1.pop();
		} else if (q1.size() < q2.size()) {
			q1.push(q2.top());
			sum1 += q2.top();
			sum2 -= q2.top();
			q2.pop();
		}
	}
	
	ll get() { 
		return med * ll(q1.size()) - sum1 +
			   sum2 - med * q2.size();
	}
};

int main()
{
	int M, N;
	scanf("%d %d", &M, &N);
 
	char a,c;
	ll b,d, ans0 = 0;
	vector<pll> v;
	for (int i = 0; i < N; i++) {
		scanf(" %c %lld %c %lld",&a, &b,&c, &d);
		if (d < b) swap(b,d);
 
		if (a == c) ans0 += d - b, N--, i--;
		else v.push_back(pll(b,d)), ans0++;
	}
 
	if (v.empty()) {
		printf("%lld\n", ans0);
		return 0;
	}
 
	if (M == 1) {
		vector<ll> all;
		for (pll p : v)
			all.push_back(p.first), all.push_back(p.second);
		sort(all.begin(), all.end());
		ll x = all[all.size()/2 - 1];
		for (ll y : all)
			ans0 += abs(y - x);
		printf("%lld\n", ans0);
		return 0;
	} else {
		sort(v.begin(), v.end(), [&](pll a, pll b){return a.first+a.second<b.first+b.second;});
		vector<ll> ans(N, ans0);
		
		Median *mm = new Median();
		for (int i = 0; i < N; i++) {
			mm->insert(v[i].first);
			mm->insert(v[i].second);
			ans[i] += mm->get();
		}
		
		mm = new Median();
		for (int i = N-1; i >= 0; i--) {
			mm->insert(v[i].first);
			mm->insert(v[i].second);
			ans[i-1] += mm->get();
		}
		
		ll ans0 = ans[0];
		for (int i = 1; i < N; i++) ans0 = min(ans0, ans[i]);
		printf("%lld\n", ans0);
	}
}

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

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