제출 #1339062

#제출 시각아이디문제언어결과실행 시간메모리
1339062po_rag526Sails (IOI07_sails)C++20
0 / 100
255 ms17636 KiB
#include <bits/stdc++.h>
#define int long long
#define F first
#define S second
#define pb push_back
using namespace std;

using pr = pair<int, int>;
// seggy, range query point update + diff array
const int MXN = (1 << 26) - 1;
struct Node {
	Node *l = nullptr, *r = nullptr;
	int val = 0;
};

void pull(Node *u) {
	if(u->l == nullptr) u->l = new Node;
	if(u->r == nullptr) u->r = new Node;
}

int query(Node *u, int l, int r, int lh, int rh) {
	pull(u);
	if(lh >= l and r >= rh) return u->val;
	if(rh < l or r < lh) return 0;
	int m = (lh + rh)/2;
	return query(u->l, l, r, lh, m) + query(u->r, l, r, m+1, rh);
}

void update(Node *u, int i, int x, int lh, int rh) {
	pull(u);
	if(lh == rh) {
		u->val = x;
		return;
	}

	int m = (lh+rh)/2;
	if(i <= m) update(u->l, i, x, lh, m);
	else update(u->r, i, x, m+1, rh);
	u->val = u->l->val + u->r->val;
}

Node *root = new Node;
// adds k to [l, r]
void updater(int l, int r, int k) {
	update(root, l, k, 0, MXN);
	update(root, r+1, -k, 0, MXN);
}

void updatep(int i, int k) {
	update(root, i, k, 0, MXN);
}

int queryr(int l, int r) {
	return query(root, l, r, 0, MXN);
}

void solve() {
	int n; cin >> n;
	vector<pr> gg(n);
	for(int i = 0 ; i < n ; i++) {
		cin >> gg[i].F >> gg[i].S;
	}

	// SORT BY H - K AND EITHER SET TO TOP OR DOWN
	vector<pair<pr, int>> hehe(n);
	for(int i = 0 ; i < n ; i++) {
		hehe[i].F = gg[i];
		hehe[i].S = i;
	}

	int mx = 0;
	for(int i = 0 ; i < n ; i++) {
		mx = max(mx, gg[i].S);
	}

	vector<int> prf(mx+1, 0);
	sort(gg.begin(), gg.end(), [](pr a, pr b) {
		return a.F > b.F;
	});

	// started from the bottom
	for(int i = 0 ; i < n ; i++) {
		prf[0]++;
		prf[gg[i].S]--;
	}

	for(int i = 1 ; i <= mx ; i++) prf[i] += prf[i-1];
	int s = 0;
	for(int i = 0 ; i <= mx ; i++) {
		updatep(i, prf[i]);
		// cout << i << " " << max(0LL, prf[i]-1) << endl;
		s += prf[i]*(prf[i]-1)/2;
	}

	// cout << "G" << queryr(0, mx) << endl;
	int ares = s;
	// cout << ares << endl;
	for(int i = 0 ; i < n ; i++) {
		int a = queryr(0, gg[i].S);
		s -= a;
		updater(0, gg[i].S-1, -1);
		updater(gg[i].F-gg[i].S, gg[i].F, 1);
		int b = queryr(gg[i].F-gg[i].S, gg[i].F);
		// cout << i << " " << a << " " << b << endl;
		s += b;
		ares = min(ares, s);
	}

	cout << ares << endl;
}

signed main() {
	int t = 1; // cin >> t;
	while(t--) solve();
}
#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...
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...