답안 #797800

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
797800 2023-07-29T23:29:18 Z TB_ Stranded Far From Home (BOI22_island) C++17
20 / 100
1000 ms 41032 KB
#include <bits/stdc++.h>
using namespace std;

// #undef _GLIBCXX_DEBUG                // disable run-time bound checking, etc
// #pragma GCC optimize("Ofast,inline") // Ofast = O3,fast-math,allow-store-data-races,no-protect-parens
// #pragma GCC optimize ("unroll-loops")

// #pragma GCC target("bmi,bmi2,lzcnt,popcnt")                      // bit manipulation
// #pragma GCC target("movbe")                                      // byte swap
// #pragma GCC target("aes,pclmul,rdrnd")                           // encryption
// #pragma GCC target("avx,avx2,f16c,fma,sse3,ssse3,sse4.1,sse4.2") // SIMD

// #include <bits/extc++.h>
// using namespace __gnu_pbds;
// template<class T>using ordered_set = tree<T, null_type, less<T>, rb_tree_tag,tree_order_statistics_node_update>;
// template<class T>using ordered_multiset = tree<T, null_type, less_equal<T>, rb_tree_tag,tree_order_statistics_node_update>;

#define ll long long
#define INF (ll)1e9+7
#define fo(i, n) for(int i=0;i<((ll)n);i++)
#define deb(x) cout << #x << " = " << x << endl;
#define deb2(x, y) cout << #x << " = " << x << ", " << #y << " = " << y << endl
#define pb push_back
#define mp make_pair
#define F first
#define S second
#define LSOne(S) ((S) & (-S))
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
inline int readint(){ int v = 0; char c; while((c = getchar()) != EOF && c != ' ' && c != '\n'){ v *= 10; v += c - '0'; } return v; }
inline int readintsigned() { int v = 0; int sign = 1; char c = getchar(); if (c == '-') { sign = -1; } else { v += c - '0'; } while ((c = getchar()) != EOF && c != ' ' && c != '\n') { v *= 10; v += c - '0'; } return v * sign; }
inline string readstring() { string s; char c; while ((c = getchar()) != EOF && c != '\n' && c != ' ') { s.push_back(c); } return s; }
template <class result_t=std::chrono::milliseconds,class clock_t=std::chrono::steady_clock,class duration_t = std::chrono::milliseconds>
auto since(std::chrono::time_point<clock_t, duration_t> const& start){return std::chrono::duration_cast<result_t>(clock_t::now() - start);}
typedef pair<int, int> pii;
typedef pair<ll, ll> pl;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<pii> vpii;
typedef vector<pl> vpl;
typedef vector<vi> vvi;
typedef vector<vl> vvl;
typedef vector<vpii> vvpii;
typedef vector<vpl> vvpl;

ll n, m, val, from, to, w;
vl population;

vvl adj(200001);

struct UnionFind{
    int n;
    vl p, siz;
    UnionFind(int n) : n(n){
        p.assign(n, -1);
        siz.assign(n, 1);
        fo(i, n)p[i] = i;
    }

    int find(int x){
        if(p[x] == x) return x;
        return p[x] = find(p[x]);
    }

    void unite(int a, int b){
        a = find(a);
        b = find(b);
        if(a == b) return;
        if(siz[b] > siz[a]) swap(a, b);
        siz[a]+=siz[b];
        p[b] = a;
    }
};

int main() {
    // cout << fixed << setprecision(20);
    // auto start = std::chrono::steady_clock::now(); // since(start).count()
    cin.tie(0)->sync_with_stdio(0);
    mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());

    cin >> n >> m;
    pii biggestPop = {-1, -1};
    vpl popSort;
    fo(i, n){
        cin >> val;
        population.pb(val);
        biggestPop = max(biggestPop, {val, i});
        popSort.pb({val, i});
    }

    sort(all(popSort));

    fo(i, m){
        cin >> from >> to;
        adj[--from].pb(--to);
        adj[to].pb(from);
    }
    vi ans(n, -1);
    ans[biggestPop.S] = 1;

    vi order;
    fo(i, n) order.pb(popSort[i].S);
    // shuffle(all(order), rng);

    UnionFind uf(n);

    vi seen(n, 0);
    for(auto start : order){
        start = uf.find(start);
        if(ans[start] != -1) continue;
        vi visited;
        set<pl> s = {{0, start}};

        ll currentPop = population[start];
        while(!s.empty()){
            auto res = s.lower_bound({currentPop, INF});
            if(res == s.begin()) {
                if(seen[uf.find((*res).S)]) continue;
                for(int i = 1; i < visited.size(); i++){
                    uf.unite(visited[0], visited[i]);
                    for(auto v : adj[visited[i]]){
                        if(seen[v]) continue;
                        seen[v] = 1;
                        adj[visited[0]].pb(v);
                    }
                }
                population[visited[0]] = currentPop;
                for(auto v : adj[visited[0]]) seen[v] = 0;
                visited = {visited[0]};
                seen[visited[0]] = 1;
                ans[visited[0]] = 0;
                start = uf.find((*res).S);
                res++;
            }


            tie(w, to) = *--res;
            to = uf.find(to);
            s.erase(res);
            if(seen[to]) continue;
            seen[to] = 1;
            visited.pb(to);
            currentPop += w;
            if(ans[to] == 1 || currentPop >= biggestPop.F) break;
            for(auto v : adj[to]){
                v = uf.find(v);
                s.insert({population[v], v});           
            }
        }
        ans[start] = 1;
        for(auto v : visited) 
            seen[uf.find(v)] = 0;
        
    }
    fo(i, n) cout << ans[uf.find(i)];

    return 0;
}

Compilation message

island.cpp: In function 'int main()':
island.cpp:119:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  119 |                 for(int i = 1; i < visited.size(); i++){
      |                                ~~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 3 ms 5168 KB Output is correct
5 Correct 4 ms 5212 KB Output is correct
6 Correct 3 ms 5204 KB Output is correct
7 Correct 4 ms 5204 KB Output is correct
8 Correct 3 ms 5076 KB Output is correct
9 Correct 3 ms 5332 KB Output is correct
10 Correct 3 ms 5204 KB Output is correct
11 Correct 4 ms 5204 KB Output is correct
12 Correct 3 ms 5204 KB Output is correct
13 Correct 4 ms 5332 KB Output is correct
14 Correct 4 ms 5172 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 182 ms 23596 KB Output is correct
4 Correct 158 ms 29984 KB Output is correct
5 Correct 146 ms 22964 KB Output is correct
6 Correct 170 ms 23476 KB Output is correct
7 Correct 151 ms 23600 KB Output is correct
8 Correct 143 ms 23564 KB Output is correct
9 Correct 130 ms 24768 KB Output is correct
10 Correct 124 ms 24120 KB Output is correct
11 Correct 108 ms 24096 KB Output is correct
12 Correct 148 ms 23460 KB Output is correct
13 Correct 164 ms 35564 KB Output is correct
14 Correct 163 ms 34244 KB Output is correct
15 Correct 121 ms 22476 KB Output is correct
16 Correct 113 ms 25056 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 175 ms 23144 KB Output is correct
3 Correct 160 ms 23516 KB Output is correct
4 Correct 115 ms 22768 KB Output is correct
5 Correct 161 ms 32184 KB Output is correct
6 Correct 159 ms 23516 KB Output is correct
7 Correct 137 ms 22728 KB Output is correct
8 Correct 133 ms 22704 KB Output is correct
9 Correct 116 ms 25988 KB Output is correct
10 Execution timed out 1030 ms 23612 KB Time limit exceeded
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 170 ms 23472 KB Output is correct
3 Correct 175 ms 23888 KB Output is correct
4 Correct 166 ms 23840 KB Output is correct
5 Correct 124 ms 23744 KB Output is correct
6 Correct 106 ms 23772 KB Output is correct
7 Correct 119 ms 24340 KB Output is correct
8 Execution timed out 1077 ms 41032 KB Time limit exceeded
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 3 ms 4948 KB Output is correct
4 Correct 3 ms 5168 KB Output is correct
5 Correct 4 ms 5212 KB Output is correct
6 Correct 3 ms 5204 KB Output is correct
7 Correct 4 ms 5204 KB Output is correct
8 Correct 3 ms 5076 KB Output is correct
9 Correct 3 ms 5332 KB Output is correct
10 Correct 3 ms 5204 KB Output is correct
11 Correct 4 ms 5204 KB Output is correct
12 Correct 3 ms 5204 KB Output is correct
13 Correct 4 ms 5332 KB Output is correct
14 Correct 4 ms 5172 KB Output is correct
15 Correct 2 ms 4948 KB Output is correct
16 Correct 2 ms 4948 KB Output is correct
17 Correct 182 ms 23596 KB Output is correct
18 Correct 158 ms 29984 KB Output is correct
19 Correct 146 ms 22964 KB Output is correct
20 Correct 170 ms 23476 KB Output is correct
21 Correct 151 ms 23600 KB Output is correct
22 Correct 143 ms 23564 KB Output is correct
23 Correct 130 ms 24768 KB Output is correct
24 Correct 124 ms 24120 KB Output is correct
25 Correct 108 ms 24096 KB Output is correct
26 Correct 148 ms 23460 KB Output is correct
27 Correct 164 ms 35564 KB Output is correct
28 Correct 163 ms 34244 KB Output is correct
29 Correct 121 ms 22476 KB Output is correct
30 Correct 113 ms 25056 KB Output is correct
31 Correct 3 ms 4948 KB Output is correct
32 Correct 175 ms 23144 KB Output is correct
33 Correct 160 ms 23516 KB Output is correct
34 Correct 115 ms 22768 KB Output is correct
35 Correct 161 ms 32184 KB Output is correct
36 Correct 159 ms 23516 KB Output is correct
37 Correct 137 ms 22728 KB Output is correct
38 Correct 133 ms 22704 KB Output is correct
39 Correct 116 ms 25988 KB Output is correct
40 Execution timed out 1030 ms 23612 KB Time limit exceeded
41 Halted 0 ms 0 KB -