답안 #129630

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
129630 2019-07-12T19:51:58 Z khulegub Flood (IOI07_flood) C++14
48 / 100
526 ms 65536 KB
#include <bits/stdc++.h>
#define xx first
#define yy second
#define mp make_pair
#define pb push_back

using namespace std;
typedef pair<int, int> pii;
typedef long long i64;
int xac = 0;
int n;
int w;
// bool dbg = 0;
bool vis[100005];
int to[100005][4];
bool path[100005];
int tocnt[100005];
vector<pii> p;
vector<pii> wll;

void mark(int u){
	vis[u] = 1;
	for (int i = 0; i < 4; i++){
		if (to[u][i] != 0 and !vis[to[u][i]]){
			mark( to[u][i] );
		}
	}
}

int dfs(int u, int dir){
	if (path[u]) return u;
	// cout << u << '&' << dir << '\n';
	// if (dbg and u == 4) cout << dir;
	path[u] = 1;
	if (dir == -1){ //init
		if (tocnt[u] != 2){
			int daj = -1;
			queue <int> q;
			bool vis2[100005];
			memset(vis2, 0, sizeof vis2);
			q.push(u);
			vis2[u] = 1;
			while (!q.empty()){
				int nw = q.front();
				q.pop();
				if(tocnt[nw] == 2){
					daj = nw;
					break;
				}
				for (int i = 0; i < 4; i++){
					int v = to[nw][i];
					if(v != 0 and !vis2[v]){
						q.push(v);
						vis2[v] = 1;
					}
				}
			}
			path[u] = 0;
          	if (daj == -1) return -1;
			return dfs(daj, -1);
		}
		int arr[2] = {-1, -1};
		for (int i = 0; i < 4; i++){
			int v = to[u][i];
			if (v != 0){
				if (arr[0] == -1){
					arr[0] = i;
				}
				else arr[1] = i;
			}
		}
		if ((arr[0] + 1) % 4 == arr[1]) swap(arr[0], arr[1]);
		for (int i = 0; i < 2; i++){
			int v = to[u][arr[i]];
			if (v != 0){
				int tmp = dfs(v, arr[i]);
				if (tmp != -1){
					to[u][arr[i]] = 0;
					to[v][ (arr[i] + 2) % 4 ] = 0;
					tocnt[u]--;
					tocnt[v]--;
					xac++;
					if (tmp != u){
						path[u] = 0;
						return tmp;
					}
				}
			}
		}
	}
	else{
		int arr[3];
		arr[0] = (dir + 1) % 4;
		arr[1] = dir;
		arr[2] = (dir + 3) % 4;
		for (int i = 0; i < 3; i++){
			int v = to[u][arr[i]];
			if (v != 0){
				int tmp = dfs(v, arr[i]);
				if (tmp != -1){
					to[u][arr[i]] = 0;
					to[v][ (arr[i] + 2) % 4 ] = 0;
					tocnt[u]--;
					tocnt[v]--;
					xac++;
					if (tmp != u){
						path[u] = 0;
						return tmp;
					}
				}
			}
		}
	}
	path[u] = 0;
	return -1;
}

int main(){
	// freopen("in.txt", "r", stdin);
	cin >> n;
	
	p.resize(n + 1);
	
	for (int i = 1, tx, ty; i <= n; i++){
		cin >> tx >> ty;
		p[i] = mp(tx, ty);
	}
	
	cin >> w;
	
	wll.resize(w + 1);
	// 0 top
	// 1 baruun
	// 2 bot
	// 3 zuun
	for (int i = 1, a, b; i <= w; i++){
		cin >> a >> b;
		int dx = p[b].xx - p[a].xx;
		int dy = p[b].yy - p[a].yy;
		int dir;
		tocnt[a]++;
		tocnt[b]++;
		if (dx != 0){ // horizontal
			if (dx > 0){ // a b
				to[a][1] = b;
				to[b][3] = a;
				dir = 1;
			}
			else { // b a
				to[a][3] = b;
				to[b][1] = a;
				dir = 3;
			}
		}
		else{ //vert
			if (dy > 0){ // b ni deer
				to[a][0] = b;
				to[b][2] = a;
				dir = 0;
			}
			else{
				to[a][2] = b;
				to[b][0] = a;
				dir = 2;
			}
		}
		wll[i] = mp(a, dir);
	}

	for (int i = 1; i <= n; i++){
		if (!vis[i]){
			// if (i == 4) dbg = 1;
			dfs(i, -1);
			mark(i);
			// if (i == 4) dbg = 0;
			// cout << i << '&' << vis[11] << ' ';
			// break;
		}
	}

	// cout << "##################\n";

	cout << w - xac << '\n';
	for (int i = 1; i <= w; i++){
		if ( to[wll[i].xx][wll[i].yy] != 0 ) cout << i << '\n';
		// if ( to[wll[i].xx][wll[i].yy] != 0 ) cout << wll[i].xx << ' ' << to[wll[i].xx][wll[i].yy] << '\n';
	}
	return 0;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 504 KB Output is correct
2 Correct 2 ms 504 KB Output is correct
3 Correct 2 ms 532 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 632 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 504 KB Output is correct
2 Correct 4 ms 1016 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 504 KB Output is correct
2 Incorrect 3 ms 504 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Correct 2 ms 504 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 760 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 3 ms 760 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 4 ms 632 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 113 ms 1640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Runtime error 244 ms 65536 KB Execution killed with signal 9 (could be triggered by violating memory limits)
# 결과 실행 시간 메모리 Grader output
1 Incorrect 526 ms 3896 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 341 ms 5828 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 333 ms 6784 KB Output isn't correct
2 Halted 0 ms 0 KB -