QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#423808 | #2214. Link Cut Digraph | luanmenglei | WA | 204ms | 72504kb | C++17 | 2.5kb | 2024-05-28 17:07:36 | 2024-05-28 17:07:37 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
namespace SOL {
using i64 = long long;
void debug(const char *msg, ...) {
#ifdef CLESIP
va_list arg;
static char pbString[512];
va_start(arg,msg);
vsprintf(pbString,msg,arg);
cerr << "[DEBUG] " << pbString << "\n";
va_end(arg);
#endif
}
template<typename T, typename L>
bool chkmax(T &x, L y) { if (x < y) return x = y, true; return false; }
template<typename T, typename L>
bool chkmin(T &x, L y) { if (y < x) return x = y, true; return false; }
const int N = 3e5 + 10;
int n, m, dfn[N], low[N], scc[N], st[N], tp, cnt, tot, c[N], sze[N];
i64 ans;
bool in[N];
vector<int> G[N], s[N];
array<int, 2> edge[N];
void tarjan(int x) {
dfn[x] = low[x] = ++ cnt, in[x] = 1, st[++ tp] = x;
for (int y : G[x]) {
if (!dfn[y]) {
tarjan(y);
chkmin(low[x], low[y]);
} else if (in[y]) {
chkmin(low[x], dfn[y]);
}
}
if (low[x] == dfn[x]) {
int p = 0; ++ tot;
do {
p = st[tp --];
in[p] = 0, scc[p] = tot;
} while (p != x);
}
}
void solve(int l, int r, vector<array<int, 3>> e) {
if (l == r) {
for (auto [x, y, id] : e)
s[l].push_back(id);
return;
}
int mid = (l + r) >> 1;
for (auto [x, y, id] : e) {
dfn[x] = dfn[y] = 0;
G[x].clear(), G[y].clear();
}
tp = cnt = tot = 0;
for (auto [x, y, id] : e)
if (id <= mid)
G[x].push_back(y);
for (auto [x, y, id] : e) {
if (!dfn[x])
tarjan(x);
if (!dfn[y])
tarjan(y);
}
vector<array<int, 3>> nl, nr;
for (auto [x, y, id] : e) {
if (scc[x] == scc[y]) {
nl.push_back({ x, y, id });
} else {
nr.push_back({ scc[x], scc[y], id });
}
}
solve(l, mid, nl);
solve(mid + 1, r, nr);
}
int find(int x) { return c[x] == x ? x : c[x] = find(c[x]); }
void merge(int x, int y) {
x = find(x), y = find(y);
if (x == y)
return;
ans -= 1ll * sze[x] * (sze[x] - 1) / 2;
ans -= 1ll * sze[y] * (sze[y] - 1) / 2;
c[x] = y, sze[y] += sze[x];
ans += 1ll * sze[y] * (sze[y] - 1) / 2;
}
void __solve() {
cin >> n >> m;
vector<array<int, 3>> vec;
for (int i = 1, x, y; i <= m; i ++) {
cin >> x >> y;
edge[i] = { x, y };
vec.push_back({ x, y, i });
}
solve(1, m, vec);
for (int i = 1; i <= n; i ++)
c[i] = i, sze[i] = 1;
ans = 0;
for (int i = 1; i <= m; i ++) {
for (int id : s[i])
merge(edge[id][0], edge[id][1]);
cout << ans << "\n";
}
}
}
int main() {
ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
SOL::__solve();
return 0;
}
详细
Test #1:
score: 0
Wrong Answer
time: 204ms
memory: 72504kb