제출 #261772

#제출 시각아이디문제언어결과실행 시간메모리
261772shenxyColors (RMI18_colors)C++11
100 / 100
1036 ms106832 KiB
#include <cstdio>
#include <algorithm>
#include <vector>
using namespace std;
typedef pair<int, int> ii;
int N;
vector<int> queries[150000];
bool sad = 0;
struct UFDS {
	vector<int> parent, sz;
	vector<ii> ops;
	UFDS(int N) {
		for (int i = 0; i < N; ++i) parent.push_back(i), sz.push_back(1);
	}
	int find_parent(int i) {
		if (parent[i] == i) return i;
		return find_parent(parent[i]);
	}
	void union_set(int p, int q) {
		p = find_parent(p), q = find_parent(q);
		if (p == q) {
			ops.push_back(ii(-1, -1));
			return;
		}
		if (sz[p] < sz[q]) swap(p, q);
		parent[q] = p, sz[p] += sz[q];
		ops.push_back(ii(p, q));
	}
	void rollback() {
		if (ops.back() == ii(-1, -1)) {
			ops.pop_back();
			return;
		}
		parent[ops.back().second] = ops.back().second;
		sz[ops.back().first] -= sz[ops.back().second];
		ops.pop_back();
	}
} *sets;
struct seg {
	int s, e, m;
	vector<ii> v;
	seg *l, *r;
	seg(int _s, int _e) {
		s = _s, e = _e, m = (s + e) / 2;
		if (s != e) {
			l = new seg(s, m);
			r = new seg(m + 1, e);
		}
	}
	void add_edge(int a, int b, ii edge) {
		if (s == a && e == b) v.push_back(edge);
		else if (a > m) r -> add_edge(a, b, edge);
		else if (b <= m) l -> add_edge(a, b, edge);
		else l -> add_edge(a, m, edge), r -> add_edge(m + 1, b, edge);
	}
	void query() {
		for (ii i: v) sets -> union_set(i.first, i.second);
		if (s == e) {
			for (int i: queries[s]) {
				if (sets -> find_parent(i) != sets -> find_parent(N + s)) sad = 1;
			}
		} else {
			l -> query();
			r -> query();
		}
		for (int i = 0; i < v.size(); ++i) sets -> rollback();
	}
} *root;
int main() {
	int T;
	scanf("%d", &T);
	for (int h = 0; h < T; ++h) {
		sad = 0;
		int M;
		scanf("%d %d", &N, &M);
		int A[N], B[N], u, v;
		for (int i = 0; i < N; ++i) queries[i].clear();
		for (int i = 0; i < N; ++i) scanf("%d", &A[i]);
		for (int i = 0; i < N; ++i) scanf("%d", &B[i]);
		for (int i = 0; i < N; ++i) --A[i], --B[i];
		sets = new UFDS(2 * N);
		root = new seg(0, N - 1);
		for (int i = 0; i < N; ++i) {
			if (A[i] < B[i]) sad = 1;
			else root -> add_edge(A[i], A[i], ii(i, N + A[i]));
			queries[B[i]].push_back(i);
		}
		for (int i = 0; i < M; ++i) {
			scanf("%d %d", &u, &v);
			--u, --v;
			int low = max(B[u], B[v]), high = min(A[u], A[v]);
			if (low <= high) root -> add_edge(low, high, ii(u, v));
		}
		root -> query();
		printf(sad ? "0\n" : "1\n");
	}
	return 0;
}

컴파일 시 표준 에러 (stderr) 메시지

colors.cpp: In member function 'void seg::query()':
colors.cpp:66:21: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
   for (int i = 0; i < v.size(); ++i) sets -> rollback();
                   ~~^~~~~~~~~~
colors.cpp: In function 'int main()':
colors.cpp:71:7: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
  scanf("%d", &T);
  ~~~~~^~~~~~~~~~
colors.cpp:75:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d %d", &N, &M);
   ~~~~~^~~~~~~~~~~~~~~~~
colors.cpp:78:36: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   for (int i = 0; i < N; ++i) scanf("%d", &A[i]);
                               ~~~~~^~~~~~~~~~~~~
colors.cpp:79:36: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   for (int i = 0; i < N; ++i) scanf("%d", &B[i]);
                               ~~~~~^~~~~~~~~~~~~
colors.cpp:89:9: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
    scanf("%d %d", &u, &v);
    ~~~~~^~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...