首页 > 编程语言 >OI 笔记:A - 基础算法

OI 笔记:A - 基础算法

时间:2022-12-19 10:33:30浏览次数:38  
标签:OI int long times 算法 笔记 ans s64 mathrm

A - 基础算法 语言基础

语言基础

编译指令

  • -std=c++11:c++11 标准。
  • -O2:O2 优化。
  • -Wl,--stack=1280000000:开栈。
  • -Wall:显示所有警告。
  • -Wextra:检测可疑代码并生成警告。
  • -Wconversion:转型警告。

数值范围

  • int 范围:\(< 2^{31}\)。
  • unsigned int 范围:\(< 2^{32}\)。
  • long long 范围:\(< 2^{63}\)。
  • unsigned long long 范围:\(< 2^{64}\)。

自然溢出

  • unsigned int 自然溢出:对 \(2^{32}\) 取模。
  • unsigned long long 自然溢出:对 \(2^{64}\) 取模。

输出格式

  • unsigned int 输出格式:%u
  • unsigned long long 输出格式:%llu

C++ STL

lower_bound & upper_bound

  • lower_bound(s, t, val):指向 \([s, t)\) 中第一个 \(\geq \mathrm{val}\) 的元素的迭代器,需要保证 \([s, t)\) 升序排序。
  • upper_bound(s, t, val):指向 \([s, t)\) 中第一个 \(> \mathrm{val}\) 的元素的迭代器,需要保证 \([s, t)\) 升序排序。

sort

升序排序(默认)sort(s, t)

降序排序sort(s, t, greater<int>())

vector

  • vector 编号从 \(0\) 开始。
  • vector<int> num(n):指定该容器大小为 \(n\)。
  • vector<int> num(n, m):指定该容器大小为 \(n\),初始值均为 \(m\)。

区间计数 upper_bound(V.begin(), V.end(), r) - lower_bound(V.begin(), V.end(), l)

priority_queue

大根堆(默认)priority_queue<int> q

小根堆priority_queue< int, vector<int>, greater<int> > q

multiset

升序排序(默认)multiset<int> s

降序排序multiset< int, greater<int> > s

  • s.erase(val):将所有数值为 \(\mathrm{val}\) 的元素删除,返回被删除的元素个数。
  • s.erase(pos):将迭代器 \(\mathrm{pos}\) 指向的元素删除。
  • 在 multiset 中删除一个数值为 \(\mathrm{val}\) 的元素,应执行 s.erase(s.find(val))
  • 使用 multiset 维护多关键字的数据,在重载小于号时,应保证两个不同的元素能被有效区分。

bitset

  • bitset 编号从 \(0\) 开始。
  • bitset 可以进行各种二进制操作,如取反 ~、与 &、或 |、异或 ^、左移 <<、右移 >>
  • b.count():返回 \(1\) 的个数。
  • b.any():查询 bitset 中是否存在 \(1\)。
  • b.none():查询 bitset 中是否全 \(0\)。
  • b.set():将所有位改为 \(0\)。
  • b.reset():将所有位改为 \(1\)。
  • b._Find_first():查询低位到高位第一个 \(1\) 的位置。
  • b._Find_next():查询当前位置之后下一个 \(1\) 的位置。

A - 基础算法 算法基础

I/O 优化

读入优化

template <class &T>
inline void read(T &x) {
	static char s;
	static bool opt;
	while (s = getchar(), (s < '0' || s > '9') && s != '-');
	x = (opt = s == '-') ? 0 : s - '0';
	while (s = getchar(), s >= '0' && s <= '9') x = x * 10 + s - '0';
	if (opt) x = ~x + 1;
}

快速乘

\(\mathcal{O}(\log n)\) 快速乘

特别要注意的是,模数大小的两倍不能超过 long long 上界。

typedef long long s64;
s64 qmul(s64 a, s64 b, s64 p) {
	s64 ans = 0;
	for (; b; b >>= 1) {
		if (b & 1) ans = (ans + a) % p;
		a = 2 * a % p;
	}
	return ans;
}

\(\mathcal{O}(1)\) 快速乘

注意到:

\[a \times b \bmod p = a \times b - \left\lfloor \frac{a \times b}{p} \right\rfloor \times p \]

利用 long double 来处理 \(\left\lfloor \frac{a \times b}{p} \right\rfloor\)。

虽然 \(a \times b\) 和 \(\left\lfloor \frac{a \times b}{p} \right\rfloor \times p\) 的数值可能很大,但是两者的差一定在 \([0, p)\) 之间,我们只关心它们的前 64 位即可,这正好可以用 long long 运算的自然溢出来处理。

typedef long long s64;
s64 qmul(s64 a, s64 b, s64 p) {
	s64 c = (long double)a * b / p + 1e-8;
	s64 ans = a * b - c * p;
	if (ans < 0) ans += p;
	if (ans >= p) ans -= p;
	return ans;
}

快速幂

int qpow(int a, int b, int p) {
	int ans = 1;
	for (; b; b >>= 1) {
		if (b & 1) ans = 1ll * ans * a % p;
		a = 1ll * a * a % p;
	}
	return ans;
}

二分

  • >> 1 向下取整,/2 向零取整。
  • 在整数域上进行二分时:
    • 若分成的区间为 \([l, \mathrm{mid}], [\mathrm{mid} + 1, r]\),mid = (l + r) >> 1
    • 若分成的区间为 \([l, \mathrm{mid} - 1], [\mathrm{mid}, r]\),mid = (l + r + 1) >> 1
  • 在实数域上进行二分时,mid = (l + r) / 2

二叉树

\(n_0\) 与 \(n_2\) 的关系:\(n_0 = n_2 + 1\)。

证明:

  • 一方面

\[n = n_0 + n_1 + n_2 \]

  • 另一方面

\[n = 1 + n_1 + 2n_2 \]

标签:OI,int,long,times,算法,笔记,ans,s64,mathrm
From: https://www.cnblogs.com/cjtcalc/p/16948348.html

相关文章

  • OI 笔记:C - 数学知识
    C-数学知识数学分析参考教材:数学分析教材,常庚哲/史济怀编著,中国科学技术大学出版社出版。3.1:导数的定义定义3.1.1:若函数\(f\)在点\(x_0\)的近旁有定义,且极......
  • 【算法训练营day22】LeetCode235. 二叉搜索树的最近公共祖先 LeetCode701. 二叉搜索树
    LeetCode235.二叉搜索树的最近公共祖先题目链接:235.二叉搜索树的最近公共祖先初次尝试利用二叉搜索树的性质,迭代法即可,判断目标节点的值是否在当前节点值的两侧或与当......
  • delphi D11编程语言手册 学习笔记(P424-477) 泛型
      这本书可以在Delphi研习社②群256456744的群文件里找到.书名:Delphi11AlexandriaEdition.pdf 泛型在C++中叫做类型模板(templateclasses),单从字面上理......
  • Ynoi 切(受)题(虐)记录
    防止忘记做法大致按照切题顺序简略写一下思路,同时造福一下社会。(不过我怀疑大概只有我能看懂我自己写的。)缓慢更新。P4119[Ynoi2018]未来日记最初分块。人生第一道......
  • android view
    ReactNative已经封装了大部分最常见的组件,譬如ScrollView和TextInput,但不可能封装全部组件。在这个例子里,我们来看看为了让JavaScript中可以使用ImageView,需要做哪些......
  • [常用工具] shell脚本快速入门笔记
    Shell是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell脚本(shellscript),是一种为shell编写的脚本程序。业界所说的shell通常都是指shell脚本,但要知道,sh......
  • [编程基础] Python字符串替换笔记
    Python字符串替换笔记Python字符串替换笔记主要展示了如何在Python中替换字符串。Python中有以下几种替换字符串的方法,本文主要介绍前三种。replace方法(常用)translate......
  • [机器学习] sklearn朴素贝叶斯算法
    朴素贝叶斯算法是来利用统计学中的条件概率来进行分类的一种算法。贝叶斯定理和特征条件独立假设就是朴素贝叶斯的两个重要理论基础。贝叶斯定理贝叶斯定理如下:因此上......
  • P7710 [Ynoi2077] stdmxeypz 题解
    对@LHFdalao的题解进行一些补充说明。因为他讲的实在是太难懂了。最后在@_•́へ•́╬_dalao的帮助下才勉强知道怎么做。不过他的代码非常简洁易懂,有需求的可以去看......
  • selenium借助AutoIt识别上传(下载)详解
    AutoIt目前最新是v3版本,这是一个使用类似BASIC​​脚本语言​​​的​​免费软件​​​,它设计用于Windows GUI(​​图形用户界面​​)中进行自动化操作。它利用模拟键盘......