이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int nx=2e5+5;
ll n, m, sz[2*nx], u, v, dsu[2*nx], cnt;
vector<tuple<int, int, int>> d;
vector<pair<int, int>> p;
bool can[2*nx];
int find(int x)
{
if (dsu[x]==x) return x;
return dsu[x]=find(dsu[x]);
}
void dfs(int u)
{
if (u<=n) return;
if (!can[u]) can[p[u].first]=can[p[u].second]=0;
dfs(p[u].first); dfs(p[u].second);
}
int main()
{
cin.tie(NULL)->sync_with_stdio(false);
cin>>n>>m;
for (int i=1; i<=2*n; i++) can[i]=1, dsu[i]=i;
for (int i=1; i<=n; i++) cin>>sz[i];
for (int i=0; i<m; i++) cin>>u>>v, d.push_back({max(sz[u], sz[v]), u, v});
sort(d.begin(), d.end());
p.resize(n+1); cnt=n;
for (int i=0; i<m; i++)
{
auto [w, u, v]=d[i];
int pu=find(u), pv=find(v);
if (pu==pv) continue;
if (sz[pu]<w) can[pu]=0;
if (sz[pv]<w) can[pv]=0;
dsu[pu]=dsu[pv]=++cnt;
sz[cnt]=sz[pu]+sz[pv];
p.push_back({pu, pv});
}
dfs(cnt);
for (int i=2; i<=n; i++)
{
if (find(i)!=find(1))
{
cout<<string(n, '0');
return 0;
}
}
for (int i=1; i<=n; i++) cout<<(can[i]?'1':'0');
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |