QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#249971 | #6559. A Tree and Two Edges | Nicolas125841 | WA | 0ms | 3828kb | C++17 | 4.8kb | 2023-11-12 18:53:29 | 2023-11-12 18:53:29 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
#define rep(i, a, b) for(int i = a; i < (b); ++i)
#define all(x) begin(x), end(x)
#define sz(x) (int)(x).size()
typedef long long ll;
typedef pair<int, int> pii;
typedef vector<int> vi;
vi num, st;
vector<vector<pii>> ed;
int Time;
template<class F>
int dfs(int at, int par, F& f) {
int me = num[at] = ++Time, e, y, top = me;
for (auto pa : ed[at]) if (pa.second != par) {
tie(y, e) = pa;
if (num[y]) {
top = min(top, num[y]);
if (num[y] < me)
st.push_back(e);
} else {
int si = sz(st);
int up = dfs(y, e, f);
top = min(top, up);
if (up == me) {
st.push_back(e);
f(vi(st.begin() + si, st.end()));
st.resize(si);
}
else if (up < me) st.push_back(e);
else { /* e is a bridge */ }
}
}
return top;
}
template<class F>
void bicomps(F f) {
num.assign(sz(ed), 0);
rep(i,0,sz(ed)) if (!num[i]) dfs(i, -1, f);
}
vi marks, colors, cnts;
int main() {
cin.tie(0)->sync_with_stdio(0);
int n, q;
cin >> n >> q;
ed.resize(n);
marks.assign(n, 0);
colors.assign(n, 0);
cnts.assign(n, 0);
vector<pii> edges;
for(int i = 0; i <= n; i++){
int u, v;
cin >> u >> v;
u--, v--;
ed[u].emplace_back(v, i);
ed[v].emplace_back(u, i);
edges.emplace_back(u, v);
}
int type = 0;
bicomps([&](const vi &edgelist) {
for(const auto &edge : edgelist){
cnts[edges[edge].first]++;
cnts[edges[edge].second]++;
}
if(type != -1)
for(int i = 0; i < n; i++)
if(cnts[i] == 3)
type = 1;
if(type == -1){
for(int i = 0; i < n; i++)
if(cnts[i] && !marks[i])
marks[i] = 2;
for(int i = 0; i < n; i++)
if(cnts[i] == 4)
marks[i] = 4;
}else if(type == 0){
for(int i = 0; i < n; i++)
if(cnts[i])
marks[i] = 1;
type = -1;
}else{
const function<void (int, int, int)> fill = [&](int c, int n, int p){
marks[n] = c;
for (auto pa : ed[n])
if (pa.first != p && !marks[pa.first] && cnts[pa.first])
fill(c, pa.first, n);
};
for(int i = 0; i < n; i++)
if(cnts[i] == 3)
marks[i] = 4;
for(int i = 0; i < n; i++){
if(cnts[i] == 3){
int tm = 1;
for (auto pa : ed[i])
if(!marks[pa.first] && cnts[pa.first])
fill(tm++, pa.first, i);
}
}
}
});
bool ff = false;
for(int i = 0; i < n; i++){
if(cnts[i] == 4)
ff = true;
}
int color = 1;
const function<void (int, int, int, int)> backfill = [&](const int c1, const int c2, const int n, const int p) {
marks[n] = 3;
colors[n] = c1;
for (auto pa : ed[n])
if (pa.first != p && (colors[pa.first] == c1 || colors[pa.first] == c2))
backfill(c1, c2, pa.first, n);
};
const function<void (int, int, int, int)> fill = [&](const int m, const int c, const int n, const int p) {
marks[n] = m;
colors[n] = c;
for (auto pa : ed[n]){
if (pa.first != p && !marks[pa.first])
fill(marks[n], c, pa.first, n);
else if(pa.first != p && type == -1 && !ff && colors[pa.first] && marks[pa.first] != marks[n] && marks[pa.first] != 3)
backfill(c, colors[pa.first], n, -1);
}
};
for(int i = 0; i < n; i++)
if(marks[i] && !colors[i])
fill(marks[i], color++, i, -1);
while(q--){
int u, v;
cin >> u >> v;
u--, v--;
if(type == 1){
if(colors[u] == colors[v])
cout << "1\n";
else if(marks[u] == marks[v] || marks[u] == 4 || marks[v] == 4)
cout << "3\n";
else
cout << "4\n";
}else{
if(colors[u] == colors[v])
cout << "1\n";
else if(marks[u] == marks[v] || marks[u] == 3 || marks[v] == 3)
cout << "2\n";
else
cout << "4\n";
}
}
}
/*
6 0
1 2
2 3
3 1
3 4
4 5
5 6
6 4
*/
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3828kb
input:
4 6 1 2 1 3 1 4 2 3 2 4 1 2 1 3 1 4 2 3 2 4 3 4
output:
3 3 3 3 3 4
result:
ok 6 lines
Test #2:
score: -100
Wrong Answer
time: 0ms
memory: 3520kb
input:
6 4 1 2 1 3 1 6 2 3 3 4 3 5 4 5 1 2 1 3 1 4 1 6
output:
2 4 4 1
result:
wrong answer 2nd lines differ - expected: '2', found: '4'