답안 #789983

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
789983 2023-07-22T08:39:51 Z peteza 낙하산 고리들 (IOI12_rings) C++14
52 / 100
4000 ms 73172 KB
#include <bits/stdc++.h>
using namespace std;

int N;
int cluster = 0;

int h[1000005];
int par[1000005];
bool vis[1000005];
bool inited = 0;
int cans = 0;
int deg[1000005], cmx;
vector<int> adj[1000005];

struct dat {
    int ign = -1;
    int deg[1000005] = {}, par[1000005];
    bool cool = 1;
    int fpar(int x) {
        return x == par[x] ? x : par[x] = fpar(par[x]);
    }
    dat (int x) {
        ign = x; cool = 1;
        for(int i=0;i<N;i++) par[i] = i;
        for(int i=0;i<N;i++) {
            if(i == ign) continue;
            for(int e:adj[i]) {
                if(e != ign) {
                    deg[i]++;
                    int I = fpar(i), E = fpar(e);
                    if(i < e && I == E) cool = 0;
                    par[I] = E;
                };
            }
            if(deg[i] >= 3) {
                cool = 0;
                return ;
            }
        }
    }
    void upd(int a, int b) {
        if(a == ign || b == ign) return;
        deg[a]++; deg[b]++;
        if(deg[a] >= 3 || deg[b] >= 3) cool = 0;
        if(fpar(a) == fpar(b)) cool = 0;
        par[fpar(a)] = fpar(b);
    }
};

vector<dat> elig;

int mg(int x, int y) {
  if(h[x] < h[y]) return par[x] = y;
  if(h[x] == h[y]) h[x]++;
  return par[y] = x;
}

int fpar(int x) {
  return x == par[x] ? x : fpar(par[x]);
}

void Init(int N_) {
    cmx = 0;
  N = N_; cluster = inited = cans = 0;
  elig.clear();
  for(int i=0;i<=N;i++) adj[i].clear();
  for(int i=0;i<=N;i++) deg[i] = 0, h[i] = 0, par[i] = i;
}

void dfs(int a) {
    if(vis[a]) return ;
    vis[a] = 1;
    cans++;
    for(int e:adj[a]) dfs(e);
}

void Link(int A, int B) {
  if(cluster >= 2) return;
  adj[A].push_back(B); adj[B].push_back(A);
  ++deg[A]; ++deg[B];
  cmx = max(cmx, deg[A]);
  cmx = max(cmx, deg[B]);
  if(cmx >= 3) {
    //initialize
    if(!inited) {
        cans = 0;
        inited = 1;
        int todo = A;
        if(deg[B] == 3) todo = B;
        for(auto E:adj[todo])
            elig.emplace_back(dat(E));
        elig.emplace_back(dat(todo));
        for(auto &e:elig) cans += e.cool;
    } else {
        cans = 0;
        for(auto it = elig.begin(); it != elig.end(); it++) {
            auto &e = *it;
            if(!e.cool) continue;
            e.upd(A, B);
            if(!e.cool) continue;
            cans++;
        }
    }
    return;
  }

  int pA = fpar(A), pB = fpar(B);
  if(pA == pB) {
    cluster++;
    memset(vis, 0, sizeof vis);
    dfs(A);
  } else {
    int res = mg(pA, pB); 
  }
}

int CountCritical() {
  if(cluster >= 2) 
    return 0;
  if(inited) return cans;
  if(!cluster)
    return N;
  //cluster count is equal to 1
  return cans;
}

/*
7 13
-1
1 2
-1
0 5
-1
2 0
-1
3 2
-1
3 5
-1
4 3
-1
*/

Compilation message

rings.cpp: In function 'void Init(int)':
rings.cpp:64:35: warning: suggest parentheses around assignment used as truth value [-Wparentheses]
   64 |   N = N_; cluster = inited = cans = 0;
      |                              ~~~~~^~~
rings.cpp: In function 'void Link(int, int)':
rings.cpp:113:9: warning: unused variable 'res' [-Wunused-variable]
  113 |     int res = mg(pA, pB);
      |         ^~~
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 31524 KB Output is correct
2 Correct 167 ms 70872 KB Output is correct
3 Correct 195 ms 70860 KB Output is correct
4 Correct 46 ms 32588 KB Output is correct
5 Correct 110 ms 32716 KB Output is correct
6 Correct 177 ms 32896 KB Output is correct
7 Correct 51 ms 70856 KB Output is correct
8 Correct 137 ms 32708 KB Output is correct
9 Correct 193 ms 70988 KB Output is correct
10 Correct 196 ms 70896 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 4049 ms 41736 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 31524 KB Output is correct
2 Correct 167 ms 70872 KB Output is correct
3 Correct 195 ms 70860 KB Output is correct
4 Correct 46 ms 32588 KB Output is correct
5 Correct 110 ms 32716 KB Output is correct
6 Correct 177 ms 32896 KB Output is correct
7 Correct 51 ms 70856 KB Output is correct
8 Correct 137 ms 32708 KB Output is correct
9 Correct 193 ms 70988 KB Output is correct
10 Correct 196 ms 70896 KB Output is correct
11 Correct 175 ms 70936 KB Output is correct
12 Correct 351 ms 72136 KB Output is correct
13 Correct 367 ms 71108 KB Output is correct
14 Correct 253 ms 70976 KB Output is correct
15 Correct 242 ms 71116 KB Output is correct
16 Correct 316 ms 33052 KB Output is correct
17 Correct 331 ms 71956 KB Output is correct
18 Correct 354 ms 71196 KB Output is correct
19 Correct 341 ms 33120 KB Output is correct
20 Correct 367 ms 71180 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 31524 KB Output is correct
2 Correct 167 ms 70872 KB Output is correct
3 Correct 195 ms 70860 KB Output is correct
4 Correct 46 ms 32588 KB Output is correct
5 Correct 110 ms 32716 KB Output is correct
6 Correct 177 ms 32896 KB Output is correct
7 Correct 51 ms 70856 KB Output is correct
8 Correct 137 ms 32708 KB Output is correct
9 Correct 193 ms 70988 KB Output is correct
10 Correct 196 ms 70896 KB Output is correct
11 Correct 175 ms 70936 KB Output is correct
12 Correct 351 ms 72136 KB Output is correct
13 Correct 367 ms 71108 KB Output is correct
14 Correct 253 ms 70976 KB Output is correct
15 Correct 242 ms 71116 KB Output is correct
16 Correct 316 ms 33052 KB Output is correct
17 Correct 331 ms 71956 KB Output is correct
18 Correct 354 ms 71196 KB Output is correct
19 Correct 341 ms 33120 KB Output is correct
20 Correct 367 ms 71180 KB Output is correct
21 Correct 881 ms 33548 KB Output is correct
22 Correct 1359 ms 34736 KB Output is correct
23 Correct 1758 ms 35600 KB Output is correct
24 Correct 1896 ms 72132 KB Output is correct
25 Correct 296 ms 72132 KB Output is correct
26 Correct 2193 ms 72200 KB Output is correct
27 Correct 2794 ms 36968 KB Output is correct
28 Correct 2950 ms 73172 KB Output is correct
29 Correct 1064 ms 72388 KB Output is correct
30 Correct 3241 ms 38456 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 31524 KB Output is correct
2 Correct 167 ms 70872 KB Output is correct
3 Correct 195 ms 70860 KB Output is correct
4 Correct 46 ms 32588 KB Output is correct
5 Correct 110 ms 32716 KB Output is correct
6 Correct 177 ms 32896 KB Output is correct
7 Correct 51 ms 70856 KB Output is correct
8 Correct 137 ms 32708 KB Output is correct
9 Correct 193 ms 70988 KB Output is correct
10 Correct 196 ms 70896 KB Output is correct
11 Execution timed out 4049 ms 41736 KB Time limit exceeded
12 Halted 0 ms 0 KB -