Submission #714794

#TimeUsernameProblemLanguageResultExecution timeMemory
714794ToxtaqStranded Far From Home (BOI22_island)C++17
20 / 100
1087 ms306612 KiB
#include <bits/stdc++.h>
using namespace std;
vector<vector<int>>g;
vector<int>num;
vector<long long>cnt1;
vector<int>canTraverse; /// 0-unchecked, 1-false, 2-true
void calc(int u, int par){
    cnt1[u] = num[u];
    for(int v : g[u]){
        if(v != par){
            calc(v, u);
            cnt1[u] += cnt1[v];
        }
    }
}
void dfs1(int u, int par){
    if(canTraverse[par] == 1)canTraverse[u] = 1;
    else{
        canTraverse[u] = (cnt1[u] >= num[par]) + 1;
    }
    for(int v : g[u]){
        if(v != par){
            dfs1(v, u);
        }
    }
}
vector<bool>vis, chosen;
bool cmp(int a, int b){
    return num[a] < num[b];
}
long long cnt = 0;
vector<int>tmp;
void dfs(int u){
    vis[u] = 1;
    vector<int>tempo;
    for(int v : g[u]){
        if(!chosen[v] && cnt >= num[v]){
            cnt += num[v];
            chosen[v] = 1;
            tempo.push_back(v);
        }
        else if(cnt < num[v]){
            tmp.push_back(v);
        }
    }
    for(int v : tempo){
        if(!vis[v]){
            dfs(v);
        }
    }
}
int main()
{
    int n, m;
    cin >> n >> m;
    num.resize(n + 1);
    g.resize(n + 1);
    vis.resize(n + 1);
    chosen.resize(n + 1);
    cnt1.resize(n + 1);
    canTraverse.resize(n + 1);
    for(int i = 1;i <= n;++i)cin >> num[i];
    bool check = 1;
    for(int i = 0;i < m;++i){
        int u, v;
        cin >> u >> v;
        if(abs(u - v) > 1)check = 0;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    if(n <= 2000 && m <= 2000){
        for(int i = 1;i <= n;++i){
            sort(g[i].begin(), g[i].end(), cmp);
        }
        string s = "";
        for(int i = 1;i <= n;++i){
            cnt = num[i];
            chosen[i] = 1;
            dfs(i);
            sort(tmp.begin(), tmp.end(), cmp);
            int ind = 0;
            while(tmp.size() && ind < tmp.size()){
                int j = tmp[ind];
                if(!chosen[j] && cnt >= num[j]){
                    chosen[j] = 1;
                    cnt += num[j];
                    dfs(j);
                }
                else{
                    ind++;
                    continue;
                }
                sort(tmp.begin(), tmp.end(), cmp);
                ind = 0;
            }
            bool ok = 1;
            for(int j = 1;j <= n && ok;++j){
                if(!vis[j]){
                    ok = 0;
                }
            }
            for(int j = 1;j <= n;++j){
                vis[j] = 0;
                chosen[j] = 0;
            }
            if(ok)s += '1';
            else s += '0';
            tmp.clear();
        }
        cout << s;
    }
    else if(check){
        int root = -1, mx = 0;
        for(int i = 1;i <= n;++i){
            if(mx < num[i]){
                mx = num[i];
                root = i;
            }
        }
        calc(root, root);
        dfs1(root, root);
        for(int i = 1;i <= n;++i){
            if(canTraverse[i] == 2)cout << 1;
            else cout << 0;
        }
    }
    else{
        calc(1, 1);
        dfs1(1, 1);
        for(int i = 1;i <= n;++i){
            if(canTraverse[i] == 2)cout << 1;
            else cout << 0;
        }
    }
}

Compilation message (stderr)

island.cpp: In function 'int main()':
island.cpp:82:37: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   82 |             while(tmp.size() && ind < tmp.size()){
      |                                 ~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...