# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
733428 | speedyArda | Stranded Far From Home (BOI22_island) | C++14 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "bits/stdc++.h"
using namespace std;
using ll = long long;
const int MAXN = 2e5+5;
ll in[MAXN], sum[MAXN];
int par[MAXN];
bool marked[MAXN];
int find(int v)
{
int curr_par = v;
while(curr_par != par[curr_par])
{
if(marked[curr_par])
marked[v] = true;
curr_par = par[curr_par];
}
return curr_par;
}
void merge(int a, int b)
{
a = find(a), b = find(b);
if(a == b)
return ;
if(sum[a] < sum[b])
swap(a, b);
sum[a] += sum[b];
sum[b] = 0;
par[b] = a;
}
vector < vector< int > > adj(MAXN);
int main()
{
int n, m;
cin >> n >> m;
vector < pair<int, int> > sorted;
for(int i = 1; i <= n; i++) {
cin >> in[i];
sorted.push_back({in[i], i});
ans[i] = 1;
sum[i] = in[i];
par[i] = i;
}
sort(sorted.begin(), sorted.end());
for(int i = 1; i <= m; i++)
{
int f, s;
cin >> f >> s;
adj[f].push_back(s);
adj[s].push_back(f);
}
for(int i = 0; i < n; i++)
{
int idx = sorted[i].second;
for(int e : adj[idx])
{
if(in[e] <= in[idx]) {
int other = find(e);
if(sum[other] < in[idx])
marked[other] = true;
merge(other, idx);
}
}
}
for(int i = 1; i <= n; i++)
{
find(i);
cout << !marked[i];
}
cout << "\n";
}