제출 #573244

#제출 시각아이디문제언어결과실행 시간메모리
573244guugiuhLightning Rod (NOI18_lightningrod)C++14
100 / 100
841 ms262144 KiB
#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
typedef vector<int> vi;
inline int readInt() {
    int x = 0;
    char ch = getchar_unlocked();
    while (ch < '0' || ch > '9') ch = getchar_unlocked();
    while (ch >= '0' && ch <= '9'){
		x = (x << 3) + (x << 1) + ch - '0';
		ch = getchar_unlocked();
	}
    return x;
}
 
int MinPyramids(int N, vi X, vi Y) 
{ 
    int res = 0; 
    vi T1(N + 1), T2(N + 1); 
    for (int i = 0; i < N; i++) 
        T1[N - i] = X[i] - Y[i], T2[i + 1] = X[i] + Y[i]; 
    for (int i = 0; i < N; i++) 
        if (i + (i & -i) <= N) 
            T1[i + (i & -i)] = min(T1[i + (i & -i)], T1[i]), T2[i + (i & -i)] = max(T2[i + (i & -i)], T2[i]); 
    for (int i = 0; i < N; i++) 
    { 
        int mn = 2e9+1, mx = -mn; 
        for (int j = N - i - 1; j > 0; j -= j & -j) 
            mn = min(mn, T1[j]); 
        for (int j = i; j > 0; j -= j & -j) 
            mx = max(mx, T2[j]); 
        if (mx < X[i] + Y[i] && mn > X[i] - Y[i]) 
            res++; 
    } 
    return res; 
}
 
int main(){
	int N = readInt();
	vector <int> X(N);
	vector <int> Y(N);
	for(int i = 0; i < N; i++) {
		X[i] = readInt();
		Y[i] = readInt();
	}
	int ans= MinPyramids(N,X,Y);
	printf("%d", ans);
	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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...