Submission #762123

#TimeUsernameProblemLanguageResultExecution timeMemory
762123IvanJAdvertisement 2 (JOI23_ho_t2)C++17
100 / 100
1210 ms74964 KiB
#include<bits/stdc++.h>

#define x first
#define y second
#define pb push_back
#define all(a) (a).begin(), (a).end()

using namespace std;

typedef long long ll;
typedef pair<int, int> ii;

const int maxn = 5e5 + 5;

int n, pot = 1;
int x[maxn];
int e[maxn];
int T1[maxn * 4], T2[maxn * 4];
map<int, int> pos;
vector<ii> v;

void update1(int x, int v) {
	x += pot;
	T1[x] = min(T1[x], v);
	x >>= 1;
	while(x > 0) 
		T1[x] = min(T1[x * 2], T1[x * 2 + 1]), x >>= 1;	
}

void update2(int x, int v) {
	x += pot;
	T2[x] = max(T2[x], v);
	x >>= 1;
	while(x > 0) 
		T2[x] = max(T2[x * 2], T2[x * 2 + 1]), x >>= 1;	
}

int query1(int x, int lo, int hi, int a, int b) {
	if(hi < a || b < lo) return 2e9 + 1;
	if(a <= lo && hi <= b) return T1[x];
	int mid = (lo + hi) / 2;
	int L = query1(x * 2, lo, mid, a, b);
	int R = query1(x * 2 + 1, mid + 1, hi, a, b);
	return min(L, R);	
}

int query2(int x, int lo, int hi, int a, int b) {
	if(hi < a || b < lo) return -2e9 - 1;
	if(a <= lo && hi <= b) return T2[x];
	int mid = (lo + hi) / 2;
	int L = query2(x * 2, lo, mid, a, b);
	int R = query2(x * 2 + 1, mid + 1, hi, a, b);
	return max(L, R);	
}

int check(int i, int j) {
	return abs(x[i] - x[j]) <= e[i] - e[j];	
}

int main() {
	scanf("%d", &n);
	for(int i = 0;i < n;i++) 
		scanf("%d%d", x + i, e + i);
	while(pot < n) pot <<= 1;
	for(int i = 1;i < (pot << 1);i++) 
		T1[i] = 2e9 + 1, T2[i] = -2e9 - 1;
	
	for(int i = 0;i < n;i++)
		v.pb({e[i], x[i]});
	sort(all(v));
	reverse(all(v));
	
	set<int> s;
	for(int i = 0;i < n;i++) 
		s.insert(x[i]);
	vector<int> v1(all(s));
	int m = (int)v1.size();
	for(int i = 0;i < m;i++) 
		pos[v1[i]] = i;
	
	int ans = 0;
	for(ii p : v) {
		int flag = 1;
		
		int A = query1(1, 0, pot - 1, pos[p.y], m - 1);
		int B = query2(1, 0, pot - 1, 0, pos[p.y]);
		if(p.y - p.x >= A) flag = 0;
		if(p.y + p.x <= B) flag = 0;
		ans += flag;
		if(flag) {
			update1(pos[p.y], p.y - p.x);
			update2(pos[p.y], p.y + p.x);
		}
	}
	
	printf("%d\n", ans);
	return 0;
}

Compilation message (stderr)

Main.cpp: In function 'int main()':
Main.cpp:61:7: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   61 |  scanf("%d", &n);
      |  ~~~~~^~~~~~~~~~
Main.cpp:63:8: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   63 |   scanf("%d%d", x + i, e + 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...