5029 2023. 04. 10 00:46:19 rmlan Hegyi levegő cpp14 Futási hiba 50/100 1.644s 111364 KiB
#include<bits/stdc++.h>
using namespace std;

int n,m,q,timer=0;
int m2;
vector<vector<pair<int, int> > > g;
vector<pair<int, int> > e;
vector<int> p,sz,tin,tout,dis;
vector<bool> vis;
int anc[100001][21]={0};
int mx[100001][21]={0};

void make_set(int v){
    p[v]=v;
    sz[v]=1;
}

int find_set(int v){
    if(p[v] == v) return v;
    return find_set(p[v]);
}

bool unite(int a, int b){
    a = find_set(a);
    b = find_set(b);
    if(a == b) return 0;
    if(sz[a] < sz[b]) swap(a,b);
    p[b]=a;
    sz[a]+=sz[b];
    return 1;
}

int na(int u, int nn, int b=20){
    if(!nn) return u;
    for(int i = b; i >= 0; i--){
        if(nn-(1 << i) >= 0) return na(anc[u][i], nn-(1<<i), i);
    }
}
int nm(int u, int nn, int b=20){
    if(!nn) return 0;
    if(nn==1) return mx[u][0];
    for(int i = b; i >= 0; i--){
        if(nn-(1 << i) >= 0) return max(mx[u][i], nm(anc[u][i], nn-(1<<i), i));
    }
}


void dfs(int u, int it){

    if(vis[u]) return;
    tin[u]=timer++;
    vis[u]=1;
    if(it > 0){
        anc[u][it] = anc[anc[u][it-1]][it-1];
        mx[u][it]= max(mx[u][it-1], mx[anc[u][it-1]][it-1]);
    }
    for(pair<int, int> pr:g[u]){
        if(vis[pr.second]) continue;

        if(!it){
            dis[pr.second]=dis[u]+1;
            anc[pr.second][0]=u;
            mx[pr.second][0]=pr.first;
        }
        dfs(pr.second, it);
    }
    tout[u] = timer++;
}

int solve(int a, int b){
    if(dis[a] > dis[b]) swap(a,b);

    if(tin[a] < tin[b] && tout[a] > tout[b]){
        return nm(b, dis[b]-dis[a]);
    }
    int cr=0;
    for(int i = 17; i >= 0; i--){
        if(na(b, cr+(1 << i)+dis[b]-dis[a]) != na(a, cr+(1<<i))){

            cr +=(1<<i);
        }
    }
    cr++;

    return max(nm(b,cr+dis[b]-dis[a]), nm(a,cr));
}

int main(){

    cin >> n >> m >> q;
    int mp[n][m];

    g.resize(n*m);
    p.resize(n*m);
    sz.resize(n*m);
    tin.resize(n*m);
    tout.resize(n*m);
    dis.resize(n*m);
    vector<pair<int, int> > ek;
    for(int i = 0; i < n; i++){
        for(int j = 0; j < m; j++){
            cin >> mp[i][j];
            if(i>0){
                e.push_back({max(mp[i][j], mp[i-1][j]), (i*m+j)*10});
            }
            if(j > 0){
                e.push_back({max(mp[i][j], mp[i][j-1]), (i*m+j)*10+1});
            }
        }
    }
    sort(e.begin(), e.end());
    for(int i = 0; i < n*m; i++){
        make_set(i);
    }
    for(pair<int, int> pa:e){
        if(pa.second%10){

            if(unite(pa.second/10, pa.second/10-1)) ek.push_back(pa);
        }else{

            if(unite(pa.second/10, pa.second/10-m)) ek.push_back(pa);
        }
    }
    for(pair<int, int> pa:ek){
        if(pa.second%10){
            g[pa.second/10].push_back({pa.first, pa.second/10-1});
            g[pa.second/10-1].push_back({pa.first, pa.second/10});

        }else{
            g[pa.second/10].push_back({pa.first, pa.second/10-m});
            g[pa.second/10-m].push_back({pa.first, pa.second/10});
        }
    }


    anc[n*m/2][0]=n*m/2;
    dis[n*m/2]=0;
    for(int i = 0; i < 20; i++){
        vis.assign(n*m, 0);
        dfs(n*m/2, i);
    }


    while(q--){
        int ai,bi,ci,di;
        cin >> ai >> bi >> ci >> di;

        cout << solve(ai*m+bi-m-1, ci*m+di-m-1) << endl;

    }

}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 1824 KiB
2 Elfogadva 3ms 2204 KiB
subtask2 19/19
3 Elfogadva 14ms 5356 KiB
4 Elfogadva 17ms 5492 KiB
5 Elfogadva 16ms 5720 KiB
6 Elfogadva 16ms 5644 KiB
7 Elfogadva 16ms 5828 KiB
8 Elfogadva 16ms 6068 KiB
9 Elfogadva 16ms 6188 KiB
10 Elfogadva 14ms 6624 KiB
subtask3 0/20
11 Elfogadva 3ms 3832 KiB
12 Elfogadva 7ms 4356 KiB
13 Elfogadva 59ms 9740 KiB
14 Elfogadva 805ms 63300 KiB
15 Futási hiba 421ms 98244 KiB
subtask4 0/20
16 Futási hiba 347ms 98324 KiB
17 Futási hiba 351ms 98144 KiB
18 Futási hiba 477ms 110008 KiB
19 Futási hiba 456ms 110788 KiB
20 Futási hiba 486ms 110860 KiB
subtask5 31/31
21 Elfogadva 1.394s 63680 KiB
22 Elfogadva 1.644s 61068 KiB
23 Elfogadva 1.432s 58952 KiB
24 Elfogadva 1.322s 59208 KiB
25 Elfogadva 1.238s 63976 KiB
26 Elfogadva 1.202s 58768 KiB
27 Elfogadva 1.396s 59408 KiB
28 Elfogadva 1.508s 64184 KiB
29 Elfogadva 823ms 72668 KiB
subtask6 0/10
30 Futási hiba 481ms 98836 KiB
31 Futási hiba 552ms 110580 KiB
32 Futási hiba 609ms 111364 KiB
33 Futási hiba 560ms 111340 KiB
34 Futási hiba 458ms 98912 KiB
35 Futási hiba 537ms 108272 KiB
36 Futási hiba 319ms 109776 KiB
37 Futási hiba 462ms 111016 KiB
38 Futási hiba 375ms 98948 KiB
39 Futási hiba 361ms 102904 KiB