이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
const int maxn = 2e5+3;
long long i,j,p,q,n,m,k;
vector <long long> s[maxn];
long long par[maxn],num[maxn],sum[maxn];
vector <long long> v[maxn];
vector <pair<long long,long long>> g[maxn];
pair <long long,long long> obh[maxn];
bool covered[maxn];
int Find(int p)
{
if(par[p]==p)
return p;
return Find(par[p]);
}
void Union(int p,int q)
{
p = Find(p);
q = Find(q);
if(p==q)
return ;
if(s[p].size()<s[q].size())
swap(p,q);
par[q] = p;
sum[p] += sum[q];
for(auto jj:s[q])
s[p].push_back(jj);
//s[q].clear();//reserve
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin>>n>>m;
vector <char> c(n);
for(i=1;i<=n;i++)
{
cin>>num[i];
obh[i] = {num[i],i};
}
sort(obh+1,obh+n+1);
for(i=1;i<=m;i++)
{
cin>>p>>q;
g[p].push_back({num[q],q});
g[q].push_back({num[p],p});
}
for(i=1;i<=n;i++)
{
if(g[i].empty())
continue;
sort(g[i].begin(),g[i].end());
for(auto j:g[i])
v[i].push_back(j.second);
}
for(i=1;i<=n;i++)
{
par[i] = i;
sum[i] = num[i];
s[i].push_back(i);
}
for(i=1;i<=n;i++)
{
p = obh[i].second;
covered[p] = true;
k = Find(p);
for(auto j:v[p])
{
int pp = Find(j);
if(pp==k || num[j]>num[p])continue;
// cout<<j<<endl;
if(num[p]>sum[pp])
{
s[pp].clear();
}
Union(k,pp);
}
}
p = Find(1);
for(i=0;i<n;i++)
c[i] = '0';
for(auto i:s[p])
c[i-1] = '1';
for(auto i:c)
cout<<i;
return 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... |