Mai intai trebuie sa te autentifici.
Cod sursa(job #1364944)
Utilizator | Data | 27 februarie 2015 21:54:39 | |
---|---|---|---|
Problema | Pachete | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.29 kb |
#include <cstdio>
#include <algorithm>
#define f first
#define s second
#define mp make_pair
using namespace std;
int dx[] = {1, -1, 1, -1}, c[50010];
int dy[] = {1, -1, -1, 1};
pair <int, int> vv[50010], v[50010];
int main ()
{
freopen ("pachete.in", "r", stdin);
freopen ("pachete.out", "w", stdout);
int n, x, y;
scanf ("%d %d %d", &n, &x, &y);
for (int i = 1; i <= n; ++i)
{
scanf ("%d %d", &vv[i].f, &vv[i].s);
vv[i].f -= x;
vv[i].s -= y;
}
int rez = 0;
for (int h = 0; h < 4; ++h)
{
int k = 0;
for (int i = 1; i <= n; ++i)
{
int x = vv[i].f * dx[h];
int y = vv[i].s * dy[h];
if (x >= 0 && y >= 0) v[++k] = mp (x, y);
}
if (!k) continue;
sort (v + 1, v + k + 1);
int p = 1;
c[1] = 1;
for (int i = 2; i <= k; ++i)
{
int a = 1, b = p;
while (a <= b)
{
int m = (a + b) >> 1;
if (v[c[m]].s > v[i].s) a = m + 1;
else b = m - 1;
}
c[a] = i;
p = max (p, a);
}
rez += p;
}
printf ("%d\n", rez);
return 0;
}