Submission #283671

# Submission time Handle Problem Language Result Execution time Memory
283671 2020-08-26T05:17:01 Z AMO5 Izlet (COI19_izlet) C++17
18 / 100
789 ms 36628 KB
#include <bits/stdc++.h>

using namespace std;

#define fi first
#define se second
#define eb emplace_back
#define mt make_tuple
#define all(x) (x).begin(), (x).end()  
#define sz(x) int(x.size()) 
#define MOD 1000000007

typedef long long ll;
typedef pair <int, int> ii;
typedef pair <ll, ll> pll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef long double ld;

const ll INF=63;
const int mxn=3e3+5;
bool DEBUG=0;

int a[mxn][mxn],n,subt;
int col[mxn];
bool vis[mxn];
vector<ii>edges;
vi adj[mxn];

struct DSU{
	vi par;
	DSU(int n){
		for(int i=0; i<=n; i++)par.eb(i);
	}
	void reset(int n){
		par=vi();
		for(int i=0; i<=n; i++)par.eb(i);
	}
	int rt(int u){
		if(u!=par[u])par[u]=rt(par[u]);
		return par[u];
	}
	void merge(int u, int v){
		u=rt(u); v=rt(v);
		if(u==v)return;
		if(rand()%2)swap(u,v);
		par[v]=u;
	}
	bool sameset(int u, int v){
		return ((u=rt(u))==(v=rt(v)));
	}
};

DSU dsu(1);

void dfs(int pr, int st, int u, int p){
	if(a[pr][u]==a[st][u]){
		if(!dsu.sameset(pr,st)){
			//cerr<<pr<<" "<<st<<" "<<u<<" "<<p<<" : "<<a[st][u]<<"\n";
			dsu.merge(pr,u);
		}
	}
	for(int v:adj[u]){
		if(v==p)continue;
		dfs(pr,st,v,u);
	}
}

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0);
    //freopen("input.txt","r",stdin); freopen("output.txt","w",stdout);
    cin>>subt>>n;
    dsu.reset(n);
    for(int i=1; i<=n; i++){
		for(int j=1; j<=n; j++){
			cin>>a[i][j];
			if(i>j&&a[i][j]==1){
				if(dsu.sameset(i,j))continue;
				edges.eb(j,i);
				adj[i].eb(j);
				adj[j].eb(i);
				dsu.merge(i,j);
			}
		}
	}
	for(int i=1; i<=n; i++){
		for(int j=1; j<=n; j++){
			if(i>j&&a[i][j]==2){
				if(dsu.sameset(i,j))continue;
				edges.eb(j,i);
				adj[i].eb(j);
				adj[j].eb(i);
				dsu.merge(i,j);
			}
		}
	}
	dsu.reset(n);
	for(int i=1; i<=n; i++){
		for(int j:adj[i]){
			dfs(i,j,j,i);
		}
	}
	for(int i=1; i<=n; i++)cout<<dsu.rt(i)<<" ";
	cout<<"\n";
	for(int i=0; i<sz(edges); i++){
		cout<<edges[i].fi<<" "<<edges[i].se<<"\n";
	}
}
	
// READ & UNDERSTAND
// ll, int overflow, array bounds, memset(0)
// special cases (n=1?), n+1 (1-index)
// do smth instead of nothing & stay organized
// WRITE STUFF DOWN
# Verdict Execution time Memory Grader output
1 Correct 1 ms 512 KB Output is correct
2 Correct 737 ms 36600 KB Output is correct
3 Correct 721 ms 36600 KB Output is correct
4 Correct 742 ms 36628 KB Output is correct
5 Correct 747 ms 36496 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 789 ms 36252 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 512 KB Output is correct
2 Correct 737 ms 36600 KB Output is correct
3 Correct 721 ms 36600 KB Output is correct
4 Correct 742 ms 36628 KB Output is correct
5 Correct 747 ms 36496 KB Output is correct
6 Incorrect 789 ms 36252 KB Output isn't correct
7 Halted 0 ms 0 KB -