QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#775323 | #9230. Routing K-Codes | Misuki | WA | 120ms | 33332kb | C++20 | 7.9kb | 2024-11-23 15:29:05 | 2024-11-23 15:29:06 |
Judging History
answer
#include <algorithm>
#include <array>
#include <bitset>
#include <cassert>
#include <cctype>
#include <cfenv>
#include <cfloat>
#include <chrono>
#include <cinttypes>
#include <climits>
#include <cmath>
#include <complex>
#include <cstdarg>
#include <cstddef>
#include <cstdint>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <fstream>
#include <functional>
#include <initializer_list>
#include <iomanip>
#include <ios>
#include <iostream>
#include <istream>
#include <iterator>
#include <limits>
#include <list>
#include <map>
#include <memory>
#include <new>
#include <numeric>
#include <ostream>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <stack>
#include <streambuf>
#include <string>
#include <tuple>
#include <type_traits>
#include <variant>
#include <bit>
#include <compare>
#include <concepts>
#include <numbers>
#include <ranges>
#include <span>
#define int ll
#define INT128_MAX (__int128)(((unsigned __int128) 1 << ((sizeof(__int128) * __CHAR_BIT__) - 1)) - 1)
#define INT128_MIN (-INT128_MAX - 1)
#define clock chrono::steady_clock::now().time_since_epoch().count()
using namespace std;
template<class T1, class T2>
ostream& operator<<(ostream& os, const pair<T1, T2> pr) {
return os << pr.first << ' ' << pr.second;
}
template<class T, size_t N>
ostream& operator<<(ostream& os, const array<T, N> &arr) {
for(size_t i = 0; T x : arr) {
os << x;
if (++i != N) os << ' ';
}
return os;
}
template<class T>
ostream& operator<<(ostream& os, const vector<T> &vec) {
for(size_t i = 0; T x : vec) {
os << x;
if (++i != size(vec)) os << ' ';
}
return os;
}
template<class T>
ostream& operator<<(ostream& os, const set<T> &s) {
for(size_t i = 0; T x : s) {
os << x;
if (++i != size(s)) os << ' ';
}
return os;
}
template<class T1, class T2>
ostream& operator<<(ostream& os, const map<T1, T2> &m) {
for(size_t i = 0; pair<T1, T2> x : m) {
os << x;
if (++i != size(m)) os << ' ';
}
return os;
}
#ifdef DEBUG
#define dbg(...) cerr << '(', _do(#__VA_ARGS__), cerr << ") = ", _do2(__VA_ARGS__)
template<typename T> void _do(T &&x) { cerr << x; }
template<typename T, typename ...S> void _do(T &&x, S&&...y) { cerr << x << ", "; _do(y...); }
template<typename T> void _do2(T &&x) { cerr << x << endl; }
template<typename T, typename ...S> void _do2(T &&x, S&&...y) { cerr << x << ", "; _do2(y...); }
#else
#define dbg(...)
#endif
using ll = long long;
using ull = unsigned long long;
using ldb = long double;
using pii = pair<int, int>;
using pll = pair<ll, ll>;
//#define double ldb
template<typename T> using min_heap = priority_queue<T, vector<T>, greater<T>>;
template<typename T> using max_heap = priority_queue<T>;
template<ranges::forward_range rng, class T = ranges::range_value_t<rng>, class OP = plus<T>>
void pSum(rng &&v) {
if (!v.empty())
for(T p = v[0]; T &x : v | views::drop(1))
x = p = OP()(p, x);
}
template<ranges::forward_range rng, class T = ranges::range_value_t<rng>, class OP>
void pSum(rng &&v, OP op) {
if (!v.empty())
for(T p = v[0]; T &x : v | views::drop(1))
x = p = op(p, x);
}
template<ranges::forward_range rng>
void Unique(rng &v) {
ranges::sort(v);
v.resize(unique(v.begin(), v.end()) - v.begin());
}
template<ranges::random_access_range rng>
rng invPerm(rng p) {
rng ret = p;
for(int i = 0; i < ssize(p); i++)
ret[p[i]] = i;
return ret;
}
template<ranges::random_access_range rng, ranges::random_access_range rng2>
rng Permute(rng v, rng2 p) {
rng ret = v;
for(int i = 0; i < ssize(p); i++)
ret[p[i]] = v[i];
return ret;
}
template<bool directed>
vector<vector<int>> readGraph(int n, int m, int base) {
vector<vector<int>> g(n);
for(int i = 0; i < m; i++) {
int u, v; cin >> u >> v;
u -= base, v -= base;
g[u].emplace_back(v);
if constexpr (!directed)
g[v].emplace_back(u);
}
return g;
}
template<class T>
void setBit(T &msk, int bit, bool x) {
msk = (msk & ~(T(1) << bit)) | (T(x) << bit);
}
template<class T> void flipBit(T &msk, int bit) { msk ^= T(1) << bit; }
template<class T> bool getBit(T msk, int bit) { return msk >> bit & T(1); }
template<class T>
T floorDiv(T a, T b) {
if (b < 0) a *= -1, b *= -1;
return a >= 0 ? a / b : (a - b + 1) / b;
}
template<class T>
T ceilDiv(T a, T b) {
if (b < 0) a *= -1, b *= -1;
return a >= 0 ? (a + b - 1) / b : a / b;
}
template<class T> bool chmin(T &a, T b) { return a > b ? a = b, 1 : 0; }
template<class T> bool chmax(T &a, T b) { return a < b ? a = b, 1 : 0; }
template<class V, V(*base)(int), class E, E(*addEdge)(const V&, int eid),
E(*op)(const E&, const E&), V(*addVertex)(const E&, int vid)>
vector<V> rerootingDP(vector<array<int, 2>> e) {
int n = ssize(e) + 1;
vector<vector<int>> g(n);
for(int i = 0; auto [u, v] : e)
g[u].emplace_back(i), g[v].emplace_back(i++);
vector<V> data(n);
for(int v = 0; v < n; v++) data[v] = base(v);
auto precalc = [&](int v, int p, auto &&self) -> void {
bool leaf = true;
E prod;
for(int eid : g[v]) {
int x = e[eid][0] ^ e[eid][1] ^ v;
if (x == p) continue;
self(x, v, self);
if (leaf)
prod = addEdge(data[x], eid), leaf = false;
else
prod = op(prod, addEdge(data[x], eid));
}
if (!leaf) data[v] = addVertex(prod, v);
};
precalc(0, -1, precalc);
vector<V> ret(n);
auto reroot = [&](int v, int p, auto &&self) -> void {
int deg = ssize(g[v]);
vector<E> pre(deg), suf(deg);
for(int i = 0; int eid : g[v]) {
int x = e[eid][0] ^ e[eid][1] ^ v;
pre[i] = suf[i] = addEdge(data[x], eid), i++;
}
for(int i = 1; i < deg; i++) pre[i] = op(pre[i - 1], pre[i]);
for(int i = deg - 2; i >= 0; i--) suf[i] = op(suf[i], suf[i + 1]);
V tmp = data[v];
ret[v] = data[v] = (deg ? addVertex(suf[0], v) : base(v));
for(int i = 0; int eid : g[v]) {
int x = e[eid][0] ^ e[eid][1] ^ v;
if (x != p) {
bool leaf = true;
E prod;
if (i > 0) prod = pre[i - 1], leaf = false;
if (i + 1 < deg) prod = (leaf ? suf[i + 1] : op(prod, suf[i + 1])), leaf = false;
V tmp2 = data[v];
data[v] = (leaf ? base(v) : addVertex(prod, v));
self(x, v, self);
data[v] = tmp2;
}
i++;
}
data[v] = tmp;
};
reroot(0, -1, reroot);
return ret;
}
struct V {
int h, pot, dp;
};
V base(int) {
return {0, 0, 1};
}
struct E {
int mx_h, sum_pot, sum_dp, mn_pot, cnt_child;
};
const int C = 1ll << 52;
E addEdge(const V& v, int) {
return {v.h, min(2 * v.pot + 1, C), v.dp, min(2 * v.pot + 1, C), 1};
}
E op(const E& a, const E &b) {
return {max(a.mx_h, b.mx_h), min(C, a.sum_pot + b.sum_pot), min(a.sum_dp + b.sum_dp, C), min(a.mn_pot, b.mn_pot), a.cnt_child + b.cnt_child};
}
V addVertex(const E& e, int) {
return {e.mx_h + 1, e.sum_pot, min(e.sum_dp + e.sum_pot + (e.cnt_child >= 2 ? e.mn_pot : 0ll) + 1, C)};
}
void NIE() {
cout << "NIE\n";
exit(0);
}
signed main() {
ios::sync_with_stdio(false), cin.tie(NULL);
int n, m; cin >> n >> m;
vector<array<int, 2>> e(m);
for(auto &[u, v] : e) {
cin >> u >> v;
u--, v--;
}
if (m != n - 1) NIE();
if (n == 1) {
cout << 0 << '\n';
return 0;
}
vector<int> deg(n);
for(auto [u, v] : e) deg[u]++, deg[v]++;
for(int i = 0; i < n; i++)
if (deg[i] > 3)
NIE();
if (ranges::min(deg) == 3) NIE();
auto dp = rerootingDP<V, base, E, addEdge, op, addVertex>(e);
int ans = C;
for(int v = 0; v < n; v++) {
if (deg[v] > 2) continue;
if (deg[v] == 1 and dp[v].h <= 32) chmin(ans, dp[v].dp - dp[v].pot - 1);
if (deg[v] == 2 and dp[v].h < 32) chmin(ans, dp[v].dp);
}
cout << ans << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 3604kb
input:
4 3 1 2 1 3 1 4
output:
6
result:
ok single line: '6'
Test #2:
score: 0
Accepted
time: 1ms
memory: 3796kb
input:
4 6 1 2 2 3 3 4 4 1 1 3 2 4
output:
NIE
result:
ok single line: 'NIE'
Test #3:
score: 0
Accepted
time: 0ms
memory: 3492kb
input:
10 10 9 3 5 10 1 4 10 8 8 3 7 3 9 6 8 6 7 2 4 5
output:
NIE
result:
ok single line: 'NIE'
Test #4:
score: -100
Wrong Answer
time: 120ms
memory: 33332kb
input:
200000 199999 172774 188052 195063 155577 38023 148303 30605 155047 170238 19344 46835 58255 154268 109062 197059 116041 136424 12058 42062 149807 109545 115380 132322 51106 16706 162612 62234 31319 195735 80435 173898 84051 19876 102910 186924 9136 123094 117097 145054 173049 137364 152731 82662 18...
output:
4503599627370496
result:
wrong answer 1st lines differ - expected: 'NIE', found: '4503599627370496'