제출 #1343740

#제출 시각아이디문제언어결과실행 시간메모리
1343740jellybeanStranded Far From Home (BOI22_island)C++20
0 / 100
0 ms352 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define pb push_back
#define dd(x) cout<<#x<<" is "<<x<<endl;
typedef pair<int,int> pii;

const int N = 2e5+5;
int a[N], ans[N];
int n;

void dfs(int x, vector<pii> &edges, vector<pii> &newedges, set<int> &vis){
	pii p = {x,0};
	int id = lower_bound(edges.begin(), edges.end(), p) - edges.begin();
	while(id < edges.size() and edges[id].first == x){
		auto[u,v] = edges[id];
		if(vis.find(v) == vis.end()){
			id++;
			continue;
		}
		vis.erase(v);
		newedges.pb({u,v});
		newedges.pb({v,u});
		dfs(v,edges,newedges,vis);
		id++;
	}
}

void findsum(int x, int &sum, vector<pii> &edges, set<int> &vis){
	sum += a[x];
	pii p = {x,0};
	int id = lower_bound(edges.begin(),edges.end(),p) - edges.begin();
	while(id < edges.size() and edges[id].first == x){
		auto[u,v] = edges[id];
		if(vis.find(v) != vis.end()){
			id++;
			continue;
		}
		vis.insert(v);
		findsum(v, sum, edges, vis);
		id++;
	}
}

void recurse(vector<pii> &edges, int x){
	int mxnode = -1, mx = 0;
	for(int i=0; i<edges.size(); i++){
		auto [u,v] = edges[i];
		if(a[u] > mx) mx = a[u], mxnode = u;
	}
	if(mxnode == -1) return;
	
	int sum = 0;
	set<int> vis;
	vis.insert(mxnode);
	findsum(mxnode, sum, edges, vis);
	if(sum < x) return;
	
	vector<pii> edges1;
	vis = set<int>();
	for(int i=0; i<edges.size(); i++){
		auto[u,v] = edges[i];
		if(a[u] == mx or a[v] == mx){
			if(a[u] == mx) ans[u] = 1;
			if(a[v] == mx) ans[v] = 1;
		} else {
			edges1.pb({u,v});
			vis.insert(u);
		}
	}
	
	/*cout<<"adj1 (removed edges):" <<endl;
	for(int i=1; i<=n; i++){
		for(auto j: adj1[i]) cout<<i<<' '<<j<<endl;
	}
	
	cout<<"--------"<<endl;*/
	
	while(vis.size()){
		int i = *vis.begin();
		vis.erase(i);
		vector<pii> newedges;
		dfs(i, edges1, newedges, vis);
		/*dd(mxnode)
		cout<<"vis"<<endl;
		for(int i=1; i<=n; i++) cout<<vis[i]<<" ";cout<<endl;
		
		cout<<"newadj (within adj1):"<<endl;
		for(int i=1; i<=n; i++){
			for(auto j: newadj[i]) cout<<i<<' '<<j<<endl;
		}
		cout<<"---------"<<endl;*/
		recurse(newedges, mx);
		
	}
}

signed main(){
	ios::sync_with_stdio(0); cin.tie(0);
	
	int m; cin>>n>>m;
	for(int i=1; i<=n; i++) cin>>a[i];
	
	vector<pii>edges;
	for(int i=0; i<m; i++){
		int u,v; cin>>u>>v;
		edges.pb({u,v});
		edges.pb({v,u});
	}
	
	sort(edges.begin(), edges.end());
	
	recurse(edges, 0);
	
	for(int i=1; i<=n; i++) cout<<ans[i];
	
	return 0;
}
#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...