QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#331421 | #6127. Kawa Exam | Ender32k | WA | 0ms | 11948kb | C++17 | 3.6kb | 2024-02-18 08:40:38 | 2024-02-18 08:40:38 |
Judging History
answer
// Problem: P9886 [ICPC2018 Qingdao R] Kawa Exam
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P9886
// Memory Limit: 512 MB
// Time Limit: 3000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include <bits/stdc++.h>
#define eb emplace_back
#define pb pop_back
#define mt make_tuple
#define mp make_pair
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int, int> pi;
typedef tuple<int, int, int> tu;
bool Mbe;
const int N = 1e5 + 100;
pi e[N];
int n, m, mx, cur, res;
int a[N], c[N], ct[N], ans[N], tres[N];
int sz[N], son[N], rid[N], lp[N], rp[N];
int dfc, tot, tp, st[N], bel[N], dfn[N], low[N];
vector<int> b[N], bl;
vector<pi> g[N], t[N];
void tarjan(int u, int fa) {
bl.eb(u), dfn[u] = low[u] = ++dfc, st[++tp] = u;
for (auto [v, id] : g[u]) {
if (id == fa) continue;
if (dfn[v]) low[u] = min(low[u], dfn[v]);
else tarjan(v, id), low[u] = min(low[u], low[v]);
}
if (low[u] == dfn[u]) {
tot++;
while (st[tp] != u)
bel[st[tp]] = tot, b[tot].eb(st[tp]), tp--;
bel[u] = tot, b[tot].eb(u), tp--;
}
}
void add(int x) { ct[c[x]]--, c[x]++, ct[c[x]]++, cur = max(cur, c[x]); }
void del(int x) { ct[c[x]]--, c[x]--, ct[c[x]]++; while (cur && !ct[cur]) cur--; }
void upd(int x, int op) {
if (op == 1) add(x);
else del(x);
}
void dfs1(int u, int fa) {
rid[lp[u] = ++dfc] = u, sz[u] = b[u].size();
for (auto [v, id] : t[u]) {
if (v == fa) continue;
dfs1(v, u), sz[u] += sz[v];
if (sz[v] > sz[son[u]]) son[u] = v;
}
rp[u] = dfc;
}
void dfs2(int u, int fa, int fl, int op) {
for (auto [v, id] : t[u]) {
if (id == fa || v == son[u]) continue;
dfs2(v, id, 0, op);
}
if (son[u]) {
int sid = 0;
for (auto [v, id] : t[u])
if (v == son[u]) sid = id;
dfs2(son[u], sid, 1, op);
}
for (auto [v, id] : t[u]) {
if (id == fa || v == son[u]) continue;
for (int i = lp[v]; i <= rp[v]; i++)
for (int j : b[rid[i]]) upd(a[j], op);
}
for (int i : b[u]) upd(a[i], op);
ans[fa] += cur;
if (fl) return;
for (int i = lp[u]; i <= rp[u]; i++)
for (int j : b[rid[i]]) upd(a[j], op ^ 1);
}
void clr() {
for (int i = 0; i <= mx; i++) c[i] = 0;
for (int i = 1; i <= n; i++)
dfn[i] = ct[i] = 0, g[i].clear();
for (int i = 1; i <= tot; i++)
t[i].clear(), b[i].clear();
dfc = tot = tp = mx = cur = res = 0;
}
void solve() {
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i], mx = max(mx, a[i]);
for (int i = 1, u, v; i <= m; i++)
cin >> u >> v, e[i] = mp(u, v), g[u].eb(mp(v, i)), g[v].eb(mp(u, i));
for (int i = 1; i <= n; i++) {
if (dfn[i]) continue;
bl.clear(), tarjan(i, 0);
for (int u : bl) add(a[u]);
res += cur;
for (int u : bl) tres[u] = cur;
for (int u : bl) del(a[u]);
}
for (int i = 1; i <= m; i++) {
auto [u, v] = e[i];
ans[i] = res;
if (bel[u] != bel[v]) {
t[bel[u]].eb(mp(bel[v], i));
t[bel[v]].eb(mp(bel[u], i));
ans[i] -= tres[u];
}
}
dfc = 0;
for (int i = 1; i <= tot; i++) {
if (lp[i]) continue;
dfs1(i, 0), dfs2(i, 0, 0, 1);
for (int j = lp[i]; j <= rp[i]; j++)
for (int k : b[j]) add(a[k]);
dfs2(i, 0, 1, 0);
}
for (int i = 1; i <= m; i++) cout << ans[i] << ' ';
cout << '\n', clr();
}
bool Med;
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
cerr << (&Mbe - &Med) / 1048576.0 << " MB\n";
#ifdef FILE
freopen("1.in", "r", stdin);
freopen("1.out", "w", stdout);
#endif
int T = 1;
cin >> T;
while (T--) solve();
cerr << (int)(1e3 * clock() / CLOCKS_PER_SEC) << " ms\n";
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 0
Wrong Answer
time: 0ms
memory: 11948kb
input:
3 7 5 1 2 1 2 1 2 1 1 2 1 3 2 4 5 6 5 7 3 3 1 2 3 1 2 1 3 2 3 2 3 12345 54321 1 2 1 2 1 1
output:
6 5 5 5 4 1 1 1 1 1 1
result:
wrong answer 1st lines differ - expected: '6 5 5 5 4', found: '6 5 5 5 4 '