Did debug, but still not enough
This commit is contained in:
17
Makefile
17
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) < $< > $@
|
||||
|
||||
|
||||
@@ -20,31 +20,36 @@ int main(int argc, char *argv[]) {
|
||||
vector<ll> 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<ll, ll> selected;
|
||||
unordered_map<ll, ll> 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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@
|
||||
#include <boost/heap/fibonacci_heap.hpp>
|
||||
#include <cassert>
|
||||
#include <cmath>
|
||||
#include <iostream>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <optional>
|
||||
@@ -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 "<<a<<endl;
|
||||
// for(auto it = D1.begin(); it != D1.end(); it++)
|
||||
// {
|
||||
// auto [val, X] = *it;
|
||||
|
||||
// cerr<<"> "<<get<0>(val)<<' '<<get<1>(val)<<'
|
||||
// '<<get<2>(val)<<endl;
|
||||
|
||||
// for(auto it = X->begin(); it != X->end(); it++)
|
||||
// {
|
||||
// auto [a, val] = *it;
|
||||
// cerr<<">> "<<get<0>(val)<<' '<<get<1>(val)<<'
|
||||
// '<<get<2>(val)<<endl;
|
||||
// }
|
||||
// }
|
||||
// cerr<<"####"<<endl;
|
||||
// for(auto [val, _]: UB)
|
||||
// {
|
||||
// cerr<<"> "<<get<0>(val)<<' '<<get<1>(val)<<'
|
||||
// '<<get<2>(val)<<endl;
|
||||
// }
|
||||
// cerr<<"######"<<endl;
|
||||
if (ptr.count(a)) {
|
||||
auto [d01, it_ILIST, it_BLIST, it_B] = ptr[a];
|
||||
if (it_B->second <= b) return;
|
||||
|
||||
Delete(a);
|
||||
// cerr<<"HERE I DELETE!"<<endl;
|
||||
}
|
||||
auto it_UB = UB.lower_bound(b);
|
||||
// if(it_UB == UB.end())
|
||||
// {
|
||||
// cerr<<"Panic!"<<endl;
|
||||
// cerr<<get<0>(b)<<' '<<get<1>(b)<<' '<<get<2>(b)<<endl;
|
||||
// cerr<<UB.size()<<endl;
|
||||
// for(auto [val, _]: UB)
|
||||
// {
|
||||
// cerr<<"> "<<get<0>(val)<<' '<<get<1>(val)<<'
|
||||
// '<<get<2>(val)<<endl;
|
||||
// }
|
||||
// }
|
||||
assert(it_UB != UB.end());
|
||||
|
||||
// cerr<<"OKKOKOK"<<endl;
|
||||
auto it_ILIST = it_UB->second;
|
||||
// cerr<<"> "<<get<0>(it_UB->first)<<' '<<get<1>(it_UB->first)<<'
|
||||
// '<<get<2>(it_UB->first)<<endl;
|
||||
|
||||
// cerr<<endl;
|
||||
|
||||
// for(auto it = D1.begin(); it != D1.end(); it++)
|
||||
// {
|
||||
// auto [val, X] = *it;
|
||||
|
||||
// cerr<<"> "<<get<0>(val)<<' '<<get<1>(val)<<'
|
||||
// '<<get<2>(val)<<endl;
|
||||
|
||||
// for(auto it = X->begin(); it != X->end(); it++)
|
||||
// {
|
||||
// auto [a, val] = *it;
|
||||
// cerr<<">> "<<get<0>(val)<<' '<<get<1>(val)<<'
|
||||
// '<<get<2>(val)<<endl;
|
||||
// }
|
||||
// }
|
||||
|
||||
auto it_ILIST = UB.lower_bound(b)->second;
|
||||
auto it_BLIST = it_ILIST->second;
|
||||
// cerr<<"OKKOKOK"<<endl;
|
||||
auto it_B = it_BLIST->emplace(it_BLIST->end(), a, b);
|
||||
// cerr<<"OKKOKOK"<<endl;
|
||||
|
||||
ptr[a] = {1, it_ILIST, it_BLIST, it_B};
|
||||
|
||||
@@ -172,11 +236,18 @@ class L33 {
|
||||
tmp.push_back({a, b});
|
||||
}
|
||||
|
||||
// for(auto [a, b]: tmp) cerr<<"KEY: "<<a<<", VALUE: \n";
|
||||
|
||||
if (u == nullopt) return;
|
||||
|
||||
auto it_BLIST = blocks.emplace(blocks.end(), std::move(tmp));
|
||||
auto it_ILIST = D0.emplace(D0.begin(), u.value(), it_BLIST);
|
||||
|
||||
for (auto it = it_BLIST->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!!"<<endl;
|
||||
// for (auto [a, b] : S) cerr<<get<0>(b)<<' '<<get<1>(b)<<'
|
||||
// '<<get<2>(b)<<endl;
|
||||
|
||||
KV_LIST R(make_move_iterator(nth + 1), make_move_iterator(S.end()));
|
||||
S.resize(M);
|
||||
@@ -232,6 +309,17 @@ class L33 {
|
||||
VALUE x = R.front().second;
|
||||
for (auto [a, b] : R) x = min(x, b);
|
||||
|
||||
// cerr<<"DEBUG M!! : "<<M<<endl;
|
||||
// cerr<<"DEBUG R!!"<<endl;
|
||||
// for (auto [a, b] : R) cerr<<get<0>(b)<<' '<<get<1>(b)<<'
|
||||
// '<<get<2>(b)<<endl;
|
||||
|
||||
// cerr<<"DEBUG S!!"<<endl;
|
||||
// for (auto [a, b] : S) cerr<<get<0>(b)<<' '<<get<1>(b)<<'
|
||||
// '<<get<2>(b)<<endl;
|
||||
|
||||
// cerr<<endl;
|
||||
|
||||
BatchPrepend(R);
|
||||
|
||||
K_LIST s;
|
||||
|
||||
104
src/bsb/main.cpp
104
src/bsb/main.cpp
@@ -88,10 +88,14 @@ pair<vector<ll>, vector<ll> > FindPivots(DIST B, vector<ll> S,
|
||||
return {P, vector<ll>(W.begin(), W.end())};
|
||||
}
|
||||
|
||||
pair<DIST, unordered_set<ll> > BMSSP(ll l, vector<ll> S, DIST B, const ADJ_LIST& adj,
|
||||
DIST_LIST& dist, const ll k, const ll t) {
|
||||
pair<DIST, unordered_set<ll> > BMSSP(ll l, vector<ll> S, DIST B,
|
||||
const ADJ_LIST& adj, DIST_LIST& dist,
|
||||
const ll k, const ll t) {
|
||||
assert(S.size() <= (1uLL << (l * t)));
|
||||
|
||||
// cerr<<"LEVLE "<<l<<endl;
|
||||
// cerr<<"S: "; for(auto i:S) cerr<<i<<' '; cerr<<endl;
|
||||
|
||||
if (l == 0) {
|
||||
ll s = S.front();
|
||||
|
||||
@@ -121,7 +125,8 @@ pair<DIST, unordered_set<ll> > BMSSP(ll l, vector<ll> S, DIST B, const ADJ_LIST&
|
||||
|
||||
DIST B_ = dist[U.back()];
|
||||
|
||||
unordered_set<ll> u(make_move_iterator(U.begin()), make_move_iterator(U.end()));
|
||||
unordered_set<ll> 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<DIST, unordered_set<ll> > BMSSP(ll l, vector<ll> 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: "<<M<<endl;
|
||||
|
||||
// cerr<<"P"<<' ';
|
||||
// for(auto i:P) cerr<<i<<' ';
|
||||
// cerr<<endl;
|
||||
|
||||
// cerr<<"W"<<' ';
|
||||
// for(auto i:W) cerr<<i<<' ';
|
||||
// cerr<<endl;
|
||||
|
||||
// cerr<<get<0>(B)<<' '<<get<1>(B)<<' '<<get<2>(B)<<endl;
|
||||
|
||||
L33<ll, DIST> D(M, B);
|
||||
for (auto i : P) D.Insert(i, dist[i]);
|
||||
|
||||
const ll LIMIT = k * (1uLL << (l * t));
|
||||
|
||||
unordered_set<ll> U; DIST B_;
|
||||
// cerr<<"LIMIT: "<<LIMIT<<endl;
|
||||
|
||||
unordered_set<ll> U;
|
||||
DIST B_;
|
||||
while (U.size() < LIMIT && !D.empty()) {
|
||||
auto [Bi, Si] = D.Pull();
|
||||
// cerr<<get<0>(Bi)<<' '<<get<1>(Bi)<<' '<<get<2>(Bi)<<endl;
|
||||
// cerr<<"Si: "; for(auto i:Si) cerr<<i<<' '; cerr<<endl;
|
||||
|
||||
auto [Bi_, Ui] = BMSSP(l - 1, Si, Bi, adj, dist, k, t);
|
||||
B_ = Bi_;
|
||||
|
||||
|
||||
// cerr<<get<0>(Bi_)<<' '<<get<1>(Bi_)<<' '<<get<2>(Bi_)<<endl;
|
||||
// cerr<<"Ui: "; for(auto i:Ui) cerr<<i<<' '; cerr<<endl;
|
||||
|
||||
unordered_set<ll> 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<<u<<' '<<v<<": "<<len<<endl;
|
||||
if (relex(u, dist[u], len, v, dist[v])) {
|
||||
// cerr<<"OK!"<<endl;
|
||||
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 s:Si) if(Bi_ <= dist[s] && dist[s] < Bi)
|
||||
K.insert(s);
|
||||
for (auto s : Si)
|
||||
if (Bi_ <= dist[s] && dist[s] < Bi) K.insert(s);
|
||||
|
||||
U.merge(Ui);
|
||||
|
||||
vector<pair<ll, DIST> > K_; K_.reserve(K.size());
|
||||
for(auto k:K) K_.push_back({k, dist[k]});
|
||||
|
||||
vector<pair<ll, DIST> > K_;
|
||||
K_.reserve(K.size());
|
||||
for (auto k : K) K_.push_back({k, dist[k]});
|
||||
|
||||
// for(auto [s, _]: K_) cerr<<s<<' ';
|
||||
// cerr<<endl;
|
||||
|
||||
D.BatchPrepend(K_);
|
||||
}
|
||||
|
||||
B_ = min(B_, B);
|
||||
for(auto s:W) if(dist[s] < B_) U.insert(s);
|
||||
for (auto s : W)
|
||||
if (dist[s] < B_) U.insert(s);
|
||||
|
||||
return {B_, U};
|
||||
}
|
||||
@@ -210,23 +244,31 @@ int main() {
|
||||
}
|
||||
}
|
||||
|
||||
const ll k = floor(pow(log2(2 * m), 1.0 / 3));
|
||||
const ll t = floor(pow(log2(2 * m), 2.0 / 3));
|
||||
|
||||
const ll l = ceil((log2(2 * m) / t));
|
||||
|
||||
const int s = 1;
|
||||
|
||||
// distance,
|
||||
DIST_LIST dist(2 * m + 1, {INF, INF, -1});
|
||||
|
||||
dist[s] = {0, 0, -1};
|
||||
// for(ll s=1;s<=c;s++) for(auto [i, len]: adj[s]) cerr<<s<<" -> "<<i<<",
|
||||
// cost: "<<len<<endl;
|
||||
|
||||
const DIST Binf = {INF, -1, -1};
|
||||
auto [B_, U] = BMSSP(l, {s}, Binf, adj, dist, k, t);
|
||||
DIST_LIST dist(2 * m + 1, Binf);
|
||||
|
||||
if (!renum[1].empty()) {
|
||||
const ll k = floor(pow(log2(2 * m), 1.0 / 3)) + 2;
|
||||
const ll t = floor(pow(log2(2 * m), 2.0 / 3)) + 2;
|
||||
|
||||
const ll l = ceil((log2(2 * m) / t));
|
||||
|
||||
const ll s = renum[1].front();
|
||||
|
||||
// cerr<<"k: "<<k<<" t: "<<t<<" l: "<<l<<endl;
|
||||
|
||||
dist[s] = {0, 0, -1};
|
||||
|
||||
auto [B_, U] = BMSSP(l, {s}, Binf, adj, dist, k, t);
|
||||
}
|
||||
|
||||
vector<double> 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);
|
||||
|
||||
Reference in New Issue
Block a user