{
if (a[i] < a[j])
tmp[k++] = a[i++];
else
tmp[k++] = a[j++];
}
while (i <= mid)
tmp[k++] = a[i++];
while (j <= r)
tmp[k++] = a[j++];
for (i = l, j = 0; i <= r; ++i, ++j)
a[i] = tmp[j];
}
整数二分模板
// 整数二分算法模板
bool check(int x) {/* … */} // 检查x是否满足某种性质
// 区间[l, r]被划分成[l, mid]和[mid + 1, r]时使用:
int bsearch_1(int l, int r)
{
while (l < r)
{
int mid = l + r >> 1;
if (check(mid)) r = mid; // check()判断mid是否满足性质
else l = mid + 1;
}
return l;
}
// 区间[l, r]被划分成[l, mid - 1]和[mid, r]时使用:
int bsearch_2(int l, int r)
{
while (l < r)
{
int mid = l + r + 1 >> 1;
if (check(mid)) l = mid;
else r = mid - 1;
}
return l;
}
浮点数二分模板
// 浮点数二分算法模板
bool check(double x) {/* … */} // 检查x是否满足某种性质
double bsearch_3(double l, double r)
{
const double eps = 1e-6; // eps 表示精度,取决于题目对精度的要求
while (r - l > eps)
{
double mid = (l + r) / 2;
if (check(mid)) r = mid;
else l = mid;
}
return l;
}
大整数加法模板
vector add(vector &a, vector &b)
{
vector c;
int up = 0;
for (int i = 0; i < a.size() || i<b.size(); ++i)
{
if (i < a.size())
up += a[i];
if (i < b.size())
up += b[i];
c.push_back(up % 10);
up /= 10;
}
while (up>0)
{
c.push_back(up % 10);
up /= 10;
}
return c;
}
大整数减法模板
给定两个正整数,计算它们的差,计算结果可能为负数。
输入格式
共两行,每行包含一个整数。
输出格式
共一行,包含所求的差。
数据范围
1≤整数长度≤105
输入样例:
32
11
输出样例:
21
#include
#include
using namespace std;
bool cmp(vector &a, vector &b)
{
if (a.size() != b.size())
return a.size() > b.size();
for (int i = a.size() - 1; i >= 0; --i)
if (a[i] != b[i])
return a[i] > b[i];
return true;
}
vector sub(vector &a, vector &b)
{
vector c;
for (int i = 0, up = 0; i < a.size(); ++i)
{
up = a[i] - up;
if (i < b.size())
up = up - b[i];
c.push_back((up