From b42db10e14762b2cd708c96149b59ff4c7a5286b Mon Sep 17 00:00:00 2001 From: Minseong Gwak Date: Mon, 10 Nov 2025 17:33:39 +0900 Subject: [PATCH] Did debug, but still not enough --- Makefile | 17 +++++--- generator/gen1.cpp | 25 ++++++----- src/bsb/bsb.hpp | 98 +++++++++++++++++++++++++++++++++++++++--- src/bsb/main.cpp | 104 +++++++++++++++++++++++++++++++-------------- 4 files changed, 191 insertions(+), 53 deletions(-) diff --git a/Makefile b/Makefile index f60b834..4d98524 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ SHELL = /bin/bash -# CXX = g++ -CXX = clang++ +CXX = g++ +# CXX = clang++ SRC_DIR = src GEN_DIR = generator @@ -22,7 +22,7 @@ BUILD_OUT_B_DIR = $(BUILD_DIR)/$(SOL_B)_out DIRS = $(BUILD_DIR) $(BUILD_TARGET_DIR) $(BUILD_GEN_DIR) $(BUILD_VAL_DIR) $(BUILD_CHK_DIR) $(LOG_DIR) $(BUILD_IN_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR) -CXXFLAGS = -Wall -O2 -std=c++2a +CXXFLAGS = -Wall -O2 -std=c++2a GENFLAGS = -N $(N) -M $(M) -pm $(pm) SRC_MAIN_FILES = $(wildcard $(SRC_DIR)/*/main.cpp) @@ -59,10 +59,10 @@ all: $(SOLS_EXE) $(GENS_EXE) $(VAL_EXE) $(CHK_EXE) $(DIRS) $(BUILD_DIR) $(BUILD_TARGET_DIR) $(BUILD_GEN_DIR) $(BUILD_VAL_DIR) $(BUILD_CHK_DIR) $(LOG_DIR) $(BUILD_IN_DIR) $(BUILD_OUT_A_DIR) $(BUILD_OUT_B_DIR): @echo "Creating directory: $@" @mkdir -p $@ - + $(BUILD_TARGET_DIR)/%: $(SRC_DIR)/%/main.cpp | $(BUILD_TARGET_DIR) @echo "Compiling Solution $< -> $@" - $(CXX) $(CXXFLAGS) -o $@ $< + $(CXX) $(CXXFLAGS) -fsanitize=undefined,address -o $@ $< $(BUILD_GEN_DIR)/%: $(GEN_DIR)/%.cpp | $(BUILD_GEN_DIR) @echo "Compiling Generator $< -> $@" @@ -83,11 +83,14 @@ $(BUILD_IN_DIR)/input%: $(GEN_TO_RUN) | $(BUILD_IN_DIR) echo "Using Seed: $$SEED" >&2; \ ./$(GEN_TO_RUN) $(GENFLAGS) "$$SEED" > $@ -$(BUILD_OUT_A_DIR)/$(SOL_A)%.out: $(BUILD_IN_DIR)/input% $(SOL_A_EXE) | $(BUILD_OUT_A_DIR) +.PHONY: force +force: + +$(BUILD_OUT_A_DIR)/$(SOL_A)%.out: $(BUILD_IN_DIR)/input% $(SOL_A_EXE) force | $(BUILD_OUT_A_DIR) @echo "--- Running $(SOL_A) (ID: $*) ---" @time ./$(SOL_A_EXE) < $< > $@ -$(BUILD_OUT_B_DIR)/$(SOL_B)%.out: $(BUILD_IN_DIR)/input% $(SOL_B_EXE) | $(BUILD_OUT_B_DIR) +$(BUILD_OUT_B_DIR)/$(SOL_B)%.out: $(BUILD_IN_DIR)/input% $(SOL_B_EXE) force | $(BUILD_OUT_B_DIR) @echo "--- Running $(SOL_B) (ID: $*) ---" @time ./$(SOL_B_EXE) < $< > $@ diff --git a/generator/gen1.cpp b/generator/gen1.cpp index e137815..a5cef47 100644 --- a/generator/gen1.cpp +++ b/generator/gen1.cpp @@ -20,31 +20,36 @@ int main(int argc, char *argv[]) { vector cnt(n + 1, 0); for (ll i = 0; i < m; ++i) { ll s = rnd.next(1uLL, n); + if(cnt[s] == n-1) + { + i--; + continue; + } cnt[s]++; } - unordered_map selected; + unordered_map M; for (ll s = 1; s <= n; ++s) { ll k = cnt[s]; if (k == 0) continue; - selected.clear(); + M.clear(); + const ll N = n - 1; for (ll i = 0; i < k; ++i) { - ll range_size = (n - 1) - i; - ll j = rnd.next(1uLL, range_size); + ll R = N - i; + ll j = rnd.next(1uLL, R); - ll val_j = selected.count(j) ? selected[j] : j; - ll val_last = - selected.count(range_size) ? selected[range_size] : range_size; + ll val_j = M.count(j) ? M[j] : j; + ll val_last = M.count(R) ? M[R] : R; + + M[j] = val_last; ll e = (val_j < s) ? val_j : val_j + 1; + double len = rnd.next(eps, 1.0 / eps); - println(s, e, len); - - selected[j] = val_last; } } } diff --git a/src/bsb/bsb.hpp b/src/bsb/bsb.hpp index f3482f9..0c08dc3 100644 --- a/src/bsb/bsb.hpp +++ b/src/bsb/bsb.hpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -90,7 +91,9 @@ class L33 { auto nth = S.begin(); advance(nth, L - 1); - nth_element(S.begin(), nth, S.end()); + nth_element(S.begin(), nth, S.end(), [](const KV& A, const KV& B) { + return A.second < B.second; + }); advance(nth, 1); BLOCK X, Y; @@ -108,8 +111,10 @@ class L33 { blocks.erase(it_BLIST); auto it_ILIST_Y = it_ILIST; - it_ILIST->second = it_BLIST_Y; - auto it_ILIST_X = (d01 ? D0 : D1).insert(it_ILIST_Y, {ubx, it_BLIST_X}); + if (d01) UB[it_ILIST_Y->first] = it_ILIST_Y; + it_ILIST_Y->second = it_BLIST_Y; + + auto it_ILIST_X = (d01 ? D1 : D0).emplace(it_ILIST_Y, ubx, it_BLIST_X); if (d01) UB[ubx] = it_ILIST_X; @@ -135,16 +140,75 @@ class L33 { } void Insert(const KEY& a, const VALUE& b) { + // cerr<<"Turn of "< "<(val)<<' '<(val)<<' + // '<(val)<begin(); it != X->end(); it++) + // { + // auto [a, val] = *it; + // cerr<<">> "<(val)<<' '<(val)<<' + // '<(val)< "<(val)<<' '<(val)<<' + // '<(val)<second <= b) return; Delete(a); + // cerr<<"HERE I DELETE!"<(b)<<' '<(b)<<' '<(b)< "<(val)<<' '<(val)<<' + // '<(val)<second; + // cerr<<"> "<(it_UB->first)<<' '<(it_UB->first)<<' + // '<(it_UB->first)< "<(val)<<' '<(val)<<' + // '<(val)<begin(); it != X->end(); it++) + // { + // auto [a, val] = *it; + // cerr<<">> "<(val)<<' '<(val)<<' + // '<(val)<second; auto it_BLIST = it_ILIST->second; + // cerr<<"OKKOKOK"<emplace(it_BLIST->end(), a, b); + // cerr<<"OKKOKOK"<begin(); it != it_BLIST->end(); it++) { + const auto [a, b] = *it; + ptr[a] = {0, it_ILIST, it_BLIST, it}; + } + split(0, it_ILIST); } @@ -224,7 +295,13 @@ class L33 { auto nth = S.begin(); std::advance(nth, M - 1); - std::nth_element(S.begin(), nth, S.end()); + std::nth_element(S.begin(), nth, S.end(), [](const KV& A, const KV& B) { + return A.second < B.second; + }); + + // cerr<<"DEBUG S!!"<(b)<<' '<(b)<<' + // '<(b)<(b)<<' '<(b)<<' + // '<(b)<(b)<<' '<(b)<<' + // '<(b)<, vector > FindPivots(DIST B, vector S, return {P, vector(W.begin(), W.end())}; } -pair > BMSSP(ll l, vector S, DIST B, const ADJ_LIST& adj, - DIST_LIST& dist, const ll k, const ll t) { +pair > BMSSP(ll l, vector S, DIST B, + const ADJ_LIST& adj, DIST_LIST& dist, + const ll k, const ll t) { assert(S.size() <= (1uLL << (l * t))); + // cerr<<"LEVLE "< > BMSSP(ll l, vector S, DIST B, const ADJ_LIST& DIST B_ = dist[U.back()]; - unordered_set u(make_move_iterator(U.begin()), make_move_iterator(U.end())); + unordered_set u(make_move_iterator(U.begin()), + make_move_iterator(U.end())); if (U.size() <= k) return {B, u}; return {B_, u}; @@ -130,41 +135,70 @@ pair > BMSSP(ll l, vector S, DIST B, const ADJ_LIST& auto [P, W] = FindPivots(B, S, adj, dist, k, t); const ll M = (1uLL << ((l - 1) * t)); + + // cerr<<"M: "<(B)<<' '<(B)<<' '<(B)< D(M, B); for (auto i : P) D.Insert(i, dist[i]); const ll LIMIT = k * (1uLL << (l * t)); - unordered_set U; DIST B_; + // cerr<<"LIMIT: "< U; + DIST B_; while (U.size() < LIMIT && !D.empty()) { auto [Bi, Si] = D.Pull(); + // cerr<(Bi)<<' '<(Bi)<<' '<(Bi)<(Bi_)<<' '<(Bi_)<<' '<(Bi_)< K; - for(auto u : Ui) for(auto [v, len] : adj[u]) - { - if(relex(u, dist[u], len, v, dist[v])) - { - if(Bi <= dist[v] && dist[v] < B) D.Insert(v, dist[v]); - else if(Bi_ <= dist[v] && dist[v] < Bi) K.insert(v); + for (auto u : Ui) + for (auto [v, len] : adj[u]) { + // cerr< > K_; K_.reserve(K.size()); - for(auto k:K) K_.push_back({k, dist[k]}); + + vector > K_; + K_.reserve(K.size()); + for (auto k : K) K_.push_back({k, dist[k]}); + + // for(auto [s, _]: K_) cerr< "< ans(n + 1, INF); - for (ll i = 1; i <= n; i++) + ans[1] = 0; + + for (ll i = 2; i <= n; i++) if (!renum[i].empty()) ans[i] = get<0>(dist[renum[i].front()]); cout << fixed << setprecision(15);