답안 #821625

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
821625 2023-08-11T12:12:10 Z caganyanmaz 낙하산 고리들 (IOI12_rings) C++17
0 / 100
1880 ms 259360 KB
#include <bits/stdc++.h>
#define pb push_back
//#define DEBUGGING
using namespace std;




void __print(int i) { cerr << i; }
void __print(bool i) { cerr << (i ? "true" : "false"); }

template<typename T>
void __print(T& t) { cerr << "{"; int f = 0; for (auto& i : t) { cerr << (f++ ? ", " : ""); __print(i); } cerr << "}"; }

void _print() { cerr << "]\n"; }

template<typename T, typename... V>
void _print(T t, V... v) { __print(t); if (sizeof...(v)) cerr << ", "; _print(v...); }

#ifdef DEBUGGING
#define debug(x...) cerr <<"[" << (#x) << "] = ["; _print(x)
#else
#define debug(x...) 42
#endif

struct Node
{
        int head;
        int tail;
        int size;
        int nxt;
        Node(int i) : head(i), tail(i), size(1), nxt(-1) {}
        Node() : Node(-1) {}
};

constexpr static int MXN = 1e6;
int n;

set<int> p;
vector<int> g[MXN];
Node node[MXN];
bitset<MXN> in_loop;
vector<int> touching_loop;
int pred[MXN];


void merge(int a, int b);

void Init(int N_)
{
        n = N_;
        for (int i = 0; i < n; i++)
        {
                node[i] = Node(i);
                p.insert(i);
        }
        for (int i = 0; i < n; i++)
        {
                pred[i] = -1;
        }


}

void check(int node)
{
        if (g[node].size() <= 2 || g[node].size() >= 5)
                return;
        set<int> p_new;
        if (g[node].size() == 3)
                for (int i : p)
                        if (i == node || find(g[node].begin(), g[node].end(), i) != g[node].end())
                                p_new.insert(i);
        if (g[node].size() == 4)
                for (int i : p)
                        if (i == node)
                                p_new.insert(i);
        p = p_new;

}

set<int> current_a;
int visited[MXN];
bool visited_loop = false;
int counter = 0;
int lll = 1;

bool dfs(int node, int target)
{
        if (in_loop[node] || (node == target && !visited_loop))
        {
                current_a.insert(node);
                in_loop[node] = true;
                return true;
        }
        if (node == target)
        {
                in_loop[node] = true;
                return true;
        }
        bool valid = false;
        visited[node] = lll;
        for (int c : g[node])
        {
                if (visited[c] != lll && dfs(c, target))
                {
                        debug(node, c);
                        valid = true;
                }
        }
        if (valid && !visited_loop)
                current_a.insert(node);
        if (valid)
                in_loop[node] = true;
        return valid;
}

void assign_pred(int node, int pp)
{
        pred[node] = pp;
        visited[node] = lll;
        for (int c : g[node])
                if (visited[node] != lll)
                        assign_pred(c, node);

}

void check(int a, int b)
{
        current_a.clear();
        if (!visited_loop)
        {
                dfs(a, b);
                lll++;
                assign_pred(a, -1); // Create predecessors
        }
        else if (in_loop[a] && in_loop[b])
        {
                current_a.insert(a);
                current_a.insert(b);
        }
        else if(!in_loop[a] && !in_loop[b])
        {
                int i = a;
                for (; i != -1 || i != b || !in_loop[i]; i = pred[i])
                        in_loop[i] = true;
                if (i == b)
                {
                        p.clear();
                        return;
                }
                if (i != -1)
                        current_a.insert(i);
                int j = b;
                for (; j != -1 || j != a || !in_loop[j]; j = pred[j])
                        in_loop[j] = true;
                if (j == a)
                {
                        p.clear();
                        return;
                }
                if (j != -1)
                        current_a.insert(j);
                // Finding two endpoints (they might the be same)
        }
        else
        {
                if (in_loop[b]) swap(a, b);
                for (; !in_loop[b]; b = pred[b])
                {
                        assert(b != -1); // It shouldn't happen since there is a loop in b's component
                        in_loop[b] = true;
                }
                current_a.insert(b);
        }
        for (auto it = current_a.begin(); it != current_a.end();)
                if (p.find(*it) == p.end())
                        it = current_a.erase(it);
                else
                        it++;
        p = current_a;
        visited_loop = true;

}

void Link(int a, int b)
{
        if (p.empty())
                return;
        debug(a, b);
        g[a].pb(b);
        g[b].pb(a);
        check(a);
        check(b);
        if (node[a].head == node[b].head)
                check(a, b);
        else
        {
                merge(node[a].head, node[b].head);
                auto ddfs = [&] (int node, int pp) -> void
                {
                        pred[node] = pp;
                        for (int c : g[node])
                                if (pred[c] == -1 && !in_loop[c])
                                        dfs(c, node);
                };
                if (in_loop[a] || pred[a] != -1)
                        ddfs(b, a);
                if (in_loop[b] || pred[b] != -1)
                        ddfs(a, b);
        }
}

int CountCritical()
{
        debug(p);
        return p.size();

}

void merge(int a, int b)
{
        if (node[a].size < node[b].size) swap(a, b);
        node[a].size += node[b].size;
        node[node[a].tail].nxt = b;
        node[a].tail = node[b].tail;
        for (;b != -1; b = node[b].nxt)
                node[b].head = a;
}

Compilation message

rings.cpp: In function 'bool dfs(int, int)':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:107:25: note: in expansion of macro 'debug'
  107 |                         debug(node, c);
      |                         ^~~~~
rings.cpp: In function 'void Link(int, int)':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:190:9: note: in expansion of macro 'debug'
  190 |         debug(a, b);
      |         ^~~~~
rings.cpp: In function 'int CountCritical()':
rings.cpp:23:21: warning: statement has no effect [-Wunused-value]
   23 | #define debug(x...) 42
      |                     ^~
rings.cpp:216:9: note: in expansion of macro 'debug'
  216 |         debug(p);
      |         ^~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 39380 KB Output is correct
2 Correct 20 ms 39768 KB Output is correct
3 Correct 20 ms 39752 KB Output is correct
4 Correct 19 ms 39456 KB Output is correct
5 Correct 21 ms 39996 KB Output is correct
6 Correct 22 ms 40308 KB Output is correct
7 Correct 19 ms 39724 KB Output is correct
8 Runtime error 49 ms 80588 KB Execution killed with signal 11
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 351 ms 82232 KB Output is correct
2 Correct 979 ms 94200 KB Output is correct
3 Correct 383 ms 96776 KB Output is correct
4 Correct 1253 ms 135220 KB Output is correct
5 Correct 1316 ms 141516 KB Output is correct
6 Correct 1880 ms 198128 KB Output is correct
7 Correct 371 ms 103052 KB Output is correct
8 Correct 1133 ms 125996 KB Output is correct
9 Correct 1279 ms 134116 KB Output is correct
10 Runtime error 808 ms 259360 KB Execution killed with signal 11
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 39380 KB Output is correct
2 Correct 20 ms 39768 KB Output is correct
3 Correct 20 ms 39752 KB Output is correct
4 Correct 19 ms 39456 KB Output is correct
5 Correct 21 ms 39996 KB Output is correct
6 Correct 22 ms 40308 KB Output is correct
7 Correct 19 ms 39724 KB Output is correct
8 Runtime error 49 ms 80588 KB Execution killed with signal 11
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 39380 KB Output is correct
2 Correct 20 ms 39768 KB Output is correct
3 Correct 20 ms 39752 KB Output is correct
4 Correct 19 ms 39456 KB Output is correct
5 Correct 21 ms 39996 KB Output is correct
6 Correct 22 ms 40308 KB Output is correct
7 Correct 19 ms 39724 KB Output is correct
8 Runtime error 49 ms 80588 KB Execution killed with signal 11
9 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 19 ms 39380 KB Output is correct
2 Correct 20 ms 39768 KB Output is correct
3 Correct 20 ms 39752 KB Output is correct
4 Correct 19 ms 39456 KB Output is correct
5 Correct 21 ms 39996 KB Output is correct
6 Correct 22 ms 40308 KB Output is correct
7 Correct 19 ms 39724 KB Output is correct
8 Runtime error 49 ms 80588 KB Execution killed with signal 11
9 Halted 0 ms 0 KB -