답안 #55928

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
55928 2018-07-09T07:46:08 Z Yehezkiel Pipes (CEOI15_pipes) C++17
100 / 100
2532 ms 15292 KB
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define mp make_pair
#define pb push_back
#define eb emplace_back
#define gc getchar_unlocked
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
typedef pair<int,int> pii;
const int MAXN=100000;
inline void scan(int &angka){
	char input=gc();
	while(!('0'<=input&&input<='9'))	input=gc();
	angka=0;
	while('0'<=input&&input<='9')	angka=(angka<<1)+(angka<<3)+input-'0',input=gc();
}
int n,m,i;

const int logn=17;
vector <pii> edgelist;
vector <int> node[MAXN+1];
int kandungan[MAXN+1],par[MAXN+1][logn]={},delta[MAXN+1]={},depth[MAXN+1]={};
bitset<MAXN+1> report;

void dfs(const int &now){
	for(int i=1;i<logn;++i)
		par[now][i]=par[par[now][i-1]][i-1];
	
	for(int i=0;i<node[now].size();++i)
	{
		int tempDfs=(edgelist[node[now][i]].fi==now)?edgelist[node[now][i]].se:edgelist[node[now][i]].fi;
		if(tempDfs==par[now][0])
			continue;
		par[tempDfs][0]=now;
		depth[tempDfs]=depth[now]+1;
		kandungan[tempDfs]=node[now][i];
		dfs(tempDfs);
	}
}
inline int lca(int u,int v){
	if(depth[u]>depth[v])
		swap(u,v);
	int beda=depth[v]-depth[u];
	/*for(int i=0;i<logn;++i)
		if(beda&(1<<i))*/
	while(beda)
	{
		v=par[v][__builtin_popcount((beda&-beda)-1)];
		beda-=beda&-beda;
	}
	if(u==v)
		return u;
	for(i=logn-1;i>=0;--i)
	{
		if(par[u][i]!=par[v][i])
		{
			u=par[u][i];
			v=par[v][i];
		}
	}
	return par[u][0];
}
int findReport(const int &now){
	int status=delta[now];
	delta[now]=0;			//done urusannya, ngereport karena butuh di reset
	for(int i=0;i<node[now].size();++i)
	{
		int tempDfs=(edgelist[node[now][i]].fi==now)?edgelist[node[now][i]].se:edgelist[node[now][i]].fi;
		if(tempDfs==par[now][0])
			continue;
		status+=findReport(tempDfs);
	}
	if(status!=0&&kandungan[now]!=-1)				//part of cycle berarti
		report[kandungan[now]]=false;
	return status;
}

class UFDS{
	private:
	int p[MAXN+1],size[MAXN+1];
	int finds(const int &u){
		if(p[u]!=u)
			p[u]=finds(p[u]);
		return p[u];
	}
	public:
	inline void inis(){
		for(int i=1;i<=n;++i)
		{
			p[i]=i;
			size[i]=1;
		}
	}
	inline bool boss(const int &pos){
		return p[pos]==pos;
	}
	inline bool connected(const int &u,const int &v){
		return finds(u)==finds(v);
	}
	inline void gabung(int &u,int &v){
		int rootU=finds(u);
		int rootV=finds(v);
		if(rootU==rootV)
			return;
		if(size[rootU]<size[rootV])
		{
			swap(rootU,rootV);
			swap(u,v);
		}
		size[rootU]+=size[rootV];
		p[rootV]=rootU;
		
		findReport(rootV);
		par[v][0]=u;
		depth[v]=depth[u]+1;
		kandungan[v]=edgelist.size();
		dfs(v);
	}
};
UFDS disjointSet;
int main()
{	
	scan(n),scan(m);
	disjointSet.inis();
	
	int u,v;
	for(int i=1;i<=m;++i)
	{
		scan(u),scan(v);
		if(disjointSet.connected(u,v))
		{
			delta[lca(u,v)]-=2;
			delta[u]++;
			delta[v]++;
		}
		else
		{
			disjointSet.gabung(u,v);
			node[u].eb(edgelist.size());
			node[v].eb(edgelist.size());
			report[edgelist.size()]=true;
			edgelist.eb(u,v);
		}
	}
	for(i=1;i<=n;++i)
		if(disjointSet.boss(i))
			findReport(i);
	for(i=0;i<edgelist.size();++i)
	{
		if(!report[i])
			continue;
		printf("%d %d\n",edgelist[i].fi,edgelist[i].se);
	}
}

Compilation message

pipes.cpp: In function 'void dfs(const int&)':
pipes.cpp:31:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<node[now].size();++i)
              ~^~~~~~~~~~~~~~~~~
pipes.cpp: In function 'int findReport(const int&)':
pipes.cpp:68:15: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0;i<node[now].size();++i)
              ~^~~~~~~~~~~~~~~~~
pipes.cpp: In function 'int main()':
pipes.cpp:150:11: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(i=0;i<edgelist.size();++i)
          ~^~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 2688 KB Output is correct
2 Correct 3 ms 2688 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 3300 KB Output is correct
2 Correct 7 ms 3328 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 63 ms 3200 KB Output is correct
2 Correct 62 ms 3192 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 145 ms 3968 KB Output is correct
2 Correct 162 ms 3956 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 290 ms 5700 KB Output is correct
2 Correct 239 ms 6488 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 578 ms 11796 KB Output is correct
2 Correct 694 ms 11820 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1012 ms 12924 KB Output is correct
2 Correct 809 ms 12988 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 1566 ms 15180 KB Output is correct
2 Correct 1931 ms 15208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2193 ms 15152 KB Output is correct
2 Correct 2186 ms 15208 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2532 ms 14568 KB Output is correct
2 Correct 2001 ms 15292 KB Output is correct