【笔记】杂
主要是一些值得一提,但是没必要单独写成一篇的东西
函数 next_permutation (库 algorithm )。令限定下标范围内排列成字典序次大的排列。
int A[6]={0, 1, 4, 5, 2, 3};
char S[6] = {'i', 'a', 'm', 'z', 'y', 'h'};
do {
for (int i=1; i<=N; i++) printf("%d ", A[i]); puts("");
} while (next_permutation(A+1, A+N+1));
do {
printf("%s\n", S);
} while (next_permutation(S, S+3));
另外还有 prev_permutation
中缀表达式转后缀表达式
luoguP1175 表达式的转换
用两个栈 A, B 维护,A 存放最终答案
扫一遍表达式,遇到数字丢进 A ,遇到符号考虑:
- ( :直接丢进 B
- ):弹出 B 的元素并压入 A 直到遇到 ( ,然后弹出该 (
- 运算符(如 +-*/^ ) :弹出 B 中优先级大等于当前运算符的并压入 A ,或直到遇到 ( ,然后向 B 压入当前运算符(即保证 B 栈中运算符自底向上严格递增)
最后弹出 B 中剩余元素并压入 A
双指针
可能对除我外大多数人来说都是经典题吧(
首先能用双指针:满足单调性,即,对于当前已经确定的一个指针(左),另一个指针(右)当前的位置是最严格的,往其“右方”移动必定仍满足条件(于是能快速统计答案);此外,当那个左指针向右移动时,右指针至少不会向左移动;
你还得考虑你这个双指针用在什么地方了
比如题目给的限制,比如一类“最大最小值之差”问题
例题:
CF1555E Boring Segments :“最大最小值”
CF1167E Range Deleting :就是双指针,另外注意这个初始化操作

浙公网安备 33010602011771号