Submission #913930

#TimeUsernameProblemLanguageResultExecution timeMemory
913930pragmatistStranded Far From Home (BOI22_island)C++17
40 / 100
1074 ms37820 KiB
    /*
    JUDGE_ID : 331438IX
    */
     
    #include<iostream>
    #include<cassert>
    #include<cmath>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    #include<stack>
    #include<set>
    #include<queue>
    #include<map>
     
    using namespace std;
     
    const int N = (int)2e5 + 7;
    const int inf = (int)1e9 + 7;
    const int MOD = (int)998244353;
    const long long INF = (long long)1e18 + 7; 
     
    int mult(int x, int y) {
    	return 1ll*x*y%MOD;
    }
     
    int sum(int x, int y) {
    	x += y;
    	if(x >= MOD) {
    		x -= MOD;
    	}
    	return x;
    }
     
    int sub(int x, int y) {
    	x -= y;
    	if(x < 0) {
    		x += MOD;
    	}
    	return x;
    }
     
    bool is_prime(int x) {
    	if(x == 1) {
    		return 0;
    	}
    	for(int i = 2; i * i <= x; ++i) {
    		if(x % i == 0) {
    			return 0;
    		}
    	}
    	return 1;
    }
     
    int n, m, a[N], p[N];
    bool ans[N];
    vector<int> pos[N];
     
    int get(int v) {
    	return (p[v] == v ? v : p[v] = get(p[v]));
    }
    long long s[N];
     
    void comb(int u, int v) {
    	u = get(u);
    	v = get(v);
    	if(u == v) {
    		return;
    	}
    	p[u] = v;
    	s[v] += s[u];
    }
     
    long long val[N];
     
    int b[N]; 
     
    bool cmp2(int i, int j) {
    	return a[i] < a[j];
    }
     
    vector<int> g[N];
     
    int main() {	
    	ios_base::sync_with_stdio(NULL);
    	cin.tie(0);
    //	freopen("in.txt", "r", stdin);
    //	freopen("out.txt", "w", stdout);         
    	cin >> n >> m;
    	int mx = 0;
    	for(int i = 1; i <= n; ++i) {
    		cin >> a[i];
    		mx = max(mx, a[i]);
    		p[i] = i;
    		b[i] = i;
    		s[i] = a[i];
    	}
    	for(int i = 1; i <= n; ++i) {
    		ans[i] = 1;
    	}    
    	vector<pair<int, int> > e;
    	for(int i = 1; i <= m; ++i) {
    		int u, v;
    		cin >> u >> v;
    		g[u].push_back(v);
    		g[v].push_back(u);
    		e.push_back({u, v});
    	}    
    	sort(b+1, b+1+n, cmp2);
    	for(int i = 1; i <= n; ++i) {
    		if(a[b[i]] == mx) {
    			break;
    		}
    		int r = i;
    		while(r<n && a[b[r]] == a[b[r+1]]) {
    			r++;
    		}             
    		for(int j = 1; j <= n; ++j) {
    			pos[j].clear();
    		}
    		for(int k = i; k <= r; ++k) {
    			for(auto u : g[b[k]]) {
    				if(a[u] <= a[b[k]]) {
    					comb(u, b[k]);
    				}
    			}
    		}
    		for(int k = i; k <= r; ++k) {
    			for(auto u : g[b[k]]) {
    				long long cur = s[get(b[k])];
    				if(cur >= a[u]) {
    					comb(u, b[k]);
    				}
    			}
    		}  
    		for(int j = 1; j <= n; ++j) {
    			pos[get(j)].push_back(j);
    		}
    		for(int j = 1; j <= n; ++j) {
    			long long cur = s[j];
    			if(cur < a[b[r+1]]) {
    				for(auto x : pos[j]) {
    					ans[x] = 0;
    				}
    			}			
    		}
    		  
    		i = r;
    	}
    	for(int i = 1; i <= n; ++i) {
    		cout << ans[i];
    	}
    	return 0;
    }
#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...