5296 2023. 04. 25 16:46:23 gortomi Hegyi levegő cpp17 Időlimit túllépés 70/100 3.072s 241948 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 1904 KiB
2 Elfogadva 3ms 2232 KiB
subtask2 19/19
3 Elfogadva 8ms 3812 KiB
4 Elfogadva 12ms 3780 KiB
5 Elfogadva 10ms 4024 KiB
6 Elfogadva 12ms 4208 KiB
7 Elfogadva 13ms 4408 KiB
8 Elfogadva 13ms 4680 KiB
9 Elfogadva 12ms 5076 KiB
10 Elfogadva 10ms 6572 KiB
subtask3 20/20
11 Elfogadva 3ms 3880 KiB
12 Elfogadva 4ms 4204 KiB
13 Elfogadva 23ms 7900 KiB
14 Elfogadva 331ms 48568 KiB
15 Elfogadva 2.444s 172748 KiB
subtask4 0/20
16 Elfogadva 1.273s 159500 KiB
17 Időlimit túllépés 3.068s 130528 KiB
18 Elfogadva 1.96s 125428 KiB
19 Elfogadva 1.947s 122412 KiB
20 Elfogadva 1.986s 121668 KiB
subtask5 31/31
21 Elfogadva 750ms 90580 KiB
22 Elfogadva 609ms 64436 KiB
23 Elfogadva 707ms 67576 KiB
24 Elfogadva 708ms 67532 KiB
25 Elfogadva 446ms 66816 KiB
26 Elfogadva 377ms 57012 KiB
27 Elfogadva 314ms 57268 KiB
28 Elfogadva 289ms 62040 KiB
29 Elfogadva 286ms 60164 KiB
subtask6 0/10
30 Időlimit túllépés 3.059s 167472 KiB
31 Időlimit túllépés 3.072s 100296 KiB
32 Időlimit túllépés 3.071s 99548 KiB
33 Időlimit túllépés 3.069s 101008 KiB
34 Elfogadva 2.46s 241948 KiB
35 Időlimit túllépés 3.068s 111920 KiB
36 Elfogadva 1.585s 182736 KiB
37 Elfogadva 1.241s 175548 KiB
38 Elfogadva 1.146s 212968 KiB
39 Elfogadva 1.19s 204224 KiB