답안 #706081

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
706081 2023-03-05T20:26:25 Z leaked Izlet (COI19_izlet) C++17
43 / 100
607 ms 92176 KB
#include <iostream>
#include <fstream>
#include <iomanip>
#include <vector>
#include <set>
#include <map>
#include <cstring>
#include <string>
#include <cmath>
#include <cassert>
#include <ctime>
#include <algorithm>
#include <sstream>
#include <list>
#include <queue>
#include <deque>
#include <stack>
#include <cstdlib>
#include <cstdio>
#include <iterator>
#include <functional>
#include <unordered_set>
#include <unordered_map>
#include <stdio.h>
#include <bitset>
#include <cstdint>
#include <cassert>
#include <functional>
#include <complex>
#include <random>

using namespace std;

#define ll long long
#define pb push_back
#define mp make_pair
#define f first
#define s second
#define ld long double

const ll maxn = 3e3 + 10, maxm = 20 + 1;
const ll mod = 1e9 + 7, cmod = 998244353, inf = 1e9, blcok = 400, p2 = 31;
const ld eps = 1e-9;

int s, n, a[maxn][maxn], p[maxn], sz[maxn], dep[maxn], color[maxn], used[maxn], par[maxn];
vector<int> comps[maxn];
vector<pair<int, int>> z[maxn];
vector<int> g[maxn];
void dfs(int v = 1, int p = 0, int cur = 1){
    if (p){
        ++cur;
        if (a[1][v] == cur){
            color[v] = v;
        }
        else{
            --cur;
            vector<int> vec;
            int is = v, prv = 1;
            while (is != 1){
                is = par[is];
                if (used[color[is]] == 0){
                    int x = a[is][v];
                    if (x == prv){
                        color[v] = color[is];
                        break;
                    }
                    ++prv;
                }
                used[color[is]] = 1;
            }
            for (int j = 1; j <= n; ++j){
                used[j] = 0;
            }
        }
    }
    for (auto to : g[v]){
        if (to != p){
            par[to] = v;
            dfs(to, v, cur);
        }
    }
}
int get(int v){
    if (v == p[v])
        return v;
    return p[v] = get(p[v]);
}
void unite(int a, int b){
    a = get(a), b = get(b);
    if (a == b)
        return;
    if (sz[a] > sz[b])
        swap(a, b);
    p[a] = b;
    sz[b] += sz[a];
}
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> s;
    cin >> n;
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= n; ++j){
            cin >> a[i][j];
        }
    }
    if (s == 1){
    for (int i = 1; i <= n; ++i){
        p[i] = i, sz[i] = 1;
        dep[i] = i;
    }
    for (int i = 1; i <= n; ++i){
        for (int j = 1; j <= n; ++j){
            if (a[i][j] == 1){
                unite(i, j);
            }
        }
    }
    int root = get(1);
    for (int i = 1; i <= n; ++i){
        if (get(i) == root){
            color[i] = 1;
        }
        else{
            color[i] = 2;
        }
        comps[get(i)].pb(i);
        cout << color[i] << " ";
    }
    cout << '\n';
    vector<pair<int, int>> ans;
    for (int i = 1; i <= n; ++i){
        int sz = (int)comps[i].size() - 1;
        for (int j = 0; j < sz; ++j){
            ans.pb(mp(comps[i][j], comps[i][j + 1]));
        }
        if ((int)comps[i].size() > 0 && i != root){
            ans.pb(mp(comps[i][0], root));
        }
    }
    for (auto it : ans){
        cout << it.f << " " << it.s << '\n';
    }
    }
    else if (s == 2){
        int cur = 0;
        for (int i = 1; i <= n; ++i){
            ++cur;
            if (a[1][i] == cur){
                color[i] = i;
            }
            else{
                --cur;
                int prv = 1;
                for (int j = i - 1; j >= 1; --j){
                    if (used[color[j]] == 0){
                        int x = a[j][i];
                        if (x == prv){
                            color[i] = color[j];
                            break;
                        }
                        ++prv;
                    }
                    used[color[j]] = 1;
                }
                for (int j = 1; j <= i; ++j){
                    used[color[j]] = 0;
                }
            }
            cout << color[i] << " ";
        }
        cout << '\n';
        for (int i = 1; i < n; ++i){
            cout << i << " " << i + 1 << '\n';
        }
    }
    else{
        vector<pair<int, int>> ans;
        for (int i = 1; i <= n; ++i){
            for (int j = i + 1; j <= n; ++j){
                z[a[i][j]].pb(mp(i, j));
            }
        }
        for (int i = 1; i <= n; ++i){
            p[i] = i, sz[i] = 1;
            dep[i] = i;
        }
        for (int i = 1; i <= n; ++i){
            for (auto it : z[i]){
                if (get(it.f) != get(it.s)){
                    int ver = dep[it.f];
                    unite(ver, it.s);
                    g[ver].pb(it.s);
                    g[it.s].pb(ver);
                    ans.pb(mp(ver, it.s));
                }
            }
        }
        color[1] = 1;
        dfs();
        for (int i = 1; i <= n; ++i){
            cout << color[i] << " ";
        }
        cout << '\n';
        for (auto it : ans){
            cout << it.f << " " << it.s << '\n';
        }
    }
}
/*
*/


# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Correct 495 ms 42112 KB Output is correct
3 Correct 571 ms 53556 KB Output is correct
4 Correct 571 ms 53464 KB Output is correct
5 Correct 452 ms 53376 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 423 ms 42020 KB Output is correct
2 Correct 469 ms 53472 KB Output is correct
3 Correct 541 ms 40184 KB Output is correct
4 Correct 607 ms 40176 KB Output is correct
5 Correct 418 ms 53444 KB Output is correct
6 Correct 448 ms 38172 KB Output is correct
7 Correct 325 ms 32664 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 596 KB Output is correct
2 Correct 495 ms 42112 KB Output is correct
3 Correct 571 ms 53556 KB Output is correct
4 Correct 571 ms 53464 KB Output is correct
5 Correct 452 ms 53376 KB Output is correct
6 Correct 423 ms 42020 KB Output is correct
7 Correct 469 ms 53472 KB Output is correct
8 Correct 541 ms 40184 KB Output is correct
9 Correct 607 ms 40176 KB Output is correct
10 Correct 418 ms 53444 KB Output is correct
11 Correct 448 ms 38172 KB Output is correct
12 Correct 325 ms 32664 KB Output is correct
13 Incorrect 567 ms 92176 KB Output isn't correct
14 Halted 0 ms 0 KB -