QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#138757#6127. Kawa ExamSanguineChameleonWA 588ms27800kbC++203.0kb2023-08-12 10:00:002023-08-12 10:00:04

Judging History

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

  • [2023-08-12 10:00:04]
  • 评测
  • 测评结果:WA
  • 用时:588ms
  • 内存:27800kb
  • [2023-08-12 10:00:00]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;

void just_do_it();

int main() {
	#ifdef KAMIRULEZ
		freopen("kamirulez.inp", "r", stdin);
		freopen("kamirulez.out", "w", stdout);
	#endif
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	just_do_it();
	return 0;
}

const int maxn = 1e5 + 20;
int a[maxn];
int tree[maxn];
vector<pair<int, int>> adj[maxn];
vector<int> ch[maxn];
int res[maxn];
int par_id[maxn];
bool flag[maxn];
int high[maxn];
int depth[maxn];
int root[maxn];
int sz[maxn];
int best[maxn][2];
int k;

void dfs_tree(int u) {
	flag[u] = true;
	high[u] = depth[u];
	sz[u] = 1;
	for (auto e: adj[u]) {
		int v = e.first;
		int id = e.second;
		if (id == par_id[u]) {
			continue;
		}
		if (!flag[v]) {
			ch[u].push_back(v);
			root[v] = root[u];
			depth[v] = depth[u] + 1;
			par_id[v] = id;
			dfs_tree(v);
			high[u] = min(high[u], high[v]);
			sz[u] += sz[v];
		}
		else {
			high[u] = min(high[u], depth[v]);
		}
	}
}

void update_tree(int id, int lt, int rt, int pos, int delta) {
	if (lt == rt) {
		tree[id] += delta;
		return;
	}
	int mt = (lt + rt) / 2;
	if (pos <= mt) {
		update_tree(id * 2, lt, mt, pos, delta);
	}
	else {
		update_tree(id * 2 + 1, mt + 1, rt, pos, delta);
	}
	tree[id] = max(tree[id * 2], tree[id * 2 + 1]);
}

void add_cnt(int u, int delta) {
	update_tree(1, 1, k, a[u], delta);
}

void dfs_add(int u, int delta) {
	add_cnt(u, delta);
	for (auto v: ch[u]) {
		dfs_add(v, delta);
	}
}

void dfs_cnt(int u, int type, bool keep) {
	int delta = (type ? -1 : 1);
	int heavy = 0;
	for (auto v: ch[u]) {
		if (sz[v] > sz[heavy]) {
			heavy = v;
		}
	}
	for (auto v: ch[u]) {
		if (v != heavy) {
			dfs_cnt(v, type, false);
		}
	}
	if (heavy) {
		dfs_cnt(heavy, type, true);
	}
	for (auto v: ch[u]) {
		if (v != heavy) {
			dfs_add(v, delta);
		}
	}
	add_cnt(u, delta);
	best[u][type] = tree[1];
	if (!keep) {
		dfs_add(u, -delta);
	}
}

void test() {
	int n, m;
	cin >> n >> m;
	map<int, int> comp;
	k = 0;
	for (int i = 1; i <= n; i++) {
		cin >> a[i];
		auto it = comp.find(a[i]);
		if (it != comp.end()) {
			a[i] = it->second;
		}
		else {
			a[i] = (comp[a[i]] = ++k);
		}
	}
	for (int i = 1; i <= n; i++) {
		adj[i].clear();
		ch[i].clear();
		flag[i] = false;
		par_id[i] = 0;
	}
	for (int i = 1; i <= m; i++) {
		int u, v;
		cin >> u >> v;
		adj[u].emplace_back(v, i);
		adj[v].emplace_back(u, i);
	}
	int sum = 0;
	for (int i = 1; i <= n; i++) {
		if (!flag[i]) {
			root[i] = i;
			depth[i] = 0;
			dfs_tree(i);
			dfs_cnt(i, 0, true);
			dfs_cnt(i, 1, true);
			sum += best[i][0];
		}
	}
	for (int i = 1; i <= m; i++) {
		res[i] = sum;
	}
	for (int i = 1; i <= n; i++) {
		if (par_id[i] && high[i] == depth[i]) {
			res[par_id[i]] += best[i][0] + best[i][1] - best[root[i]][0];
		}
	}
	cout << res[1];
	for (int i = 2; i <= m; i++) {
		cout << " " << res[i];
	}
	cout << '\n';
}

void just_do_it() {
	int t;
	cin >> t;
	for (int i = 0; i < t; i++) {
		test();
	}
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 3ms
memory: 11660kb

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
Wrong Answer
time: 588ms
memory: 27800kb

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 4 4 3 3
7 7 7 7
9 9 9 8 9 8 9 8 9 9 10 9 9
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2
7 8
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 10 9
16 16 16 16 16 17 16 16
10 10 11 10 12 11 10 10 10 10 10 10 10 12 10 10 10 10 10 11
10 9 9 9 9 9 9 9 9 9 9 9 9 9 10 ...

result:

wrong answer 5552nd lines differ - expected: '16100 16099 16100 16099 16099 ...0 16100 16099 16099 16100 16099', found: '429387918 429361241 429387918 ...1 429361241 429387918 429361241'