Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <unordered_map>
- #include <vector>
- #include <set>
- #include <deque>
- using namespace std;
- #define SET_SIZE R - L + 1
- #define FOR(i, beg, end) for (i = beg; i < end; ++i)
- #define READ_VECT(vect, N) do {vect.resize(N); int iv = 0; FOR(iv, 0, N) {cin >> vect[iv];}} while(0)
- #define READ_BEG1(T) do {cin >> T;} while(0);
- #define READ_BEG2(T, K) do {cin >> T >> K;} while(0);
- #define READ_BEG3(T, K, M) do {cin >> T >> K >> M;} while(0);
- #define PRNTLN() do {cout << "\n";} while(0);
- typedef pair<int, int> int_pair;
- using ll = long long;
- using long_boi = ll;
- int N, D;
- vector<int_pair> points;
- vector<vector<bool>> other_set;
- vector<set<int>> s(2);
- bool sol() {
- vector<bool> visited(N);
- vector<deque<int>> dfs(2);
- bool set_nr = 0;
- int i;
- FOR (i, 0, N) {
- if (visited[i]) {
- continue;
- }
- set_nr = s[0].size() <= s[1].size() ? false : true;
- s[set_nr].insert(i);
- visited[i] = true;
- dfs[set_nr].push_back(i);
- while (!dfs[0].empty() || !dfs[1].empty()) {
- while (!dfs[set_nr].empty()) {
- auto curr = dfs[set_nr].front();
- dfs[set_nr].pop_front();
- int j;
- FOR(j, 0, N) {
- if (other_set[curr][j]) {
- if (s[set_nr].find(j) != s[set_nr].end()) {
- return false;
- } else if (visited[j]) {
- continue;
- }
- dfs[!set_nr].push_back(j);
- s[!set_nr].insert(j);
- visited[j] = true;
- }
- }
- }
- set_nr = !set_nr;
- }
- }
- return (s[0].size() != 0 && s[1].size() != 0);
- }
- ll dist_sq (int_pair p1, int_pair p2) {
- ll diff1 = (ll) p1.first - (ll) p2.first;
- ll diff2 = (ll) p1.second - (ll) p2.second;
- return diff1 * diff1 + diff2 * diff2;
- }
- void print_set(set<int> secik) {
- cout << secik.size() << " ";
- for (auto &i: secik) {
- cout << i + 1 << " ";
- }
- }
- int main() {
- cin >> N >> D;
- other_set.resize(N);
- int i, j;
- FOR(i, 0, N) {
- int x, y;
- cin >> x >> y;
- points.emplace_back(x, y);
- other_set[i].resize(N);
- }
- FOR(i, 0, N) {
- FOR(j, 0, N) {
- ll ds = dist_sq(points[i], points[j]);
- if (ds > (ll) D * (ll) D) {
- other_set[i][j] = true;
- }
- }
- }
- if (!sol()) {
- cout << "NIE";
- }
- else {
- cout << "TAK" << "\n";
- print_set(s[0]);
- cout << "\n";
- print_set(s[1]);
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement