답안 #706219

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
706219 2023-03-06T05:57:21 Z Abrar_Al_Samit 늑대인간 (IOI18_werewolf) C++17
0 / 100
4000 ms 50756 KB
#include<bits/stdc++.h>
#include "werewolf.h"
using namespace std;

const int nax = 2e5 + 10;
vector<int>a[nax], b[nax];
bool vis[nax];
// vector<int>stk1, stk2;

// void dfs1(int v) {
// 	vis[v] = 1;
// 	stk1.push_back(v);
// 	for(int u : a[v]) if(!vis[u]) {
// 		dfs1(u);
// 	}
// }
// void dfs2(int v) {
// 	vis[v] = 1;
// 	stk2.push_back(v);
// 	for(int u : b[v]) if(!vis[u]) {
// 		dfs2(u);
// 	}
// }

vector<int>stk;
void dfs(int v) {
	vis[v] = 1;
	stk.push_back(v);
	for(int u : a[v]) if(!vis[u]) {
		dfs(u);
	}
}
vector<int>ord;

struct node {
	int mn, mx;
	node() {}
	node(int i) {
		mn = mx = ord[i];
	}
	node(int x, int y) {
		mn = x, mx = y;
	}
} tree[nax * 4];

node merge(node x, node y) {
	node ret;
	ret.mn = min(x.mn, y.mn);
	ret.mx = max(x.mx, y.mx);
	return ret;
}
void build(int l, int r, int v) {
	if(l==r) {
		tree[v] = node(l-1);
		return;
	}
	int mid = (l+r)/2;
	build(l, mid, v*2), build(mid+1, r, v*2+1);
	tree[v] = merge(tree[v*2], tree[v*2+1]);
}
node query(int l, int r, int L, int R, int v) {
	if(l>=L && r<=R) return tree[v];
	if(l>R || r<L) return node(1e9, -1e9);

	int mid = (l+r)/2;
	return merge(query(l, mid, L, R, v*2), query(mid+1, r, L, R, v*2+1));
}
vector<int> check_validity(int N, vector<int> X, vector<int> Y,
                                vector<int> S, vector<int> E,
                                vector<int> L, vector<int> R) {

	int q = S.size();
	int m = X.size();
	vector<int>ans(q);


	for(int i=0; i<m; ++i) {
		a[X[i]].push_back(Y[i]);
		a[Y[i]].push_back(X[i]);
	}

	memset(vis, 0, sizeof vis);
	for(int i=0; i<N; ++i) if(a[i].size()==1) {
		dfs(i);
		ord = stk;
		break;
	}


	vector<int>invord(N);
	for(int i=0; i<N; ++i) {
		invord[ord[i]] = i;
	}
	build(1, N, 1);


	for(int i=0; i<q; ++i) {
		vector<pair<int,int>>bag;

		bool f = true;
		for(int x : {S[i], E[i]}) {
			int l = 0, r = N - invord[x] - 1;
			while(l<r) {
				int mid = (l+r+1)/2;
				node cr = query(1, N, invord[x]+1, invord[x]+mid+1, 1);
				if(f) {
					if(cr.mn>=L[i]) {
						l = mid;
					} else {
						r = mid-1;
					}
				} else {
					if(cr.mx<=R[i]) {
						l = mid;
					} else {
						r = mid-1;
					}
				}
			}
			int rit = invord[x] + l;

			l = 0, r = invord[x];
			while(l<r) {
				int mid = (l+r+1)/2;
				node cr = query(1, N, invord[x]-mid+1, invord[x]+1, 1);
				if(f) {
					if(cr.mn>=L[i]) {
						l = mid;
					} else {
						r = mid-1;
					}
				} else {
					if(cr.mx<=R[i]) {
						l = mid;
					} else {
						r = mid-1;
					}
				}
			}
			int lef = invord[x] - l;
			bag.emplace_back(lef, rit);
			f = false;

		}
		if(bag[0].first>=bag[1].first && bag[0].first<=bag[1].second) {
			ans[i] = 1;
		} else if(bag[1].first>=bag[0].first && bag[1].first<=bag[0].second) {
			ans[i] = 1;
		}
	}
	return ans;

	// for(int i=0; i<q; ++i) {
	// 	for(int j=0; j<N; ++j) {
	// 		a[j].clear(), b[j].clear();
	// 	}
	// 	for(int j=0; j<m; ++j) {
	// 		int u = X[j], v = Y[j];
	// 		if(min(u, v) >= L[i]) {
	// 			a[u].push_back(v);
	// 			a[v].push_back(u);
	// 		} 
	// 		if(max(u, v) <= R[i]) {
	// 			b[u].push_back(v);
	// 			b[v].push_back(u);
	// 		}
	// 	}

	// 	stk1.clear(), stk2.clear();

	// 	memset(vis, 0, sizeof vis);		
	// 	dfs1(S[i]);
	// 	memset(vis, 0, sizeof vis);
	// 	dfs2(E[i]);

	// 	int cnt[N] = {0};
	// 	for(int x : stk1) {

	// 		if(x>=L[i] && x<=R[i]) {
	// 			cnt[x]++;
	// 		}
	// 	}
	// 	for(int x : stk2) {
	// 		if(x>=L[i] && x<=R[i]) {
	// 			cnt[x]++;
	// 			if(cnt[x]>1) {
	// 				ans[i] = 1;
	// 			}
	// 		}
	// 	}
	// }
	// return ans;
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 9832 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 9832 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3997 ms 50756 KB Output is correct
2 Execution timed out 4021 ms 50744 KB Time limit exceeded
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 6 ms 9832 KB Output isn't correct
2 Halted 0 ms 0 KB -