QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#597352 | #9420. Find Yourself | ucup-team087# | WA | 0ms | 3696kb | C++14 | 6.6kb | 2024-09-28 17:38:21 | 2024-09-28 17:38:27 |
Judging History
answer
#include <cassert>
#include <cmath>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <unordered_map>
#include <unordered_set>
#include <utility>
#include <vector>
using namespace std;
using Int = long long;
template <class T1, class T2> ostream &operator<<(ostream &os, const pair<T1, T2> &a) { return os << "(" << a.first << ", " << a.second << ")"; };
template <class T> ostream &operator<<(ostream &os, const vector<T> &as) { const int sz = as.size(); os << "["; for (int i = 0; i < sz; ++i) { if (i >= 256) { os << ", ..."; break; } if (i > 0) { os << ", "; } os << as[i]; } return os << "]"; }
template <class T> void pv(T a, T b) { for (T i = a; i != b; ++i) cerr << *i << " "; cerr << endl; }
template <class T> bool chmin(T &t, const T &f) { if (t > f) { t = f; return true; } return false; }
template <class T> bool chmax(T &t, const T &f) { if (t < f) { t = f; return true; } return false; }
#define COLOR(s) ("\x1b[" s "m")
// gg: bipartite graph between {vertex} and {biconnected component}
// (|gg| - n) biconnected components
// isolated point: not regarded as biconnected component (==> isolated in gg)
// f: DFS out-forest
// ess: edges in biconnected component
// (u, v) with dis[u] <= dis[v]
// self-loop at isolated point: not included in ess
struct Biconnected {
int n, m;
vector<vector<int>> g, f, gg;
vector<vector<pair<int, int>>> ess;
vector<int> par, rs;
int zeit;
vector<int> dis, fin, low;
Biconnected() {}
explicit Biconnected(int n_) : n(n_), m(0), g(n_) {}
void ae(int u, int v) {
++m;
assert(0 <= u); assert(u < n);
assert(0 <= v); assert(v < n);
g[u].push_back(v);
if (u != v) g[v].push_back(u);
}
int stackVLen, stackELen;
vector<int> stackV;
vector<pair<int, int>> stackE;
vector<int> cntPar;
void dfs(int u) {
stackV[stackVLen++] = u;
dis[u] = low[u] = zeit++;
for (const int v : g[u]) {
if (par[u] == v && !cntPar[u]++) continue;
if (~dis[v]) {
if (dis[u] >= dis[v]) stackE[stackELen++] = std::make_pair(v, u);
if (low[u] > dis[v]) low[u] = dis[v];
} else {
f[u].push_back(v);
par[v] = u;
rs[v] = rs[u];
const int stackEPos = stackELen;
stackE[stackELen++] = std::make_pair(u, v);
dfs(v);
if (low[u] > low[v]) low[u] = low[v];
if (dis[u] <= low[v]) {
const int x = gg.size();
gg.emplace_back();
ess.emplace_back();
for (; ; ) {
const int w = stackV[--stackVLen];
gg[w].push_back(x);
gg[x].push_back(w);
if (w == v) break;
}
gg[u].push_back(x);
gg[x].push_back(u);
for (; stackELen > stackEPos; ) ess[x].push_back(stackE[--stackELen]);
}
}
}
fin[u] = zeit;
}
void build() {
f.assign(n, {});
gg.assign(n, {});
ess.assign(n, {});
par.assign(n, -1);
rs.assign(n, -1);
zeit = 0;
dis.assign(n, -1);
fin.assign(n, -1);
low.assign(n, -1);
stackV.resize(n);
stackE.resize(m);
cntPar.assign(n, 0);
for (int u = 0; u < n; ++u) if (!~dis[u]) {
stackVLen = stackELen = 0;
rs[u] = u;
dfs(u);
}
}
// Returns true iff u is an articulation point
// <=> # of connected components increases when u is removed.
inline bool isArt(int u) const {
return (gg[u].size() >= 2);
}
// Returns w s.t. w is a child of u and a descendant of v in the DFS forest.
// Returns -1 instead if v is not a proper descendant of u
// O(log(deg(u))) time
int dive(int u, int v) const {
if (dis[u] < dis[v] && dis[v] < fin[u]) {
int j0 = 0, j1 = f[u].size();
for (; j0 + 1 < j1; ) {
const int j = (j0 + j1) / 2;
((dis[f[u][j]] <= dis[v]) ? j0 : j1) = j;
}
return f[u][j0];
} else {
return -1;
}
}
// Returns true iff there exists a v-w path when u is removed.
// O(log(deg(u))) time
bool isStillReachable(int u, int v, int w) const {
assert(0 <= u); assert(u < n);
assert(0 <= v); assert(v < n);
assert(0 <= w); assert(w < n);
assert(u != v);
assert(u != w);
if (rs[v] != rs[w]) return false;
if (rs[u] != rs[v]) return true;
const int vv = dive(u, v);
const int ww = dive(u, w);
if (~vv) {
if (~ww) {
return (vv == ww || (dis[u] > low[vv] && dis[u] > low[ww]));
} else {
return (dis[u] > low[vv]);
}
} else {
if (~ww) {
return (dis[u] > low[ww]);
} else {
return true;
}
}
}
};
////////////////////////////////////////////////////////////////////////////////
vector<int> uf;
int root(int u) {
return (uf[u] < 0) ? u : (uf[u] = root(uf[u]));
}
bool connect(int u, int v) {
u = root(u);
v = root(v);
if (u == v) return false;
if (uf[u] > uf[v]) swap(u, v);
uf[u] += uf[v];
uf[v] = u;
return true;
}
int N, M;
vector<int> A, B;
bool solve() {
Biconnected bic(N);
for (int i = 0; i < M; ++i) {
bic.ae(A[i], B[i]);
}
bic.build();
uf.assign(N << 1, -1);
for (int x = N; x < (int)bic.gg.size(); ++x) {
const auto &us = bic.gg[x];
const auto &es = bic.ess[x];
if (us.size() == 1) {
continue;
}
for (const int u : us) {
uf[u << 1] = -1;
uf[u << 1 | 1] = -1;
}
for (const auto &e : es) {
const int u = e.first;
const int v = e.second;
connect(u << 1, v << 1 | 1);
connect(v << 1, u << 1 | 1);
}
int sz[2] = {};
for (const int u : us) {
++sz[(root(us[0] << 1) != root(u << 1)) ? 1 : 0];
}
if (!(sz[0] == 2 || sz[1] == 2)) {
return false;
}
if ((int)es.size() != sz[0] * sz[1]) {
return false;
}
}
return true;
}
int main() {
for (int numCases; ~scanf("%d", &numCases); ) { for (int caseId = 1; caseId <= numCases; ++caseId) {
scanf("%d%d", &N, &M);
A.resize(M);
B.resize(M);
for (int i = 0; i < M; ++i) {
scanf("%d%d", &A[i], &B[i]);
--A[i];
--B[i];
}
const bool ans = solve();
puts(ans ? "YES" : "NO");
}
#ifndef LOCAL
break;
#endif
}
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3692kb
input:
3 3 3 1 2 2 3 3 1 4 4 1 2 2 3 3 4 4 1 6 6 1 2 2 3 3 4 4 5 5 6 6 1
output:
NO YES NO
result:
ok 3 token(s): yes count is 1, no count is 2
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 3696kb
input:
10 8 8 1 2 2 3 3 4 4 1 1 5 5 6 2 7 7 8 8 8 1 2 2 3 3 4 4 1 1 5 2 6 3 7 4 8 9 9 1 2 2 3 3 4 4 1 1 5 5 6 3 7 7 8 2 9 7 8 1 3 1 4 1 5 2 3 2 4 2 5 3 6 4 7 8 8 1 2 2 3 3 4 4 1 1 5 5 6 3 7 7 8 8 8 1 2 2 3 3 4 4 1 1 5 5 6 2 7 3 8 8 8 1 2 2 3 3 4 4 5 5 6 6 7 7 8 8 1 9 10 1 3 1 4 1 5 2 3 2 4 2 5 1 6 2 7 3 8 ...
output:
NO NO NO NO NO NO NO NO YES YES
result:
wrong answer expected YES, found NO [5th token]