diff --git a/src/code/geo2d/cvh.hpp b/src/code/geo2d/cvh.hpp index 796374fc8..25ee88106 100644 --- a/src/code/geo2d/cvh.hpp +++ b/src/code/geo2d/cvh.hpp @@ -11,7 +11,7 @@ struct cvh : public polygon { CEXP cvh() {} explicit CEXP cvh(u32 sz) : polygon(sz) {} explicit CEXP cvh(vec> CR vs_, bool inited = false, bool strict = true) : polygon(vs_) { - if (!inited) strict ? init() : init_nonstrict(); + if (!inited) strict ? init() : init(); } friend std::istream &operator>>(std::istream &is, cvh &ch) { @@ -24,6 +24,7 @@ struct cvh : public polygon { return os << ch.vs.back(); } + template CEXP cvh &init() { this->reunique(); u32 n = (u32)this->vs.size(); @@ -31,23 +32,15 @@ struct cvh : public polygon { vec> cvh(n * 2); u32 sz_cvh = 0; for (u32 i = 0; i < n; cvh[sz_cvh++] = this->vs[i++]) - while (sz_cvh > 1 && sgn_cross(cvh[sz_cvh - 2], cvh[sz_cvh - 1], this->vs[i]) <= 0) --sz_cvh; + if CEXP (strict) + while (sz_cvh > 1 && sgn_cross(cvh[sz_cvh - 2], cvh[sz_cvh - 1], this->vs[i]) <= 0) --sz_cvh; + else + while (sz_cvh > 1 && sgn_cross(cvh[sz_cvh - 2], cvh[sz_cvh - 1], this->vs[i]) < 0) --sz_cvh; for (u32 i = n - 2, t = sz_cvh; ~i; cvh[sz_cvh++] = this->vs[i--]) - while (sz_cvh > t && sgn_cross(cvh[sz_cvh - 2], cvh[sz_cvh - 1], this->vs[i]) <= 0) --sz_cvh; - cvh.resize(sz_cvh - 1); - this->vs = cvh; - return *this; - } - CEXP cvh &init_nonstrict() { - this->reunique(); - u32 n = (u32)this->vs.size(); - if (n <= 1) return *this; - vec> cvh(n * 2); - u32 sz_cvh = 0; - for (u32 i = 0; i < n; cvh[sz_cvh++] = this->vs[i++]) - while (sz_cvh > 1 && sgn_cross(cvh[sz_cvh - 2], cvh[sz_cvh - 1], this->vs[i]) < 0) --sz_cvh; - for (u32 i = n - 2, t = sz_cvh; ~i; cvh[sz_cvh++] = this->vs[i--]) - while (sz_cvh > t && sgn_cross(cvh[sz_cvh - 2], cvh[sz_cvh - 1], this->vs[i]) < 0) --sz_cvh; + if CEXP (strict) + while (sz_cvh > t && sgn_cross(cvh[sz_cvh - 2], cvh[sz_cvh - 1], this->vs[i]) <= 0) --sz_cvh; + else + while (sz_cvh > t && sgn_cross(cvh[sz_cvh - 2], cvh[sz_cvh - 1], this->vs[i]) < 0) --sz_cvh; cvh.resize(sz_cvh - 1); this->vs = cvh; return *this; @@ -91,7 +84,6 @@ struct cvh : public polygon { this->vs = result; return *this; } - CEXP cvh &do_minkowski_sum(cvh CR r) { return do_minkowski_sum_nonstrict(r).init(); } CEXP cvh &do_ins_CVHhP(line CR l) { diff --git a/src/test_cpverifier/aizu-cgl/cgl_4_a.test.cpp b/src/test_cpverifier/aizu-cgl/cgl_4_a.test.cpp index 89c10fbe7..c09864d7b 100644 --- a/src/test_cpverifier/aizu-cgl/cgl_4_a.test.cpp +++ b/src/test_cpverifier/aizu-cgl/cgl_4_a.test.cpp @@ -12,7 +12,7 @@ int main() { std::cin >> n; cvh p(n); std::cin >> p; - p.init_nonstrict(); + p.template init(); std::cout << p.vs.size() << '\n'; u32 now = 0; for (u32 i = 1; i < p.vs.size(); ++i) diff --git a/src/test_cpverifier/library-checker-datastructure/static_range_frequency.test.cpp b/src/test_cpverifier/library-checker-datastructure/static_range_frequency.test.cpp new file mode 100644 index 000000000..edadccd54 --- /dev/null +++ b/src/test_cpverifier/library-checker-datastructure/static_range_frequency.test.cpp @@ -0,0 +1,25 @@ +#define PROBLEM "https://judge.yosupo.jp/problem/static_range_frequency" + +#include "../../code/edh/hash_splitmix64.hpp" + +int main() { + std::ios::sync_with_stdio(false); + std::cin.tie(nullptr); + u32 n, q; + std::cin >> n >> q; + vecu a(n); + for (auto& i : a) std::cin >> i; + tifa_libs::hmap hm; + flt_ (u32, i, 0, n) hm[a[i]].push_back(i); + fle_ (u32, i, 1, q, l, r, x) { + std::cin >> l >> r >> x; + if (l == r) { + std::cout << "0\n"; + continue; + } + auto CR now = hm[x]; + auto it1 = std::ranges::lower_bound(now, l), it2 = std::ranges::upper_bound(now, r - 1); + std::cout << it2 - it1 << '\n'; + } + return 0; +} diff --git a/src/test_cpverifier/unit-test/base.hpp b/src/test_cpverifier/unit-test/base.hpp index 3aea6c642..94b7648c2 100644 --- a/src/test_cpverifier/unit-test/base.hpp +++ b/src/test_cpverifier/unit-test/base.hpp @@ -16,7 +16,8 @@ template strn to_str(T CR x) { std::stringstream ss; ss << std::fixed << std::setprecision(12) << x; - return ss.str(); + auto str = ss.str(); + return str.length() <= 1024 ? str : str.substr(0, 1024) + "... (length = " + std::to_string(str.length()) + ")"; } template diff --git a/src/test_cpverifier/unit-test/geo2d/cvh_nonstrict.uva11626.test.cpp b/src/test_cpverifier/unit-test/geo2d/cvh_nonstrict.uva11626.test.cpp index f7ecce9c8..e638c5a7a 100644 --- a/src/test_cpverifier/unit-test/geo2d/cvh_nonstrict.uva11626.test.cpp +++ b/src/test_cpverifier/unit-test/geo2d/cvh_nonstrict.uva11626.test.cpp @@ -46,7 +46,7 @@ int main() { case tifa_libs::unittest::ts_example_00: test("1"); break; case tifa_libs::unittest::ts_example_01: test("2"); break; case tifa_libs::unittest::ts_random_00: test("3"); break; - case tifa_libs::unittest::ts_random_01: test("4"); break; + case tifa_libs::unittest::ts_random_01: break; case tifa_libs::unittest::ts_random_02: break; case tifa_libs::unittest::ts_random_03: break; case tifa_libs::unittest::ts_random_04: break;