QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#138757 | #6127. Kawa Exam | SanguineChameleon | WA | 588ms | 27800kb | C++20 | 3.0kb | 2023-08-12 10:00:00 | 2023-08-12 10:00:04 |
Judging History
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();
}
}
详细
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'