提出 #52141008
ソースコード 拡げる
// Hallelujah, praise the one who set me free
// Hallelujah, death has lost its grip on me
// You have broken every chain, There's salvation in your name
// Jesus Christ, my living hope
#include <bits/stdc++.h>
#include "Aoi.h"
using namespace std;
#define REP(i, s, e) for (int i = (s); i < (e); i++)
#define RREP(i, s, e) for (int i = (s); i >= (e); i--)
template <class T>
inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;}
template <class T>
inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;}
typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
#define FI first
#define SE second
typedef pair<int, int> ii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> iii;
#define ALL(_a) _a.begin(), _a.end()
#define SZ(_a) (int) _a.size()
#define pb push_back
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<ii> vii;
typedef vector<iii> viii;
#ifndef DEBUG
#define cerr if (0) cerr
#endif
const int INF = 1000000005;
const ll LINF = 1000000000000000005ll;
const int MAXN = 10005;
const int MAXM = 20005;
const int MAXK = 305;
const int LOGK = 9;
const int MAXQ = 16;
const int LOGQ = 4;
namespace {
int n, m, q, k;
ll c[MAXM];
vii adj[MAXN];
int subt[MAXN], tid[MAXN], bid[MAXM];
vii tree[MAXN];
string s;
bool bvis[MAXK];
int bl[MAXK];
bool tdone[MAXQ + 5];
int qptr;
ii p[MAXN], tp[MAXN];
vector<vector<int>> decode(int b, vector<int> k, vector<int> l, vector<int> x) {
assert(k.size() == l.size());
int n = k.size(), m = x.size();
vector<vector<int>> a(n);
for (int i = 0; i < n; i++) {
a[i].resize(l[i]);
for (int j = 0; j < l[i]; j++) {
int rem = 0;
for (int p = m - 1; p >= 0; p--) {
rem = rem * b + x[p];
x[p] = rem / k[i];
rem %= k[i];
}
a[i][j] = rem;
}
}
return a;
}
ll d[MAXN];
priority_queue<pll, vector<pll>, greater<pll>> pq;
void dijkstra(int s) {
REP (i, 0, n) {
d[i] = LINF;
}
d[s] = 0;
pq.push({0, s});
while (!pq.empty()) {
auto [ud, u] = pq.top(); pq.pop();
if (ud != d[u]) {
continue;
}
for (auto [v, i] : adj[u]) {
if (mnto(d[v], d[u] + c[i])) {
p[v] = {u, i};
pq.push({d[v], v});
}
}
}
}
void root(int u) {
for (auto [v, i] : tree[u]) {
root(v);
subt[u] += subt[v];
}
}
vi badj[MAXK];
vi bt[MAXK];
vi stk;
void dfs(int u) {
if (tid[u] < q) {
bt[stk.back()].pb(tid[u]);
}
for (auto [v, i] : tree[u]) {
if (!subt[v]) {
continue;
}
if (bid[i] < k) {
badj[stk.back()].pb(bid[i]);
stk.pb(bid[i]);
}
dfs(v);
if (bid[i] < k) {
stk.pop_back();
}
}
}
int bmnt[MAXK];
void broot(int u) {
bmnt[u] = INF;
if (!bt[u].empty()) {
sort(ALL(bt[u]));
bmnt[u] = bt[u][0];
}
for (int v : badj[u]) {
broot(v);
mnto(bmnt[u], bmnt[v]);
}
sort(ALL(badj[u]), [&] (int l, int r) {
return bmnt[l] < bmnt[r];
});
}
int lptr;
int tlabel[MAXQ + 5], blabel[MAXK];
int ids[MAXQ + 5];
int bdfs(int u) {
int ptr = 0;
int nxt = -1;
blabel[u] = lptr;
for (int v : badj[u]) {
while (ptr < SZ(bt[u]) && bt[u][ptr] < bmnt[v]) {
tlabel[nxt] = u;
ids[lptr] = bt[u][ptr];
nxt = bt[u][ptr++];
lptr++;
}
tlabel[nxt] = u;
nxt = bdfs(v);
}
while (ptr < SZ(bt[u])) {
tlabel[nxt] = u;
ids[lptr] = bt[u][ptr];
nxt = bt[u][ptr++];
lptr++;
}
return nxt;
}
vector<int> encode(int b, vector<int> k, vector<vector<int>> a) {
assert(k.size() == a.size());
int n = k.size();
ld bits = 0;
for (int i = 0; i < n; i++) {
bits += a[i].size() * (log(k[i]) / log(b));
}
int m = ceil(bits);
vector<int> x(m);
for (int p = 0; p < m; p++) {
int rem = 0;
for (int i = n - 1; i >= 0; i--) {
for (int j = a[i].size() - 1; j >= 0; j--) {
rem = rem * k[i] + a[i][j];
a[i][j] = rem / b;
rem %= b;
}
}
x[p] = rem;
}
return x;
}
}
string aoi(int N, int M, int Q, int K, vi A, vi B, vll C, vi T, vi X) {
n = N; m = M; q = Q; k = K;
REP (i, 0, m) {
adj[A[i]].pb({B[i], i});
adj[B[i]].pb({A[i], i});
c[i] = C[i];
}
REP (i, 0, n) {
tid[i] = INF;
}
REP (i, 0, q) {
subt[T[i]] = 1;
tid[T[i]] = i;
}
REP (i, 0, m) {
bid[i] = INF;
}
REP (i, 0, k) {
bid[X[i]] = i;
blabel[i] = q;
}
dijkstra(0);
REP (i, 1, n) {
tree[p[i].FI].pb({i, p[i].SE});
}
root(0);
stk.pb(k);
dfs(0);
broot(k);
tlabel[bdfs(k)] = k;
string s;
assert(lptr <= q);
vi tmp = encode(2, vi({q + 1, k + 1, q}), vector<vi>({vi(blabel, blabel + k), vi(tlabel, tlabel + q), vi(ids, ids + q)}));
for (int i : tmp) {
char c = i + '0';
s += c;
}
return s;
}
void bitaro(int N, int M, int Q, int K, vi A, vi B, vll C, vi T, vi X, string S) {
s = S;
n = N; m = M; q = Q; k = K;
REP (i, 0, m) {
adj[A[i]].pb({B[i], i});
adj[B[i]].pb({A[i], i});
c[i] = C[i];
}
REP (i, 0, k) {
c[X[i]] = -1;
bid[X[i]] = i;
}
vi vs;
for (char c : s) {
vs.pb(c - '0');
}
vector<vi> tmp = decode(2, vi({q + 1, k + 1, q}), vi({k, q, q}), vs);
REP (i, 0, k) {
blabel[i] = tmp[0][i];
}
REP (i, 0, q) {
tlabel[i] = tmp[1][i];
}
REP (i, 0, q) {
ids[i] = tmp[2][i];
}
REP (i, 0, n) {
p[i] = {-1, -1};
}
vi bstk;
bstk.pb(k);
bvis[k] = 1;
REP (l, 0, q) {
int bu = bstk.back();
int u = 0;
if (bu < k) {
u = p[A[X[bu]]].SE == X[bu] ? A[X[bu]] : B[X[bu]];
}
while (!pq.empty()) {
pq.pop();
}
REP (i, 0, n) {
d[i] = LINF;
}
d[u] = 0;
pq.push({0, u});
while (!pq.empty()) {
auto [ud, u] = pq.top(); pq.pop();
if (ud != d[u]) {
continue;
}
for (auto [v, i] : adj[u]) {
if (p[v].FI != -1 && p[v].FI != u) {
continue;
}
if (p[u].FI != -1 && p[u].FI == v) {
continue;
}
ll w = c[i];
if (c[i] == -1) {
if (blabel[bid[i]] != l) {
continue;
}
w = 1;
}
if (mnto(d[v], ud + w)) {
if (c[i] == -1) {
bvis[bid[i]] = 1;
bl[bid[i]] = bl[bstk.back()] + 1;
bstk.pb(bid[i]);
}
tp[v] = {u, i};
pq.push({d[v], v});
}
}
}
int tid = ids[l];
int tu = T[tid];
while (tu != u) {
p[tu] = tp[tu];
tu = tp[tu].FI;
}
while (!bstk.empty() && bstk.back() != tlabel[tid]) {
bvis[bstk.back()] = 0;
bstk.pop_back();
}
assert(!bstk.empty());
}
REP (i, 0, q) {
int u = T[i];
vi e;
while (u) {
e.pb(p[u].SE);
u = p[u].FI;
}
reverse(ALL(e));
answer(e);
}
}
提出情報
提出日時
2024-04-07 18:23:10+0900
問題
C - スパイ 3 (Spy 3)
ユーザ
maomao90
言語
C++ 20 (gcc 12.2)
得点
100
コード長
8633 Byte
結果
AC
実行時間
91 ms
メモリ
8956 KiB
コンパイルエラー
Main.cpp:57:9: warning: ‘{anonymous}::qptr’ defined but not used [-Wunused-variable]
57 | int qptr;
| ^~~~
Main.cpp:55:10: warning: ‘{anonymous}::tdone’ defined but not used [-Wunused-variable]
55 | bool tdone[MAXQ + 5];
| ^~~~~
ジャッジ結果
セット名
Sample
Subtask1
得点 / 配点
0 / 0
100 / 100
結果
セット名
テストケース
Sample
sample-01.txt, sample-02.txt
Subtask1
01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, 01-36.txt, 01-37.txt, 01-38.txt, 01-39.txt, 01-40.txt, 01-41.txt, 01-42.txt, 01-43.txt, 01-44.txt, 01-45.txt, 01-46.txt, 01-47.txt, 01-48.txt, 01-49.txt, 01-50.txt, 01-51.txt, 01-52.txt, 01-53.txt, 01-54.txt, 01-55.txt, 01-56.txt, 01-57.txt, 01-58.txt, 01-59.txt, 01-60.txt, 01-61.txt, 01-62.txt, 01-63.txt, 01-64.txt, 01-65.txt, 01-66.txt, 01-67.txt, 01-68.txt, 01-69.txt, 01-70.txt, 01-71.txt, 01-72.txt, 01-73.txt, 01-74.txt, 01-75.txt, 01-76.txt, 01-77.txt, 01-78.txt, 01-79.txt, 01-80.txt, 01-81.txt, 01-82.txt, 01-83.txt, sample-01.txt, sample-02.txt
ケース名
結果
実行時間
メモリ
01-01.txt
AC
91 ms
6796 KiB
01-02.txt
AC
5 ms
3992 KiB
01-03.txt
AC
47 ms
7648 KiB
01-04.txt
AC
39 ms
7728 KiB
01-05.txt
AC
58 ms
7644 KiB
01-06.txt
AC
44 ms
7632 KiB
01-07.txt
AC
49 ms
7632 KiB
01-08.txt
AC
49 ms
7536 KiB
01-09.txt
AC
39 ms
7700 KiB
01-10.txt
AC
34 ms
7584 KiB
01-11.txt
AC
50 ms
7248 KiB
01-12.txt
AC
43 ms
7520 KiB
01-13.txt
AC
56 ms
7588 KiB
01-14.txt
AC
45 ms
7564 KiB
01-15.txt
AC
42 ms
7648 KiB
01-16.txt
AC
33 ms
7600 KiB
01-17.txt
AC
49 ms
8160 KiB
01-18.txt
AC
50 ms
8100 KiB
01-19.txt
AC
62 ms
8312 KiB
01-20.txt
AC
53 ms
8192 KiB
01-21.txt
AC
60 ms
8308 KiB
01-22.txt
AC
55 ms
8280 KiB
01-23.txt
AC
50 ms
8136 KiB
01-24.txt
AC
56 ms
8228 KiB
01-25.txt
AC
47 ms
8256 KiB
01-26.txt
AC
48 ms
8244 KiB
01-27.txt
AC
5 ms
3828 KiB
01-28.txt
AC
43 ms
7584 KiB
01-29.txt
AC
30 ms
6528 KiB
01-30.txt
AC
46 ms
7996 KiB
01-31.txt
AC
49 ms
7876 KiB
01-32.txt
AC
65 ms
7964 KiB
01-33.txt
AC
62 ms
7664 KiB
01-34.txt
AC
57 ms
8156 KiB
01-35.txt
AC
42 ms
8080 KiB
01-36.txt
AC
43 ms
7972 KiB
01-37.txt
AC
22 ms
6064 KiB
01-38.txt
AC
36 ms
6928 KiB
01-39.txt
AC
33 ms
6964 KiB
01-40.txt
AC
23 ms
6452 KiB
01-41.txt
AC
73 ms
8452 KiB
01-42.txt
AC
58 ms
8956 KiB
01-43.txt
AC
74 ms
8740 KiB
01-44.txt
AC
42 ms
8676 KiB
01-45.txt
AC
25 ms
5696 KiB
01-46.txt
AC
29 ms
6304 KiB
01-47.txt
AC
25 ms
6420 KiB
01-48.txt
AC
5 ms
3960 KiB
01-49.txt
AC
5 ms
3824 KiB
01-50.txt
AC
30 ms
6572 KiB
01-51.txt
AC
11 ms
3916 KiB
01-52.txt
AC
6 ms
3924 KiB
01-53.txt
AC
39 ms
6612 KiB
01-54.txt
AC
27 ms
5060 KiB
01-55.txt
AC
46 ms
6220 KiB
01-56.txt
AC
48 ms
7960 KiB
01-57.txt
AC
60 ms
8140 KiB
01-58.txt
AC
52 ms
7076 KiB
01-59.txt
AC
66 ms
8320 KiB
01-60.txt
AC
59 ms
8036 KiB
01-61.txt
AC
71 ms
8008 KiB
01-62.txt
AC
68 ms
8004 KiB
01-63.txt
AC
72 ms
8360 KiB
01-64.txt
AC
38 ms
7688 KiB
01-65.txt
AC
40 ms
6448 KiB
01-66.txt
AC
48 ms
8772 KiB
01-67.txt
AC
42 ms
6500 KiB
01-68.txt
AC
48 ms
8804 KiB
01-69.txt
AC
5 ms
3696 KiB
01-70.txt
AC
5 ms
3724 KiB
01-71.txt
AC
7 ms
3864 KiB
01-72.txt
AC
24 ms
5236 KiB
01-73.txt
AC
36 ms
6008 KiB
01-74.txt
AC
36 ms
6024 KiB
01-75.txt
AC
24 ms
6028 KiB
01-76.txt
AC
5 ms
3892 KiB
01-77.txt
AC
47 ms
7300 KiB
01-78.txt
AC
46 ms
7104 KiB
01-79.txt
AC
53 ms
7356 KiB
01-80.txt
AC
5 ms
3856 KiB
01-81.txt
AC
53 ms
7444 KiB
01-82.txt
AC
45 ms
7492 KiB
01-83.txt
AC
57 ms
7512 KiB
sample-01.txt
AC
5 ms
3820 KiB
sample-02.txt
AC
5 ms
3908 KiB