제출 #1351657

#제출 시각아이디문제언어결과실행 시간메모리
1351657jumpStranded Far From Home (BOI22_island)C++20
0 / 100
192 ms23592 KiB
#include <bits/stdc++.h>
#define int long long
std::vector<int> adj[200010];
int arr[200010];
bool pos[200010];
bool impos[200010];
bool visit[200010];
std::vector<std::pair<int,int>> srt;
void dfs(int curr,int par,int ps){
	pos[curr]=true;
	for(auto to:adj[curr]){
		if(pos[to]||to==par||arr[to]>arr[curr])continue;
		dfs(to,curr,arr[curr]);
	}
}
bool bfs(int curr){
	if(pos[curr])return true;
	if(impos[curr])return false;
	visit[curr]=true;
	std::stack<int> st;
	int size=arr[curr];
	int minneed=1e9;
	std::priority_queue<std::pair<int,int>> pq;
	pq.push({0,curr});
	bool posb=true;
	while(!pq.empty()){
		int tsize = -pq.top().first;
		int curr = pq.top().second;
		pq.pop();
		visit[curr]=true;
		if(tsize>size){
			posb=false;
			break;
		}
		size+=tsize;
		if(pos[curr]||size>minneed){
			posb=true;
			break;
		}
		visit[curr]=true;
		st.push(curr);
		for(auto to:adj[curr]){
			if(pos[to])minneed=std::min(minneed,arr[to]);
			if(visit[to])continue;
			pq.push({-arr[to],to});
		}
	}
	if(posb){
		dfs(curr,curr,arr[curr]);
		while(!st.empty())visit[st.top()]=false,st.pop();
	}
	else{
		while(!st.empty())impos[st.top()]=true,visit[st.top()]=false,st.pop();
	}
	return pos[curr];
}
signed main() {
	int n,m;
	std::cin >> n >> m;
	std::vector<std::pair<int,bool>> ans;
	for(int i=1;i<=n;i++){
		std::cin >> arr[i];
		srt.push_back({arr[i],i});
	}
	std::sort(srt.begin(),srt.end());
	for(int i=1;i<=m;i++){
		int a,b;
		std::cin >> a >> b;
		adj[a].push_back(b);
		adj[b].push_back(a);
	}
	for(auto [s,node]:srt){
		ans.push_back({node,bfs(node)});
	}
	std::sort(ans.begin(),ans.end());
	for(auto [num,s]:ans){
		if(s)std::cout << 1;
		else std::cout << 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...