Submission #25069

#TimeUsernameProblemLanguageResultExecution timeMemory
25069kajebiiiPalembang Bridges (APIO15_bridge)C++14
100 / 100
123 ms7596 KiB
#include <bits/stdc++.h>

using namespace std;

#define REP(i,n) for(int (i)=0;(i)<(int)(n);(i)++)
#define REPO(i,n) for(int (i)=1; (i)<=(int)(n); (i)++)
#define SZ(v) ((int)(v).size())
#define ALL(v) (v).begin(),(v).end()
#define one first
#define two second
typedef long long ll;
typedef pair<int, int> pi;
const int INF = 0x3f2f1f0f;
const ll LINF = 1ll * INF * INF;

struct PT {
	int x, y;
	PT() {}
	PT(int xx, int yy) : x(xx), y(yy) {}
	bool operator<(const PT &o) const{return x+y < o.x+o.y;}
};
struct SOL {
	priority_queue<int> m; //minus slope
	priority_queue<int, vector<int>, greater<int> > p; //plus slope;
	ll ans;
	SOL() : ans(0) {}
	void add(int l, int r) {
		m.push(l); p.push(r);
//		printf("%d %d add\n", l, r);
		while(true) {
			int mm = m.top();
			int pp = p.top(); 
			if(mm <= pp) return;
			p.pop(); m.pop();
			ans += abs(pp - mm);
			m.push(pp); p.push(mm);
//			printf("%d %d pop\n", mm, pp);
//			printf("%d %d push\n", pp, mm);
		}
	}
};

const int MAX_N = 1e5 + 100;

int K, N;
ll Ans = 0;
vector<PT> Ps;
ll DyL[MAX_N], DyR[MAX_N];
int main() {
	cin >> K >> N;
	REP(i, N) {
		char sa[3], sb[3]; int x, y;
		scanf("%s%d%s%d", sa, &x, sb, &y);
		if(sa[0] != sb[0]) {
			Ans += 1;
			Ps.push_back(PT(min(x, y), max(x, y)));
		}
		Ans += abs(x-y);
	}
	sort(ALL(Ps));

	if(K == 1) {
		SOL sol;
		for(PT &p : Ps) sol.add(p.x, p.y);
		Ans += sol.ans * 2;
		printf("%lld\n", Ans);
	} else {
		SOL lsol, rsol;
		for(int i=0; i<SZ(Ps); i++) {
			PT &p = Ps[i];
			lsol.add(p.x, p.y);
			DyL[i+1] = lsol.ans * 2;
		}
		for(int i=SZ(Ps)-1; i>=0; i--) {
			PT &p = Ps[i];
			rsol.add(p.x, p.y);
			DyR[i+1] = rsol.ans * 2;
		}

		ll nowAns = LINF;
		for(int i=0; i<=SZ(Ps); i++)
			nowAns = min(nowAns, DyL[i] + DyR[i+1]);
		Ans += nowAns;
		printf("%lld\n", Ans);
	}
	return 0;
}

Compilation message (stderr)

bridge.cpp: In function 'int main()':
bridge.cpp:53:36: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%s%d%s%d", sa, &x, sb, &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...