QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#233990 | #7640. Colorful Cycles | hos_lyric | WA | 384ms | 3596kb | C++14 | 6.5kb | 2023-11-01 12:18:49 | 2023-11-01 12:18:49 |
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
// self-loop for 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;
}
}
}
};
////////////////////////////////////////////////////////////////////////////////
int N, M;
vector<int> A, B, C;
bool solve() {
Biconnected b(N);
for (int i = 0; i < M; ++i) {
b.ae(A[i], B[i]);
}
b.build();
// cerr<<"g = "<<b.g<<", gg = "<<b.gg<<", ess = "<<b.ess<<endl;
map<pair<int, int>, int> cs;
for (int i = 0; i < M; ++i) {
if (b.dis[A[i]] > b.dis[B[i]]) swap(A[i], B[i]);
cs[make_pair(A[i], B[i])] = C[i];
}
int sum=0;
for(int x=N;x<(int)b.gg.size();++x)sum+=b.ess[x].size();
assert(sum==M);
vector<int> has(N);
vector<int>help(N,-1);
for (int x = N; x < (int)b.gg.size(); ++x) {
for (const int u : b.gg[x]) {
has[u] = 0;
help[u]=x;
}
for (const auto &e : b.ess[x]) {
auto it = cs.find(e);
assert(it != cs.end());
const int c = it->second;
has[e.first] |= 1 << c;
has[e.second] |= 1 << c;
assert(help[e.first]==x);
assert(help[e.second]==x);
}
int f = 0;
for (const int u : b.gg[x]) {
if (!(~has[u] & 6)) f |= 1;
if (!(~has[u] & 5)) f |= 2;
if (!(~has[u] & 3)) f |= 4;
}
if (f == 7) {
return true;
}
}
return false;
}
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);
C.resize(M);
for (int i = 0; i < M; ++i) {
scanf("%d%d%d", &A[i], &B[i], &C[i]);
--A[i];
--B[i];
--C[i];
}
const bool ans = solve();
puts(ans ? "Yes" : "No");
}
#ifndef LOCAL
break;
#endif
}
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3596kb
input:
2 3 3 1 2 3 2 3 1 1 3 2 5 6 1 2 1 2 3 1 1 3 2 3 4 3 3 5 3 4 5 3
output:
Yes No
result:
ok 2 token(s): yes count is 1, no count is 1
Test #2:
score: -100
Wrong Answer
time: 384ms
memory: 3504kb
input:
100000 7 10 7 2 2 6 4 2 6 1 2 7 1 3 3 4 1 6 7 1 2 6 3 3 1 2 5 3 1 2 1 1 7 10 5 7 3 7 1 1 4 6 3 6 3 1 3 4 3 4 2 2 3 2 3 1 3 3 3 7 1 1 4 2 7 10 5 6 3 3 5 2 7 2 3 7 3 3 1 2 2 4 3 2 7 4 2 6 1 2 2 6 1 7 5 2 7 10 7 1 3 7 5 3 6 4 1 7 6 1 1 4 1 3 4 2 2 7 2 1 3 1 3 5 3 5 1 3 7 10 6 7 2 3 4 3 1 4 2 5 3 2 7 4 ...
output:
Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes No Yes Yes Yes Yes Yes No Yes Yes Yes Yes Yes Yes Yes Yes Yes No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes No Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes Yes No Y...
result:
wrong answer expected YES, found NO [55th token]