Submission #1301304

#TimeUsernameProblemLanguageResultExecution timeMemory
1301304codeac2215Plahte (COCI17_plahte)C++20
160 / 160
265 ms76632 KiB
#include <bits/stdc++.h>
#define fi first
#define se second
#define xn '\n'
using namespace std ;

typedef long long ll ;
typedef pair <int, int> ii ;
typedef pair <ll, int> li;

const int Mod = 1e9 + 7 ;
const int N   = 1e5 ;
const ll MAX = 1e18;

int dy[] = { 0 , -1 , 0 , 1 } ;
int dx[] = { -1 , 0 , 1 , 0 } ;

struct hinh{
    int x1, y1, x2, y2;
};

struct diem{
    int x, y, color;
};

struct nen{
    int val, hinh, loai, id;
};

struct one{
    int y1, y2, id;
};

struct two{
    int y, color;
};

int n, m, comp_val;
int par[N + 22], ans[N + 22], st[N * 6 * 4 + 22], lazy[N * 6 * 4 + 22];

hinh cn[N + 22];
diem d[N + 22];
nen p[N * 6 + 22];

vector <one> be[N * 6 + 22], en[N * 6 + 22];
vector <two> node[N * 6 + 22];
set <int> set_cn[N + 22], pos;
vector <int> g[N + 22];

bool cmp_nen(nen x, nen y){
    return x.val < y.val;
}

bool cmp_cn(hinh a, hinh b){
    if (a.y1 == b.y1) return a.x1 > b.x1;
    return a.y1 > b.y1;
}

void compressed(){
    int sz = 0;
    for (int i = 1; i <= n; i++){
        p[++sz] = {cn[i].x1, 1, 1, i};
        p[++sz] = {cn[i].y1, 1, 2, i};
        p[++sz] = {cn[i].x2, 1, 3, i};
        p[++sz] = {cn[i].y2, 1, 4, i};
    }

    for (int i = 1; i <= m; i++){
        p[++sz] = {d[i].x, 2, 1, i};
        p[++sz] = {d[i].y, 2, 2, i};
    }

    sort(p + 1, p + sz + 1, cmp_nen);

    p[0].val = - 1;

    for (int i = 1; i <= sz; i++){
        if (p[i].val != p[i - 1].val) comp_val++;
        int tmp = p[i].hinh, dk = p[i].loai, id = p[i].id;

        if (tmp == 1){
            if (dk == 1) cn[id].x1 = comp_val;
            if (dk == 2) cn[id].y1 = comp_val;
            if (dk == 3) cn[id].x2 = comp_val;
            if (dk == 4) cn[id].y2 = comp_val;
        }

        if (tmp == 2){
            if (dk == 1) d[id].x = comp_val;
            if (dk == 2) d[id].y = comp_val;
        }
    }
}

void create(){
    for (int i = 1; i <= n; i++){
        be[cn[i].x1].push_back({cn[i].y1, cn[i].y2, i});
        en[cn[i].x2].push_back({cn[i].y1, cn[i].y2, i});
    }

    for (int i = 1; i <= m; i++){
        node[d[i].x].push_back({d[i].y, d[i].color});
    }
}

void down(int id){
    int val = lazy[id]; if (val == - 1) return ;

    st[id * 2] = val; lazy[id * 2] = val;
    st[id * 2 + 1] = val; lazy[id * 2 + 1] = val;

    lazy[id] = - 1;
}

void update(int id, int l, int r, int u, int v, int val){
    if (l > v || r < u) return ;

    if (u <= l && r <= v){
        st[id] = val;
        lazy[id] = val;
        return ;
    }

    down(id);
    int mid = (l + r) >> 1;

    update(id * 2, l, mid, u, v, val);
    update(id * 2 + 1, mid + 1, r, u, v, val);

    st[id] = max(st[id * 2], st[id * 2 + 1]);
}

int get(int id, int l, int r, int u, int v){
    if (l > v || r < u) return 0;

    if (u <= l && r <= v) return st[id];

    down(id);
    int mid = (l + r) >> 1;

    return max(get(id * 2, l, mid, u, v), get(id * 2 + 1, mid + 1, r, u, v));
}

void sweep_line(){
    memset(lazy, - 1, sizeof(lazy));

    for (int x = 1; x <= comp_val; x++){
        for (one td : be[x]){
            par[td.id] = get(1, 1, comp_val, td.y1, td.y2);
            update(1, 1, comp_val, td.y1, td.y2, td.id);
        }

        for (two td : node[x]){
            int id = get(1, 1, comp_val, td.y, td.y);
            if (id != 0) set_cn[id].insert(td.color);
        }

        for (one td : en[x]){
            update(1, 1, comp_val, td.y1, td.y2, par[td.id]);
        }
    }
}

void dfs(int u){
    for (int v : g[u]){
        dfs(v);

        if (u == 0) continue;

        if ( (int)set_cn[u].size() < (int) set_cn[v].size()) swap(set_cn[u], set_cn[v]);

        for (int x : set_cn[v]) set_cn[u].insert(x);

        set_cn[v].clear();
    }

    ans[u] = (int) set_cn[u].size();
}

void solution(){
    for (int i = 1; i <= n; i++){
        g[par[i]].push_back(i);
    }

    dfs(0);

    for (int i = 1; i <= n; i++){
        cout << ans[i] << xn;
    }
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);

    cin >> n >> m;

    for (int i = 1; i <= n; i++){
        cin >> cn[i].x1 >> cn[i].y1 >> cn[i].x2 >> cn[i].y2;
    }

    for (int i = 1; i <= m; i++){
        cin >> d[i].x >> d[i].y >> d[i].color;
    }

    compressed();
    create();
    sweep_line();
    solution();

    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...