杂项
开头
#include <bits/stdc++.h>
using i64 = long long;
using u64 = unsigned long long;
using u32 = unsigned;
using u128 = unsigned __int128;
using i128 = __int128;
int128 库函数自定义
/** int128 库函数自定义
* 2024-08-14: https://ac.nowcoder.com/acm/contest/view-submission?submissionId=70979004&returnHomeType=1&uid=329687984
* 2024-09-17: https://qoj.ac/submission/571481
**/
using i128 = __int128;
std::ostream &operator<<(std::ostream &os, i128 n) {
if (n == 0) {
return os << 0;
}
std::string s;
while (n > 0) {
s += char('0' + n % 10);
n /= 10;
}
std::reverse(s.begin(), s.end());
return os << s;
}
i128 toi128(const std::string &s) {
i128 n = 0;
for (auto c : s) {
n = n * 10 + (c - '0');
}
return n;
}
i128 sqrti128(i128 n) {
i128 lo = 0, hi = 1E16;
while (lo < hi) {
i128 x = (lo + hi + 1) / 2;
if (x * x <= n) {
lo = x;
} else {
hi = x - 1;
}
}
return lo;
}
i128 gcd(i128 a, i128 b) {
while (b) {
a %= b;
std::swap(a, b);
}
return a;
}
常用库函数重载
using i64 = long long;
using i128 = __int128;
/** 上取整下取整
* 2023-10-15: https://codeforces.com/contest/293/submission/228297248
**/
i64 ceilDiv(i64 n, i64 m) {
if (n >= 0) {
return (n + m - 1) / m;
} else {
return n / m;
}
}
i64 floorDiv(i64 n, i64 m) {
if (n >= 0) {
return n / m;
} else {
return (n - m + 1) / m;
}
}
/** 最大值赋值
* 2023-09-30: https://codeforces.com/contest/1874/submission/226069129
**/
template<class T>
void chmax(T &a, T b) {
if (a < b) {
a = b;
}
}
/** 最大公约数
* -: -
**/
i128 gcd(i128 a, i128 b) {
return b ? gcd(b, a % b) : a;
}
/** 精确开平方
* 2024-03-02: https://qoj.ac/submission/343317
**/
i64 sqrt(i64 n) {
i64 s = std::sqrt(n);
while (s * s > n) {
s--;
}
while ((s + 1) * (s + 1) <= n) {
s++;
}
return s;
}
/** 精确开平方
* 2023-09-19: https://qoj.ac/submission/183430
**/
i64 get(i64 n) {
i64 u = std::sqrt(2.0L * n);
while (u * (u + 1) / 2 < n) {
u++;
}
while (u * (u - 1) / 2 + 1 > n) {
u--;
}
return u;
}
/** 求 Log
* 2024-07-23: https://codeforces.com/contest/1995/submission/272110180
**/
int logi(int a, int b) {
int t = 0;
i64 v = 1;
while (v < b) {
v *= a;
t++;
}
return t;
}
int llog(int a, int b) {
if (a <= b) {
int l = logi(a, b);
return (l == 0 ? 0 : std::__lg(2 * l - 1));
}
int l = logi(b, a + 1) - 1;
assert(l > 0);
return -std::__lg(l);
}
字符调整
/** 大小写转换、获取字母序
* 2024-03-16: https://qoj.ac/submission/355156
**/
void rev(std::string &s) {
int l = s.size();
for (int i = 1; i < l; i += 2) {
if (std::isupper(s[i])) {
s[i] = std::tolower(s[i]);
} else {
s[i] = std::toupper(s[i]);
}
}
}
int get(char c) {
int x;
if (std::islower(c)) {
x = c - 'a';
} else {
x = 26 + c - 'A';
}
return x;
}
二分算法
二分算法(整数域)
/** 二分算法(整数域): 前驱
* 2023-09-18: https://qoj.ac/submission/182628
**/
int lo = 1, hi = 1E9;
while (lo < hi) {
int m = (lo + hi + 1) / 2;
if (check(m)) {
lo = m;
} else {
hi = m - 1;
}
}
std::cout << lo << "\n";
/** 二分算法(整数域):后继
* 2023-09-18: https://qoj.ac/submission/182752
**/
int lo = 1, hi = n;
while (lo < hi) {
int m = (lo + hi) / 2;
if (check(m)) {
hi = m;
} else {
lo = m + 1;
}
}
std::cout << lo << "\n";
二分算法(实数域)
/** 二分算法(实数域)
* 2023-10-21: https://qoj.ac/submission/222042
**/
auto check = [&](double t) {
// write
};
double lo = 0;
double hi = 1E12;
while (hi - lo > std::max(1.0, lo) * eps) {
double x = (lo + hi) / 2;
if (check(x)) {
hi = x;
} else {
lo = x;
}
}
std::cout << lo << "\n";
/** 二分算法(实数域)
* 2023-09-15: https://qoj.ac/submission/179994
**/
using i64 = long long;
using real = long double;
constexpr real eps = 1E-7;
auto get = [&](const auto &f) {
real lo = -1E4, hi = 1E4;
while (hi - lo > 3 * eps) {
real x1 = (lo + hi - eps) / 2;
real x2 = (lo + hi + eps) / 2;
if (f(x1) > f(x2)) {
lo = x1;
} else {
hi = x2;
}
}
return f((lo + hi) / 2);
};
std::cout << get([&](real px) {
return get([&](real py) {
// write
});
}) << "\n";