QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#331423#6127. Kawa ExamEnder32kML 0ms16780kbC++173.6kb2024-02-18 08:42:082024-02-18 08:42:09

Judging History

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

  • [2024-02-18 08:42:09]
  • 评测
  • 测评结果:ML
  • 用时:0ms
  • 内存:16780kb
  • [2024-02-18 08:42:08]
  • 提交

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 - 1; i++) cout << ans[i] << ' ';
	cout << ans[m] << '\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: 100
Accepted
time: 0ms
memory: 16780kb

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:

ok 3 lines

Test #2:

score: -100
Memory Limit Exceeded

input:

5557
2 7
79960 79960
2 2
1 1
1 1
2 2
1 1
2 1
1 2
9 8
21881 70740 70740 21881 22458 22458 639 21881 70740
3 3
1 6
5 8
7 5
5 7
2 3
5 1
7 6
6 7
13064 20716 6746 13064 6746 69225
5 5
4 1
4 1
1 6
4 5
3 2
3 2
8 4
45146 14400 45146 45146 14400 72969 14400 45146
8 6
1 3
4 6
8 3
18 13
48132 37949 92338 92338...

output:

2 2 2 2 2 2 2
6 6 7 6 6 6 6 6
3 3 3 1 1 3 3
3 3 3 3
6 6 6 8 10 8 6 8 10 10 6 10 10
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
7 6
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4 4
9 8 9
13 14 14 13 14 14 14 14
6 10 7 8 6 6 10 10 10 10 10 10 10 6 6 10 10 10 10 7
4 9 9 9 4 4 9 9 9 9 4 4 4 9 8 4 9 4
2...

result: