답안 #562583

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
562583 2022-05-14T17:11:57 Z hoanghq2004 분수 공원 (IOI21_parks) C++17
0 / 100
1 ms 212 KB
#include <bits/stdc++.h>
#pragma GCC optimize ("O3")
#pragma GCC optimize ("unroll-loops")
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
#include "parks.h"

using namespace __gnu_pbds;
using namespace std;

template <typename T>
using ordered_set = tree <T, null_type, less <T>, rb_tree_tag, tree_order_statistics_node_update>;
//
//static void check(bool cond, string message) {
//	if (!cond) {
//		printf("%s\n", message.c_str());
//		fclose(stdout);
//		exit(0);
//	}
//}
//
//static int n;
//static bool build_called;
//static int m;
//static vector<int> _u, _v, _a, _b;
//
//void build(vector<int> u, vector<int> v, vector<int> a, vector<int> b) {
//	check(!build_called, "build is called more than once");
//	build_called = true;
//	m = u.size();
//	check(int(v.size()) == m, "u.size() != v.size()");
//	check(int(a.size()) == m, "u.size() != a.size()");
//	check(int(b.size()) == m, "u.size() != b.size()");
//	_u = u;
//	_v = v;
//	_a = a;
//	_b = b;
//}

const int N = 2e5 + 10;

int par[N], sz[N];

int Find(int u) {
    return (u == par[u] ? u : par[u] = Find(par[u]));
}

int Union(int u, int v) {
    if ((u = Find(u)) == (v = Find(v))) return 0;
    if (sz[u] < sz[v]) swap(u, v);
    par[v] = u;
    sz[u] += sz[v];
    return 1;
}

int construct_roads(std::vector<int> x, std::vector<int> y) {
    int n = x.size();
    map <pair <int, int>, int> id;
    for (int i = 0; i < n; ++i) id[{x[i], y[i]}] = i, par[i] = i, sz[i] = 1;
    vector <tuple <int, int, int, int> > ans;
    int cnt = 0;
    auto addX = [&](int x, int y, int i, int j) {
        if (Find(i) == Find(j)) return;
        if (x + y & 2) ans.push_back({i, j, x - 1, y - 1});
        else ans.push_back({i, j, x + 1, y - 1});
        cnt += Union(i, j);
    };
    auto addY = [&](int x, int y, int i, int j) {
        if (Find(i) == Find(j)) return;
        if (x + y & 2) ans.push_back({i, j, x - 1, y + 1});
        else ans.push_back({i, j, x - 1, y - 1});
        cnt += Union(i, j);
    };
    for (int i = 1; i <= n; ++i) {
        if (id.find({x[i], y[i] - 2}) != id.end()) addX(x[i], y[i], i, id[{x[i], y[i] - 2}]);
        else addY(x[i], y[i], i, id[{x[i] - 2, y[i]}]);
    }
    if (cnt != n - 1) return 0;
    vector <int> u, v, a, b;
    for (auto [_u, _v, _a, _b]: ans)
        u.push_back(_u), v.push_back(_v), a.push_back(_a), b.push_back(_b);
    build(u, v, a, b);
    return 1;
}


//int main() {
//	assert(scanf("%d", &n) == 1);
//	vector<int> x(n), y(n);
//	for (int i = 0; i < n; i++) {
//		assert(scanf("%d%d", &x[i], &y[i]) == 2);
//	}
//	fclose(stdin);
//
//	build_called = false;
//	const int possible = construct_roads(x, y);
//
//	check(possible == 0 || possible == 1, "Invalid return value of construct_roads()");
//	if (possible == 1) {
//		check(build_called, "construct_roads() returned 1 without calling build()");
//	} else {
//		check(!build_called, "construct_roads() called build() but returned 0");
//	}
//
//	printf("%d\n", possible);
//	if (possible == 1) {
//		printf("%d\n", m);
//		for (int j = 0; j < m; j++) {
//			printf("%d %d %d %d\n", _u[j], _v[j], _a[j], _b[j]);
//		}
//	}
//	fclose(stdout);
//	return 0;
//}

Compilation message

parks.cpp: In lambda function:
parks.cpp:64:15: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
   64 |         if (x + y & 2) ans.push_back({i, j, x - 1, y - 1});
      |             ~~^~~
parks.cpp: In lambda function:
parks.cpp:70:15: warning: suggest parentheses around '+' in operand of '&' [-Wparentheses]
   70 |         if (x + y & 2) ans.push_back({i, j, x - 1, y + 1});
      |             ~~^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 1 ms 212 KB Pair u[0]=1 @(2, 6) and v[0]=0 @(2, 2) does not form a valid edge (distance != 2)
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 1 ms 212 KB Pair u[0]=1 @(2, 6) and v[0]=0 @(2, 2) does not form a valid edge (distance != 2)
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 1 ms 212 KB Pair u[0]=1 @(2, 6) and v[0]=0 @(2, 2) does not form a valid edge (distance != 2)
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 1 ms 212 KB Pair u[0]=1 @(2, 6) and v[0]=0 @(2, 2) does not form a valid edge (distance != 2)
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 1 ms 212 KB Pair u[0]=1 @(2, 6) and v[0]=0 @(2, 2) does not form a valid edge (distance != 2)
4 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 1 ms 212 KB Output is correct
2 Correct 1 ms 212 KB Output is correct
3 Incorrect 1 ms 212 KB Pair u[0]=1 @(2, 6) and v[0]=0 @(2, 2) does not form a valid edge (distance != 2)
4 Halted 0 ms 0 KB -