Submission #238141

#TimeUsernameProblemLanguageResultExecution timeMemory
238141wwddPalembang Bridges (APIO15_bridge)C++14
100 / 100
578 ms44004 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll,ll> pl;
typedef vector<ll> vl;
typedef vector<pl> vpl;
class ST {
	private:
		ll n;
		int h;
		vl st;
	public:
		ST(int n_) {
			h = 1;n = 1;
			while(n < n_) {
				n <<= 1;
				h++;
			}
			st.assign(2*n,0);
		}
		void up(ll p, ll val) {
			p += n;
			st[p] += val;
			while(p > 1) {
				st[p>>1] = st[p] + st[p^1];
				p >>= 1;
			}
		}
		ll get(int l, int r) {
			ll res = 0;
			for(l += n,r += n;l<r;l>>=1,r>>=1) {
				if(l&1) {
					res += st[l];
					l++;
				}
				if(r&1) {
					--r;
					res += st[r];
				}
			}
			return res;
		}
		int kth(int u) {
			int p = 1;
			for(int i=1;i<h;i++) {
				p <<= 1;
				if(st[p] < u) {
					u -= st[p];p++;
				}
			}
			return p-n;
		}
		inline ll size() {return n;}
};
vpl w;
ll wol() {
	vl wa;
	sort(w.begin(),w.end(),[&](const pl& a, const pl& b) {
			return a.first + a.second < b.first + b.second;
			});
	for(int i=0;i<w.size();i++) {
		wa.push_back(w[i].first);
		wa.push_back(w[i].second);
	}
	map<ll,ll> mu;
	sort(wa.begin(),wa.end());
	for(int i=0;i<wa.size();i++) {
		mu[wa[i]] = i;
	}
	vl rac(w.size()+1,0);
	int rid = 0;
	ST sa(wa.size()),sb(wa.size()),ra(wa.size()),rb(wa.size()),kt(wa.size());
	ll res = 1e18;
	for(int i=0;i<w.size();i++) {
		int ia = mu[w[i].first];
		int ib = mu[w[i].second];
		sa.up(ib,w[i].second);
		sb.up(ib,1);
		kt.up(ib,1);
		ra.up(ia,w[i].first);
		rb.up(ia,1);
		kt.up(ia,1);
		int mi = kt.kth(i+1);
		ll x = wa[mi];
		rac[i+1] += 2*(x*sb.get(0,mi)-sa.get(0,mi) + ra.get(mi,ra.size()) - x*rb.get(mi,rb.size()));
	}
	sa = ST(wa.size());
	sb = ST(wa.size());
	ra = ST(wa.size());
	rb = ST(wa.size());
	kt = ST(wa.size());
	for(int i=w.size()-1;i>=0;i--) {
		int ia = mu[w[i].first];
		int ib = mu[w[i].second];
		sa.up(ib,w[i].second);
		sb.up(ib,1);
		kt.up(ib,1);
		ra.up(ia,w[i].first);
		rb.up(ia,1);
		kt.up(ia,1);
		int mi = kt.kth(w.size()-i);
		ll x = wa[mi];
		rac[i] += 2*(x*sb.get(0,mi)-sa.get(0,mi) + ra.get(mi,ra.size()) - x*rb.get(mi,rb.size()));
	}
	for(int i=0;i<rac.size();i++) {
		res = min(res,rac[i]);
	}
	return res;
}
ll lol() {
	vl wa;
	for(int i=0;i<w.size();i++) {
		wa.push_back(w[i].first);
		wa.push_back(w[i].second);
	}
	sort(wa.begin(),wa.end());
	ll pos = wa[wa.size()/2];
	ll res = 0;
	for(int i=0;i<w.size();i++) {
		res += abs(w[i].first-pos) + abs(pos-w[i].second);
	}
	return res;
}
int main() {
	ios::sync_with_stdio(0);cin.tie(0);
	int k,n;
	cin >> k >> n;
	ll wad = 0;
	ll nev = 0;
	for(int i=0;i<n;i++) {
		char ca,cb;
		ll a,b;
		cin >> ca >> a >> cb >> b;
		if(ca == cb) {
			wad += abs(a-b);
		} else {
			wad++;
			nev += max(a,b)-min(a,b);
			w.push_back({min(a,b),max(a,b)});
		}
	}
	sort(w.begin(),w.end());
	ll res = -1;
	if(k == 1) {
		res = lol();
	} else {
		res = wol();
		res += nev;
	}
	cout << res+wad << '\n';
}

Compilation message (stderr)

bridge.cpp: In function 'll wol()':
bridge.cpp:61:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<w.size();i++) {
              ~^~~~~~~~~
bridge.cpp:67:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<wa.size();i++) {
              ~^~~~~~~~~~
bridge.cpp:74:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<w.size();i++) {
              ~^~~~~~~~~
bridge.cpp:105:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<rac.size();i++) {
              ~^~~~~~~~~~~
bridge.cpp:71:6: warning: unused variable 'rid' [-Wunused-variable]
  int rid = 0;
      ^~~
bridge.cpp: In function 'll lol()':
bridge.cpp:112:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<w.size();i++) {
              ~^~~~~~~~~
bridge.cpp:119:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<w.size();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...