제출 #983560

#제출 시각아이디문제언어결과실행 시간메모리
983560Alkaser_ID게임 (APIO22_game)C++17
12 / 100
38 ms98280 KiB
#include "game.h"
using namespace std;
#include <bits/stdc++.h>
const int sz = 1e6 + 5;

int res = 0,K=0;
set<int> scc[sz], rv[sz];
int c[sz]; bool b[sz];
void init(int n, int k) {
    K = k;
    for(int i=0;i<k;++i){
        b[i] = true;
        c[i] = i;
        if(i < k-1) {
            scc[i].insert(i+1);
        }
    }
    for(int i=k;i<n;++i) c[i] = i;
}

bool vis[sz]; set<int> s; int sp = 0; bool cl = false;
vector<int> cv;
inline void dfs(int i,int rt);
inline void cycle() {
    int C = *s.begin();
    set<int>::iterator it = s.begin();
    for(++it;it!=s.end();++it){
        for(set<int>::iterator j = scc[*it].begin();j != scc[*it].end();++j){
            if(*j != C){
                scc[C].insert(*j);
                rv[*j].insert(C);
            }
        }
        c[*it] = C;
        for(set<int>::iterator jt = rv[*it].begin();jt != rv[*it].end();++jt){
            scc[*jt].erase(*it);
            scc[*jt].insert(C);
        }
        scc[*it].clear();
    }
    b[C] = (sp > 0);
    if(b[C]) res = 1;
    if(scc[C].find(C) != scc[C].end()) scc[C].erase(C);
    //dfs(C,C);
}

inline void prn(int i){
    cout << i << "    ";
    for(set<int>::iterator it = scc[i].begin();it!=scc[i].end();++it){
        cout << *it << ' ';
    }
    cout << endl;
}
int add_teleporter(int u, int v) {
    if(u == v) res = 1;
    if(c[u] == c[v] || res == 1) return res;
    scc[c[u]].insert(c[v]);
    rv[c[v]].insert(c[u]);
    dfs(c[u],c[u]);
    for(int j=0;j<cv.size();++j) {
        vis[cv[j]] = false;
    }
    cv.clear();
    if(cl){
        cl = false;
        dfs(c[u],c[u]);
        for(int j=0;j<cv.size();++j) {
            vis[cv[j]] = false;
        }
        cv.clear();
    }
    return res;
}
inline void dfs(int i, int rt){
    s.insert(i); if(i <K) ++sp;
    vis[i] = true;
    cv.push_back(i);
    for(set<int>::iterator j=scc[i].begin();j!=scc[i].end();++j){
        if(s.find(*j) != s.end()) {
            cycle(); s.clear();
            cl = true;
            return;
        }
        if(s.empty()) return;
        if(!vis[*j]) dfs(*j,rt);
    }
    if(s.empty()) return;
    s.erase(i); if(i < K) --sp;
}
/*
6 5 3
3 4
5 0
4 5
5 3
1 4

4 1 2
1 1

4 3 2
1 3
2 0
3 2


7 10 1
0 2
2 3
4 0
1 6
5 6
6 5
6 1
0 3
3 2
3 4


*/

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

game.cpp: In function 'int add_teleporter(int, int)':
game.cpp:60:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |     for(int j=0;j<cv.size();++j) {
      |                 ~^~~~~~~~~~
game.cpp:67:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |         for(int j=0;j<cv.size();++j) {
      |                     ~^~~~~~~~~~
#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...