Submission #283307

# Submission time Handle Problem Language Result Execution time Memory
283307 2020-08-25T14:14:14 Z AMO5 Izlet (COI19_izlet) C++17
18 / 100
611 ms 53496 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);
	}
	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)));
	}
};

void dfs(int u, int p=0){
	vis[u]=1;
	for(int v:adj[u]){
		if(v==p)continue;
		if(!vis[v])dfs(v,u);
	}
}

void dfs2(int u, int p, int c){
	col[u]=c;
	vis[u]=1;
	for(int v:adj[u]){
		if(v==p)continue;
		if(!vis[v])dfs2(v,u,c);
	}
}

//subtask 1

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 dsu(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(i,j);
				adj[i].eb(j);
				adj[j].eb(i);
				dsu.merge(i,j);
			}
		}
	}
	if(subt!=1)return 0;
	vi poor,cc;
	for(int i=1; i<=n; i++){
		if(sz(adj[i])==0)poor.eb(i);
		else if(!vis[i]){
			cc.eb(i);
			dfs(i);
		}
	}
	int c=0;
	fill(vis+1,vis+n+1,0);
	for(int i=0; i<sz(cc); i++){
		dfs2(cc[i],0,c);
		c=1-c;
		if(i)edges.eb(cc[i],cc[i-1]);
	}
	if(sz(cc)){
		for(int x:poor){
			col[x]=!col[cc[0]];
			edges.eb(x,cc[0]);
		}
		for(int i=1; i<=n; i++)cout<<col[i]+1<<" ";
		cout<<"\n";
		for(ii x:edges){
			cout<<x.fi<<" "<<x.se<<"\n";
		}
	}else{
		//all 2
		for(int i=1; i<=n; i++)cout<<i%2+1<<" ";
		cout<<"\n";
		for(int i=1; i<n; i++){
			cout<<i<<" "<<i+1<<"\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 562 ms 53496 KB Output is correct
3 Correct 575 ms 53496 KB Output is correct
4 Correct 611 ms 53496 KB Output is correct
5 Correct 575 ms 53368 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 571 ms 35852 KB Unexpected end of file - int32 expected
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 1 ms 512 KB Output is correct
2 Correct 562 ms 53496 KB Output is correct
3 Correct 575 ms 53496 KB Output is correct
4 Correct 611 ms 53496 KB Output is correct
5 Correct 575 ms 53368 KB Output is correct
6 Incorrect 571 ms 35852 KB Unexpected end of file - int32 expected
7 Halted 0 ms 0 KB -