Pagini recente » Cod sursa (job #1970216) | Cod sursa (job #2500070) | Cod sursa (job #1812311) | Cod sursa (job #990496) | Cod sursa (job #467304)
Cod sursa(job #467304)
#include <fstream>
#include <vector>
#include <algorithm>
#include <set>
#include <cstring>
using namespace std;
#define foreach(V) for(typeof (V).begin() it = (V).begin(); it != (V).end(); ++it)
#define foreach_r(V) for(typeof (V).rbegin() it = (V).rbegin(); it != (V).rend(); ++it)
const int MAX_N = 100005;
ifstream fin ("cadrane.in");
ofstream fout ("cadrane.out");
int N, Sol = 0, Nx, Ny, X[MAX_N], Y[MAX_N], Cnt[MAX_N];
pair <int, int> C[MAX_N];
set <int> Su, Sd;
vector <int> G[MAX_N];
void citire() {
fin >> N;
for(int i = 1; i <= N; ++i) {
int x, y;
fin >> x >> y;
swap(x, y);
C[i] = make_pair(x, y);
X[i] = x;
Y[i] = y;
}
}
void norm() {
sort(X+1, X+N+1);
Nx = unique(X+1, X+N+1)-X-1;
sort(Y+1, Y+N+1);
Ny = unique(Y+1, Y+N+1)-Y-1;
for(int i = 1; i <= N; ++i) {
int y = lower_bound(Y+1, Y+Ny+1, C[i].second) - Y;
int x = lower_bound(X+1, X+Nx+1, C[i].first) - X;
++Cnt[x];
G[y].push_back(x);
Su.insert(x);
}
}
void solve() {
int s1[MAX_N], s2[MAX_N];
for(int i = 1; i <= Ny; ++i) {
foreach(G[i]) {
Sd.insert(*it);
}
/* if(i == 2) {
for(int i = 1; i <= N; ++i) {
printf("%d %d\n", i, Cnt[i]);
}
foreach(Su) {
printf("%d ", *it);
}
printf("\n");
foreach(Sd) {
printf("%d ", *it);
}
}
*/
memset(s1, 0, sizeof s1);
memset(s2, 0, sizeof s2);
foreach_r(Su) {
if(it != Su.rbegin()) {
set <int> :: reverse_iterator it1 = it;
--it1;
s1[*it] = s1[*it1] + Cnt[*it1];
}
}
foreach(Sd) {
if(it != Su.begin()) {
set <int> :: iterator it1 = it;
--it1;
s2[*it] = s2[*it1] + Cnt[*it1];
}
}
int solm = MAX_N;
for(int j = 1; j <= Nx; ++j)
if(s1[j] + s2[j] + Cnt[j] < solm) {
solm = s1[j] + s2[j] + Cnt[j];
}
Sol = max(Sol, solm);
foreach(G[i]) {
Su.erase(*it);
}
}
fout << Sol;
}
int main() {
citire();
norm();
solve();
}