제출 #1164995

#제출 시각아이디문제언어결과실행 시간메모리
1164995pinbuAdvertisement 2 (JOI23_ho_t2)C++20
59 / 100
1635 ms29056 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 500005;
const long long oo = 1e18;

int n;
pair<int, int> a[N], b[N];
map<pair<int, int>, vector<int>> m1, m2;
vector<int> idas, idbs;
void solve(void) {
	cin >> n;
	for (int i = 1, x, e; i <= n; i++) {
		cin >> x >> e;
		a[i] = {x, x + e}; b[i] = {x, x - e};
		m1[a[i]].emplace_back(i);
		m2[b[i]].emplace_back(i);
	}
	sort(a + 1, a + 1 + n, [&] (const pair<int, int> &X, const pair<int, int> &Y) {
		return X.first < Y.first || (X.first == Y.first && X.second >= Y.second);
	});
	sort(b + 1, b + 1 + n, [&] (const pair<int, int> &X, const pair<int, int> &Y) {
		return X.first < Y.first || (X.first == Y.first && X.second >= Y.second);
	});
	for (int i = n; i; i--) {
		while (!idas.empty() && a[i].second >= a[idas.back()].second) idas.pop_back();
		idas.emplace_back(i);
	}
	reverse(begin(idas), end(idas));
	for (int i = 1; i <= n; i++) {
		while (!idbs.empty() && b[i].second <= b[idbs.back()].second) idbs.pop_back();
		idbs.emplace_back(i);
	}
	int ans = 0;
	for (int i = 0, j = 0; i < (int)idas.size() && j < (int)idbs.size();) {
		int i1 = idas[i], i2 = idbs[j];
		if (a[i1].first < b[i2].first) i++;
		else if (a[i1].first > b[i2].first) j++;
		else {
			for (int ii = 0, jj = 0; ii < (int)m1[a[i1]].size() && jj < (int)m2[b[i2]].size();) {
				int x = m1[a[i1]][ii], y = m2[b[i2]][jj];
				if (x < y) ii++;
				else if (x > y) jj++;
				else {
					ans++;
					break;
				}
			}
			i++;
			j++;
		}
	}
	cout << ans;
}

signed main(void) {
    ios::sync_with_stdio(false); cin.tie(nullptr);
    
    solve();
    
    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...