제출 #1329876

#제출 시각아이디문제언어결과실행 시간메모리
1329876boclobanchatStranded Far From Home (BOI22_island)C++20
100 / 100
153 ms32940 KiB
#include<bits/stdc++.h>
using namespace std;
const int MAXN=2e5+5;
int A[MAXN],pos[MAXN],tt[MAXN];
long long dsu[MAXN],val[MAXN];
vector<int> ds[MAXN],vi[MAXN];
bool comp(int a,int b)
{
	return A[a]<A[b];
}
int root(int i)
{
	if(!dsu[i]) return i;
	return dsu[i]=root(dsu[i]);
}
void merge(int i,int j)
{
	if((i=root(i))==(j=root(j))) return ;
	dsu[j]=i,val[i]+=val[j];
}
void merges(int i,int j)
{
	if((i=root(i))==(j=root(j))) return ;
	if(vi[i].size()<vi[j].size()) swap(i,j);
	dsu[j]=i,val[i]+=val[j];
	for(auto v:vi[j]) vi[i].push_back(v);
	vi[j].clear();
}
int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    int n,m;
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
    	cin>>A[i];
    	pos[i]=i,val[i]=A[i],vi[i].push_back(i);
	}
	for(int i=1;i<=m;i++)
	{
		int l,r;
		cin>>l>>r;
		ds[l].push_back(r),ds[r].push_back(l);
	}
    sort(pos+1,pos+n+1,comp);
    for(int i=1;i<=n;i++) tt[pos[i]]=i;
    for(int i=1;i<=n;i++)
    {
    	int p=pos[i];
    	for(auto v:ds[p]) if(i>tt[v]&&root(v)!=root(p))
    	{
    		if(val[root(v)]<A[p]) merge(p,v);
    		else merges(p,v);
		}
	}
	string ans;
	for(int i=1;i<=n;i++) ans+="0";
	for(auto v:vi[root(1)]) ans[v-1]='1';
	cout<<ans;
}
#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...