Submission #1160348

#TimeUsernameProblemLanguageResultExecution timeMemory
1160348WH8Island Hopping (JOI24_island)C++20
65 / 100
3 ms788 KiB
#include <bits/stdc++.h>
using namespace std;
#include "island.h"
#define f first
#define s second

int ans[305][305];


int p[305];
int par(int x){
	if(p[x]==0)return x;
	return p[x]=par(p[x]);
}
bool merge(int a,int b){
	int x=par(a),y=par(b);
	if(x==y)return 0;
	p[x]=y;
	return 1;
}

void solve(int n, int L) {
	int a[n+1];fill(a,a+n+1,0);
	set<pair<int,int>> s;
	for(int i=1;i<=n;i++){
		// start asking whether a[i]+1
		for(int ck=a[i]+1;ck<n-1;ck++){
			if(s.size() == n-1) break;
			int res=ans[i][ck]=(ans[i][ck]==0?query(i, ck):ans[i][ck]);
			if(par(res)==par(i))break;
			int cor;
			if(ck==a[i]+1)cor=i;
			else{
				cor=ans[res][a[res]+1]=(ans[res][a[res]+1]==0?query(res, a[res]+1):ans[res][a[res]+1]);
			}
			if(cor==i){
				a[res]++;	
				if(merge(i, res)) s.insert({i, res});
			}
			else break;
		}
		if(s.size() == n-1) break;

	}

	//~ assert(s.size()==n-1);
	for(auto it:s){
		//~ cout<<it.f<<" "<<it.s<<endl;
		answer(it.f,it.s);
	}
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...