Cod sursa(job #1778842)

Utilizator Alexa2001Alexa Tudose Alexa2001 Data 14 octombrie 2016 11:29:03
Problema Cadrane Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.87 kb
#include <bits/stdc++.h>
#define x first
#define y second
#define left_son (node<<1)
#define right_son ((node<<1)+1)
#define mid ((st+dr)>>1)

using namespace std;

const int Nmax = 1e5+5;

int n, i, limX, limY, lazy[Nmax<<2], arb[Nmax<<2], ans=0;
vector<int> v[Nmax];
pair<int,int> a[Nmax];

void norm(int a[], int &lim)
{
    int i; lim = 0;
    pair<int,int> b[Nmax];

    for(i=1; i<=n; ++i)
        b[i] = {a[i],i};

    sort(b+1, b+n+1);

    b[0] = {INT_MAX, INT_MAX};

    for(i=1; i<=n; ++i)
    {
        if(b[i].x!=b[i-1].x) ++lim;
        a[b[i].y] = lim;
    }
}

void normalize()
{
    int i, b[Nmax];

    for(i=1; i<=n; ++i) b[i] = a[i].x;
    norm(b, limX);
    for(i=1; i<=n; ++i) a[i].x = b[i];

    for(i=1; i<=n; ++i) b[i] = a[i].y;
    norm(b, limY);
    for(i=1; i<=n; ++i) a[i].y = b[i];

    for(i=1; i<=n; ++i)
        v[a[i].x].push_back(a[i].y);
}

void update(int node, int st, int dr, int Left, int Right, int val)
{
    if(Left<=st && dr<=Right)
    {
        lazy[node] += val;
        return;
    }

    lazy[left_son] += lazy[node];
    lazy[right_son] += lazy[node];
    lazy[node] = 0;

    if(Left<=mid) update(left_son, st, mid, Left, Right, val);
    if(mid<Right) update(right_son, mid+1, dr, Left, Right, val);

    arb[node] = min(arb[left_son] + lazy[left_son], arb[right_son] + lazy[right_son]);
}

int query()
{
    return arb[1] + lazy[1];
}

int main()
{
    freopen("cadrane.in", "r", stdin);
    freopen("cadrane.out", "w", stdout);

    scanf("%d", &n);
    for(i=1; i<=n; ++i) scanf("%d%d", &a[i].x, &a[i].y);

    normalize();

    for(i=1; i<=n; ++i)
        update(1, 1, limY, 1, a[i].y, 1);

    for(i=1; i<=limX; ++i)
    {
        for(auto it : v[i])
            update(1, 1, limY, it, limY, 1);

        for(auto it : v[i-1])
            update(1, 1, limY, 1, it, -1);

        ans = max(ans, query());
    }

    printf("%d\n", ans);

    return 0;
}