QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#106647#2341. Dead-End DetectoridontreallyknowAC ✓620ms79432kbC++173.9kb2023-05-18 14:57:232023-05-18 14:57:24

Judging History

你现在查看的是最新测评结果

  • [2023-08-10 23:21:45]
  • System Update: QOJ starts to keep a history of the judgings of all the submissions.
  • [2023-05-18 14:57:24]
  • 评测
  • 测评结果:AC
  • 用时:620ms
  • 内存:79432kb
  • [2023-05-18 14:57:23]
  • 提交

answer

#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
using ll = long long;
using pii = pair<int,int>;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
template<typename T> T uid(T x, T y) {return uniform_int_distribution<T>(x,y)(rng);}
template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;
template<typename T> ostream& operator<<(ostream& os, const vector<T>& v) {os << "["; for (int i = 0; i < v.size(); i++) {if (i) os << ", "; os << v[i];} return os << "]";};
template<typename... Ts> ostream& operator<<(ostream& os, const pair<Ts...>& x) {return os << "(" <<x.first << ", " << x.second << ")";};
template<typename T> void pv(T a, T b, string s = "") {cerr << "["; for (T i = a; i != b; ++i) {if (i != a) cerr << ", "; cerr << *i;} cerr << "] " << s << "\n";}
template<typename T> void pv(const T& t, string s = "") {pv(begin(t), end(t), s);}
template<typename... T> void dbg(T... t) {initializer_list<int>{(cerr << t << " ", 0)...}; cerr << "\n";}
template<typename T, typename U> void chmin(T& t, U u) {if (t > u) t = u;}
template<typename T, typename U> void chmax(T& t, U u) {if (t < u) t = u;}
#define bug(x...) cerr << "[" << #x << "] = ", dbg(x)
#define fi first
#define se second
#define SZ(x) ((int)((x).size()))
const int mx = 5e5+5;
vector<int> adj[mx], cyc;
vector<int> allvis;
vector<pii> ans;
int vis[mx];
bool tr = true;
void dfs(int v, int p) {
    vis[v] = 1;
    allvis.push_back(v);
    for (int a : adj[v]) {
        if (a == p) continue;
        if (vis[a]) {
            tr = false;
            if (SZ(cyc) == 0) {
                cyc.push_back(v);
            }
        }
        else {
            dfs(a,v);
        }
    }
}
void dfs1(int v, int p) {
    int ct = 0;
    for (int a : adj[v]) {
        if (a == p) continue;
        dfs1(a,v);
        ct++;
    }
    if (ct == 0 && p != 0) ans.emplace_back(v,p);
}
int dep[mx], oncyc[mx], vis1[mx];
void dfs2(int v, int p) {
    vis1[v] = 1;
    for (int a : adj[v]) {
        if (a == p) continue;
        if (vis1[a]) {
            oncyc[v] = 1;
            continue;
        }
        dep[a] = dep[v]+1;
        dfs2(a,v);
        oncyc[v] |= oncyc[a];
    }
}
void dfs3(int v, int p) {
    for (int a : adj[v]) {
        if (dep[a] == dep[v]+1) {
            dfs3(a,v);
        }
    }
    if (p != 0 && !oncyc[v] && oncyc[p]) {
        ans.emplace_back(p,v);
    }
}
void solve(istream& cin = std::cin, ostream& cout = std::cout) {
    int n,m;
    cin >> n >> m;
    for (int i = 0; i < m; i++) {
        int a,b;
        cin >> a >> b;
        adj[a].push_back(b);
        adj[b].push_back(a);
    }
    for (int i = 1; i <= n; i++) {
        if (!vis[i]) {
            tr = true;
            cyc.clear();
            allvis.clear();
            // check if tree
            dfs(i,0);
            if (tr) {
                // if it is, just mark the leaves
                if (SZ(allvis) == 2) {
                    ans.emplace_back(allvis[0],allvis[1]);
                    ans.emplace_back(allvis[1],allvis[0]);
                    continue;
                }
                int rt = i;
                for (int v : allvis) {
                    if (SZ(adj[v]) > 1) rt = v;
                }
                dfs1(rt,0);
            } else {
                assert(SZ(cyc) == 1);
                int rt = cyc[0];
                dfs2(rt,0);
                dfs3(rt,0);
            }
        }
    }
    sort(ans.begin(),ans.end());
    cout << SZ(ans) << '\n';
    for (auto [a,b] : ans) cout << a << ' ' << b << '\n';
}
signed main() {
    ios::sync_with_stdio(0); cin.tie(0);
    int t = 1;
//    cin >> t;
    for (int q = 1; q <= t; q++) {
        solve();
    }
    return 0;
}


Details

Test #1:

score: 100
Accepted
time: 7ms
memory: 17792kb

Test #2:

score: 0
Accepted
time: 1ms
memory: 18400kb

Test #3:

score: 0
Accepted
time: 431ms
memory: 79308kb

Test #4:

score: 0
Accepted
time: 7ms
memory: 17224kb

Test #5:

score: 0
Accepted
time: 5ms
memory: 15588kb

Test #6:

score: 0
Accepted
time: 0ms
memory: 17260kb

Test #7:

score: 0
Accepted
time: 1ms
memory: 17156kb

Test #8:

score: 0
Accepted
time: 5ms
memory: 17032kb

Test #9:

score: 0
Accepted
time: 1ms
memory: 17196kb

Test #10:

score: 0
Accepted
time: 4ms
memory: 17248kb

Test #11:

score: 0
Accepted
time: 7ms
memory: 16808kb

Test #12:

score: 0
Accepted
time: 1ms
memory: 16756kb

Test #13:

score: 0
Accepted
time: 89ms
memory: 22748kb

Test #14:

score: 0
Accepted
time: 57ms
memory: 23508kb

Test #15:

score: 0
Accepted
time: 439ms
memory: 37364kb

Test #16:

score: 0
Accepted
time: 349ms
memory: 40720kb

Test #17:

score: 0
Accepted
time: 351ms
memory: 44604kb

Test #18:

score: 0
Accepted
time: 386ms
memory: 45756kb

Test #19:

score: 0
Accepted
time: 2ms
memory: 19248kb

Test #20:

score: 0
Accepted
time: 4ms
memory: 17772kb

Test #21:

score: 0
Accepted
time: 0ms
memory: 18076kb

Test #22:

score: 0
Accepted
time: 103ms
memory: 25644kb

Test #23:

score: 0
Accepted
time: 597ms
memory: 63840kb

Test #24:

score: 0
Accepted
time: 139ms
memory: 73488kb

Test #25:

score: 0
Accepted
time: 482ms
memory: 71664kb

Test #26:

score: 0
Accepted
time: 139ms
memory: 79428kb

Test #27:

score: 0
Accepted
time: 606ms
memory: 79432kb

Test #28:

score: 0
Accepted
time: 592ms
memory: 79396kb

Test #29:

score: 0
Accepted
time: 594ms
memory: 79400kb

Test #30:

score: 0
Accepted
time: 124ms
memory: 38012kb

Test #31:

score: 0
Accepted
time: 255ms
memory: 37888kb

Test #32:

score: 0
Accepted
time: 135ms
memory: 40924kb

Test #33:

score: 0
Accepted
time: 299ms
memory: 42404kb

Test #34:

score: 0
Accepted
time: 620ms
memory: 73412kb

Test #35:

score: 0
Accepted
time: 402ms
memory: 37820kb

Test #36:

score: 0
Accepted
time: 422ms
memory: 43728kb

Test #37:

score: 0
Accepted
time: 442ms
memory: 51192kb

Test #38:

score: 0
Accepted
time: 383ms
memory: 36004kb

Test #39:

score: 0
Accepted
time: 297ms
memory: 34628kb

Test #40:

score: 0
Accepted
time: 462ms
memory: 50496kb

Test #41:

score: 0
Accepted
time: 420ms
memory: 41068kb

Test #42:

score: 0
Accepted
time: 346ms
memory: 37716kb

Test #43:

score: 0
Accepted
time: 450ms
memory: 38352kb

Test #44:

score: 0
Accepted
time: 376ms
memory: 44908kb

Test #45:

score: 0
Accepted
time: 323ms
memory: 46548kb