5084 2023. 04. 15 21:17:04 gortomi Hegyi levegő cpp17 Időlimit túllépés 70/100 3.091s 241780 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<pair<int, int> > > p;
vector<vector<int> > r;
pair<int, int> get(pair<int, int> n)
{
    return p[n.first][n.second] == make_pair(0, 0) ? n : p[n.first][n.second] = get(p[n.first][n.second]);
}
void unio(pair<int, int> a, pair<int, int> b)
{
    a = get(a);
    b = get(b);
    if(a != b)
    {
        if(r[a.first][a.second] < r[b.first][b.second]) swap(a, b);
        p[a.first][a.second] = b;
        if(r[a.first][a.second] == r[b.first][b.second]) r[a.first][a.second]++;
    }
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n, m, q;
    scanf("%d %d %d", &n, &m, &q);
    p.resize(n + 1, vector<pair<int, int> >(m + 1, make_pair(0, 0)));
    r.resize(n + 1, vector<int> (m + 1));
    vector<vector<int> > v(n + 2, vector<int>(m + 2, INT_MAX));
    vector<int> comp;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            scanf("%d", &v[i][j]);
            comp.push_back(v[i][j]);
        }
    }
    sort(comp.begin(), comp.end());
    comp.erase(unique(comp.begin(), comp.end()), comp.end());
    vector<vector<pair<int, int> > > add(n * m + 1);
    for(int i = 1; i <= n; i++)
    {
        for(int j = 1; j <= m; j++)
        {
            v[i][j] = lower_bound(comp.begin(), comp.end(), v[i][j]) - comp.begin();
            add[v[i][j]].push_back({i, j});
        }
    }
    vector<int> l(q), r(q);
    vector<pair<int, int> > a(q), b(q);
    vector<vector<int> > que(n * m + 1);
    for(int i = 0; i < q; i++)
    {
        scanf("%d %d %d %d", &a[i].first, &a[i].second, &b[i].first, &b[i].second);
        l[i] = -1;
        r[i] = n * m;
        que[(l[i] + r[i]) / 2].push_back(i);
    }
    int db = 0;
    while(db != q)
    {
        fill(p.begin(), p.end(), vector<pair<int, int> >(m + 1, make_pair(0, 0)));
        for(int i = 0; i <= n * m; i++)
        {
            for(auto z : add[i])
            {
                int x = z.first, y = z.second;
                if(v[x - 1][y] <= i) unio(z, {x - 1, y});
                if(v[x + 1][y] <= i) unio(z, {x + 1, y});
                if(v[x][y - 1] <= i) unio(z, {x, y - 1});
                if(v[x][y + 1] <= i) unio(z, {x, y + 1});
            }
            for(auto x : que[i])
            {
                if(get(a[x]) == get(b[x])) r[x] = i;
                else l[x] = i;
                if(l[x] + 1 == r[x])
                {
                    db++;
                }
                else
                {
                    que[(l[x] + r[x]) / 2].push_back(x);
                }
            }
            que[i].clear();
        }
    }
    for(int i = 0; i < q; i++)  printf("%d\n", comp[r[i]]);
}
Részfeladat Összpont Teszt Verdikt Idő Memória
subtask1 0/0
1 Elfogadva 3ms 2056 KiB
2 Elfogadva 3ms 2332 KiB
subtask2 19/19
3 Elfogadva 8ms 3896 KiB
4 Elfogadva 10ms 3840 KiB
5 Elfogadva 10ms 3844 KiB
6 Elfogadva 12ms 3848 KiB
7 Elfogadva 12ms 3972 KiB
8 Elfogadva 12ms 4228 KiB
9 Elfogadva 10ms 4400 KiB
10 Elfogadva 9ms 5868 KiB
subtask3 20/20
11 Elfogadva 3ms 3348 KiB
12 Elfogadva 4ms 3772 KiB
13 Elfogadva 24ms 7600 KiB
14 Elfogadva 303ms 48268 KiB
15 Elfogadva 1.921s 172444 KiB
subtask4 0/20
16 Elfogadva 1.378s 159256 KiB
17 Időlimit túllépés 3.063s 131916 KiB
18 Elfogadva 1.865s 125396 KiB
19 Elfogadva 2.072s 122912 KiB
20 Elfogadva 1.855s 121964 KiB
subtask5 31/31
21 Elfogadva 745ms 90720 KiB
22 Elfogadva 614ms 64680 KiB
23 Elfogadva 663ms 67556 KiB
24 Elfogadva 660ms 67568 KiB
25 Elfogadva 425ms 66752 KiB
26 Elfogadva 386ms 57216 KiB
27 Elfogadva 316ms 57496 KiB
28 Elfogadva 287ms 62356 KiB
29 Elfogadva 284ms 60320 KiB
subtask6 0/10
30 Időlimit túllépés 3.072s 167724 KiB
31 Időlimit túllépés 3.091s 104616 KiB
32 Időlimit túllépés 3.051s 97280 KiB
33 Időlimit túllépés 3.061s 105156 KiB
34 Elfogadva 2.421s 241780 KiB
35 Elfogadva 2.924s 220492 KiB
36 Elfogadva 1.593s 182564 KiB
37 Elfogadva 1.238s 175468 KiB
38 Elfogadva 1.144s 212768 KiB
39 Elfogadva 1.174s 204184 KiB