Submission #948191

#TimeUsernameProblemLanguageResultExecution timeMemory
948191amirhoseinfar1385Stranded Far From Home (BOI22_island)C++17
100 / 100
597 ms68296 KiB
#include<bits/stdc++.h>
using namespace std;
const long long maxn=200000+10;
vector<long long>adj[maxn];
long long all[maxn],n,m,dp[maxn],vis[maxn],mishe[maxn],mn[maxn];

struct cmp {
    bool operator() (long long a, long long b) const {
		if(all[a]==all[b]){
			return a<b;
		}
		return all[a]<all[b];
    }
};

struct dsu{
	long long par[maxn],sum[maxn],mx[maxn];
	set<long long,cmp>st[maxn];
	dsu(){
		for(long long i=0;i<maxn;i++){
			par[i]=i;
		}
	}
	long long root(long long u){
		if(u==par[u]){
			return u;
		}
		return par[u]=root(par[u]);
	}
	void con(long long u,long long v){
		long long rootu=root(u),rootv=root(v);
		if(rootu!=rootv){
			if((long long)st[rootu].size()<(long long)st[rootv].size()){
				swap(rootu,rootv);
			}
			par[rootv]=rootu;
			sum[rootu]+=sum[rootv];
			mx[rootu]=max(mx[rootu],mx[rootv]);
			for(auto x:st[rootv]){
				st[rootu].insert(x);
			}
			while((long long)st[rootu].size()>0&&mx[rootu]>=all[(*st[rootu].begin())]){
				st[rootu].erase(*st[rootu].begin());
			}
		}
	}
	long long porssum(long long u){
		long long v=root(u);
		return sum[v];
	}
	long long porsy(long long u){
		long long v=root(u);
		if((long long)st[v].size()==0){
			return -1;
		}
		return (*st[v].begin());
	}
}ds;

void vorod(){
	cin>>n>>m;
	all[0]=1e9+5;
	for(long long i=1;i<=n;i++){
		cin>>all[i];
		ds.sum[i]=all[i];
		ds.mx[i]=all[i];
	}
	for(long long i=0;i<m;i++){
		long long u,v;
		cin>>u>>v;
		//cout<<"ha "<<u<<" "<<v<<endl;
		ds.st[u].insert(v);
		ds.st[v].insert(u);
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
}

void pre(){
	vector<pair<long long,long long>>so;
	for(long long i=1;i<=n;i++){
		so.push_back(make_pair(all[i],i));
	}
	sort(so.begin(),so.end());
	vector<long long>now;
	for(long long i=0;i<n;i++){
		if(i>0&&so[i].first!=so[i-1].first){
			for(auto x:now){
				dp[x]=ds.porssum(x);
				mn[x]=ds.porsy(x);
			}
			now.clear();
		}
		long long u=so[i].second;
		now.push_back(u);
		vis[u]=1;
		for(auto x:adj[u]){
			if(vis[x]==1){
				ds.con(x,u);
			}
		}
	}
	for(auto x:now){
		dp[x]=ds.porssum(x);
		mn[x]=ds.porsy(x);
	}
	now.clear();
}

void solve(){
	vector<pair<long long,long long>>so;
	for(long long i=1;i<=n;i++){
		so.push_back(make_pair(all[i],i));
	}
	sort(so.begin(),so.end());
	for(long long i=n-1;i>=0;i--){
		long long u=so[i].second;
		//cout<<u<<" "<<dp[u]<<" "<<mn[u]<<endl;
		if(all[u]==so.back().first){
			mishe[u]=1;
		}
		if(mn[u]==-1||mishe[mn[u]]==0||dp[u]<all[mn[u]]){
			mishe[u]|=0;
		}else{
			mishe[u]|=1;
		}
	}
	for(long long i=1;i<=n;i++){
		cout<<mishe[i];
	}
	cout<<"\n";
}

int main(){
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
//	freopen("inp.txt","r",stdin);
	vorod();
	pre();
	solve();
}
#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...