Cod sursa(job #2617446)

Utilizator CraniXortDumitrescul Eduard CraniXort Data 21 mai 2020 19:04:48
Problema Cadrane Scor 10
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.52 kb
#include <bits/stdc++.h>
#define maxn 200005

std::ifstream fin ("cadrane.in");
std::ofstream fout ("cadrane.out");

struct point{
    int x, y;
}v[maxn];

bool sort_cond_x (point a, point b){
    return a.x < b.x;
}

bool sort_cond_y (point a, point b){
    return a.y < b.y;
}

int min[maxn], lazy[maxn];
int fq[maxn];

void update (int left, int right, int node, int l, int r, int val){
    if (left > right or left > r or right < l)
        return;
    /*
    if (lazy[node]){
        min[node] += lazy[node];
        if (left < right){
            lazy[2*node+1] += lazy[node];
            lazy[2*node+2] += lazy[node];
        }
    }
    */
    if (l <= left and right <= r){
        min[node] += val;
        if (left < right){
            lazy[2*node+1] += val;
            lazy[2*node+2] += val;
        }
        //return;
    }
    if (left == right)
        return;

    int mid = (left + right) / 2;
    update (left, mid, 2*node+1, l, r, val);
    update (mid+1, right, 2*node+2, l, r, val);

    min[node] = std::min (min[2*node+1], min[2*node+2]);
}

int main()
{
    int n, i, j;
    fin >> n;
    for (i=0; i<n; i++)
        fin >> v[i].x >> v[i].y;

    ///Normalizare x
    std::sort (v, v+n, sort_cond_x);
    int last = v[0].x, crt = 0;
    for (i=0; i<n; i++){
        if (v[i].x != last){
            crt ++;
            last = v[i].x;
        }
        v[i].x = crt;
        fq[v[i].x] ++;
    }
    int mx = crt, val;

    for (int x=0, val=0; x<=mx; x++){
        if (x) fq[x] += fq[x-1];
        update (0, mx, 0, x, x, n - val);
        val = fq[x];
    }

    ///Normalizare y
    std::sort (v, v+n, sort_cond_y);
    last = v[0].y, crt = 0;
    for (i=0; i<n; i++){
        if (v[i].y != last){
            crt ++;
            last = v[i].y;
        }
        v[i].y = crt;
    }
    int my = crt;
    //for (i=0; i<n; i++)
    //    fout << v[i].x << ' ' << v[i].y << '\n';

    for (i=0; v[i].y==0; i++)
        update (0, mx, 0, v[i].x+1, mx, 1);

    int score = min[0];
    for (int y=0, i=0; y<=my; y++){
        for (j=i; v[j].y==y; j++){
            update (0, mx, 0, v[j].x+1, mx, -1);
        }
        for (;v[i].y == y; i++){
            update (0, mx, 0, 0, v[i].x-1, -1);
            update (0, mx, 0, v[i].x+1, mx, 1);
        }
        for (j=i; v[j].y==y+1; j++){
            update (0, mx, 0, v[j].x+1, mx, 1);
        }
        score = std::max (score, min[0]);
    }

    fout << score << '\n';


    return 0;
}