제출 #1325190

#제출 시각아이디문제언어결과실행 시간메모리
1325190Ivo_12ČVENK (COI15_cvenk)C++20
17 / 100
3092 ms2804 KiB
#include <bits/stdc++.h>
#define ll long long
#define mp make_pair
#define F first
#define S second
#define pii pair < int, int >
#define pb push_back
#define FIO ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0)

using namespace std;

const ll N = 1e5+10, logA = 30;
ll n;

bool cussort( pii a, pii b ) {
	return (a.F & ((1<<31) - (1<<(32 - __builtin_clz(a.S))))) < (b.F & ((1<<31) - (1<<(32 - __builtin_clz(b.S)))));
}

ll find_lca(vector < pii >* v ) {
	
	if((ll) v->size() == 0) return 0;
	vector < pii > v1;
	vector < pii > v2;
	vector < pii > tempv;
	
//	cout << (ll) v->size() << ":\n";
//	for(ll i = 0; i < (ll) v->size(); i++) cout << (*v)[i].F << " " << (*v)[i].S << "\n";
//	cout << "\n";
	
	vector < pair < ll, ll > > dist_v;
	
	ll out = 0;
	
	for(ll i = 0; i < (ll) v->size(); i++) {
		if((*v)[i] == mp(0, 0)) continue;
		
		if((*v)[i].F > (*v)[i].S) v1.pb((*v)[i]);
		else v2.pb(mp((*v)[i].S, (*v)[i].F));
	}
	
	sort(v1.begin(), v1.end(), cussort);
	sort(v2.begin(), v2.end(), cussort);
	
	ll cur = 0;
	if((ll) v1.size() > 0) cur = (v1[0].F & ((1<<31) - (1<<(32 - __builtin_clz(v1[0].S))) + (v1[0].S == 0 ? 1 : 0)));
	
	for(ll i = 0; i < (ll) v1.size(); i++) {
		if(cur != (v1[i].F & ((1<<31) - (1<<(32 - __builtin_clz(v1[i].S))) + (v1[0].S == 0 ? 1 : 0)))) {
			out += find_lca(&tempv);
			dist_v.pb(mp((ll) tempv.size(), (ll) -cur));
//			cout << mp((ll) tempv.size(), (ll) -cur).F << " " << mp((ll) tempv.size(), (ll) -cur).S << "X\n";
			
			tempv.clear();
			cur = (v1[i].F & ((1<<31) - (1<<(32 - __builtin_clz(v1[i].S))) + (v1[0].S == 0 ? 1 : 0)));
		}
		
		tempv.pb(mp(v1[i].F - cur, v1[i].S));
	}
	
	out += find_lca(&tempv);
	if(tempv.size() != 0) dist_v.pb(mp((ll) tempv.size(), -cur));
	tempv.clear();
	
	reverse(dist_v.begin(), dist_v.end());
	
	dist_v.pb(mp(n - (ll) v->size(), 0));
	
	if((ll) v2.size() > 0) cur = (v2[0].F & ((1<<31) - (1<<(32 - __builtin_clz(v2[0].S))) + (v2[0].S == 0 ? 1 : 0)));
	
	for(ll i = 0; i < (ll) v2.size(); i++) {
		if(cur != (v2[i].F & ((1<<31) - (1<<(32 - __builtin_clz(v2[i].S))) + (v2[0].S == 0 ? 1 : 0)))) {
			out += find_lca(&tempv);
			dist_v.pb(mp((ll) tempv.size(), cur));
//			cout << mp((ll) tempv.size(), (ll) -cur).F << " " << mp((ll) tempv.size(), (ll) -cur).S << "X\n";
			
			tempv.clear();
			cur = (v2[i].F & ((1<<31) - (1<<(32 - __builtin_clz(v2[i].S))) + (v2[0].S == 0 ? 1 : 0)));
		}
		
		tempv.pb(mp(v2[i].F - cur, v2[i].S));
	}
	
	out += find_lca(&tempv);
	if(tempv.size() != 0) dist_v.pb(mp((ll) tempv.size(), cur));
	tempv.clear();
	
	ll visamnt = 0;
	ll pos = 0;
	for(ll i = 0; i < (ll) dist_v.size(); i++) {
		visamnt += dist_v[i].F;
		if(visamnt >= n / 2 && !pos) pos = i + 1;
	}
	
	pos--;
	
//	cout << pos << "\n";
	for(ll i = 0; i < (ll) dist_v.size(); i++) {
		out += (ll) dist_v[i].F * abs(dist_v[i].S - dist_v[pos].S);
//		cout << dist_v[i].F << " " << dist_v[i].S << "Y\n";
	}
	
//	cout << out << "\n\n";
	
	return out;
}

void task( void ) {
	
	cin >> n;
	vector < pii > tempv;
	
	pii temp;
	for(ll i = 0; i < n; i++) {
		cin >> temp.F >> temp.S;
		tempv.pb(temp);
	}
	
	cout << find_lca(&tempv) << "\n";
	
	return;
}

int main( void ) {
	
//	FIO;
	ll tt = 1;
	while(tt--) task();
	
	return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...