Submission #697770

#TimeUsernameProblemLanguageResultExecution timeMemory
697770ajstillpracticinPalembang Bridges (APIO15_bridge)C++17
100 / 100
85 ms5664 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
#define fi first
#define se second
#define pb push_back

#define sz(x) int((x).size())

int dx[4]{-1,0,1,0};
int dy[4]{0,1,0,-1};

void setIO(string filename=""){
	ios_base::sync_with_stdio(0); cin.tie(0);
	if(filename.size()){
		freopen((filename + ".in").c_str(), "r", stdin);
		freopen((filename + ".out").c_str(), "w", stdout);
	}
}

struct dsu {
	vector<int> e;
	dsu(int N) { e=vector<int>(N,-1); }

	int get(int x) { return e[x]<0 ? x : e[x]=get(e[x]); }

	bool same_set(int a, int b) { return get(a)==get(b); }

	int size(int x) { return -e[get(x)]; }

	bool unite(int x, int y){
		x=get(x),y=get(y);
		if(x==y) return false;
		if(e[x] > e[y]) swap(x,y);
		e[x]+=e[y]; e[y]=x; return true;
	}
};

const int INF=(int) 1e9;
const int M= 1e9+7;
const ll MAXD = 1e18;
const int P = 1e6;

//
const int MAXN = 1e5+5;

ll pref[MAXN];
ll rsum,lsum;

priority_queue<int> lpq;
priority_queue<int,vector<int>,greater<int>> rpq;

bool cmp(pair<int,int> a, pair<int,int> b) {
	return a.fi + a.se < b.fi + b.se;
}

void insert(int x){
	int median=(lpq.size() ? lpq.top() : INF);
	if(x <= median) {
		lpq.push(x);
		lsum+=x;
	} else {
		rpq.push(x);
		rsum+=x;
	}

	if(rpq.size() + 1 < lpq.size()){
		int nxt=lpq.top();
		lpq.pop();
		rpq.push(nxt);
		lsum-=nxt;
		rsum+=nxt;
	} else if(lpq.size() < rpq.size()){
		int nxt=rpq.top();
		rpq.pop();
		lpq.push(nxt);
		rsum-=nxt;
		lsum+=nxt;
	}
}

int main() {

	setIO();

	int k,n;
	cin >> k >> n;

	ll same_side=0;
	vector<pair<int,int>> v={{0,0}};
	for(int i=0;i<n;++i){
		char a,b;
		int x,y;
		cin >> a >> x >> b >> y;
		if(a==b)
			same_side += abs(x-y);
		else
			v.push_back({x,y});
	}

	sort(v.begin(),v.end(),cmp);
	n=v.size()-1;
	same_side+=n;

	lsum = rsum = 0;
	for(int i=1;i<=n;++i){
		insert(v[i].fi);
		insert(v[i].se);
		pref[i] = rsum - lsum;
	}

	ll ans=pref[n];

	if(k==2){
		while(lpq.size())
			lpq.pop();
		while(rpq.size())
			rpq.pop();
		lsum=rsum=0;

		for(int i=n;i;--i){
			insert(v[i].fi);
			insert(v[i].se);
			ans=min(ans, rsum-lsum + pref[i-1]);
		}
	}

	cout << same_side + ans << "\n";
}

Compilation message (stderr)

bridge.cpp: In function 'void setIO(std::string)':
bridge.cpp:17:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   17 |   freopen((filename + ".in").c_str(), "r", stdin);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bridge.cpp:18:10: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   18 |   freopen((filename + ".out").c_str(), "w", stdout);
      |   ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#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...