Submission #1281859

#TimeUsernameProblemLanguageResultExecution timeMemory
1281859muhammad-ahmadAdvertisement 2 (JOI23_ho_t2)C++20
59 / 100
2096 ms81052 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/tree_policy.hpp>
#include <ext/pb_ds/assoc_container.hpp>

using namespace std;
using namespace __gnu_pbds;

// #define int long long
#define ordered_set tree<int, null_type,less<int>, rb_tree_tag,tree_order_statistics_node_update>

const int N = 5e5 + 5;
int X[N] = {}, E[N] = {};

signed main(){
	
	ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
	
	int n; cin >> n;
	
	map<int, int> ma, best; 
	
	for (int i = 1; i <= n; i++){
		cin >> X[i] >> E[i];
		ma[X[i]] = max(ma[X[i]], E[i]);
	}
	
	for (int i = 1; i <= n; i++){
		if (ma[X[i]] == E[i]) best[X[i]] = i;
	}
	
	map<int, vector<int>> idx;
	
	vector<int> iter;
	
	for (int i = 1; i <= n; i++){
		if (idx[E[i]].size() == 0) iter.push_back(E[i]);
		idx[E[i]].push_back(i);
	}
	
	sort(iter.rbegin(), iter.rend());
	vector<int> a;
	for (auto i : iter){
		for (auto j : idx[i]) a.push_back(j);
	}
	
	map<int, int> vis;
	
	int ans = 0;
	ordered_set idx1, idx2;
	for (auto i : a){
		if (vis[X[i]]) continue;
		
		int it1 = idx1.order_of_key(X[i]);
		int it2 = idx2.order_of_key(-X[i]);
		
		bool F = 0;
		
		if (it1 != 0){
			auto it = idx1.find_by_order(it1 - 1);
			int j = *it;
			j = best[j];
			if (abs(X[j] - X[i]) <= E[j] - E[i]){
				F = 1;
				vis[X[i]] = 1;
			}
		}
		if (it2 != 0){
			auto it = idx2.find_by_order(it2 - 1);
			int j = *it;
			j = best[j * -1];
			if (abs(X[j] - X[i]) <= E[j] - E[i]){
				F = 1;
				vis[X[i]] = 1;
			}
		}
		if (!F) {
			ans++;
			vis[X[i]] = 1;
			idx1.insert(X[i]);
			idx2.insert(-X[i]);
		}
	}
	
	cout << ans << endl;
	
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...