摘要:
导弹防御系统 本题就是拦截导弹的dfs版 能覆盖整个序列的最少的不上升子序列的个数等价于该序列的最长上升子序列长度 能覆盖整个序列的最少的不下降子序列的个数等价于该序列的最长下降子序列长度 #include <bits/stdc++.h> using namespace std; #define I 阅读全文
摘要:
拦截导弹 题意: 最少用几个不上升子序列完全覆盖原序列. 贪心: 处理一个不下降队列, 队列中的每个数都表示我们需要求得的不上升子序列的末尾.那么最终队列有多少个数,就表示答案是多少. 为了处理出这个队列q,我们遍历原数组s,对于每一个x: 若x大于等于q中每一个数,把x放到q的末尾 否则,找到q中 阅读全文
摘要:
常量表达式是指不会改变并且在编译阶段就能得到计算结果的表达式.显然,字面值属于常量表达式,用常量表达式初始化的const对象也是常量表达式. 一个对象(或表达式)是不是常量表达式由它的数据类型和初始值共同决定,例如: const int max_file = 20; // max_files 是常量 阅读全文
摘要:
传纸条 这道题要注意的是横坐标取值范围: x + y = k => y = k - x => 1 <= y = k - x <= m => k - m <= x <= k - 1 for (int k = 2; k <= m + n; ++k) for (int x1 = max(1, k - m) 阅读全文
摘要:
方格取数 令k为横纵坐标之和, 可以省去一维. 这两遍走法是互相无影响的. 如果会同时走上同一个坐标, 这个坐标的值就只加一次就好了, 这样就表示了第二走的值为0 #include <bits/stdc++.h> using namespace std; #define IO ios::sync_w 阅读全文
摘要:
std::move 的定义 template <typename T> // typename表明type是一个类型 typename remove_reference<T>::type&& move(T&& t) { return static_cast<typename remove_refer 阅读全文
摘要:
template <typename T> void f(T &p); 函数参数p是一个模板类型参数T的引用,记住两点:编译器会应用正常的引用绑定规则; const是底层的,不是顶层的. 从左值引用函数参数推断类型 当一个函数参数是模板类型参数的一个普通(左值)引用时(即, T&),绑定规则告诉我们 阅读全文
摘要:
原题 本题每个节点存在两个懒标记add和mul用来更新区间节点的答案. 我们把区间的值sum看成sum = a * mul + add 对于modify操作 如果我们需要对一段区间的所有数乘上d, 相当于: sum = a * mul * d + add * d, 即, 我们只用修改对应mul和ad 阅读全文
摘要:
使用类的类型成员 我们通过(::)来访问static成员和类型成员. 在普通函数中,编译器掌握类的定义,因此,它知道通过作用域访问符访问的是名字还是static成员. 但对于模板代码,如T::mem它不会知道men是一个类型成员还是一个static数据成员,知道实例化时才知道. T::size_ty 阅读全文
摘要:
主要有两个操作:push_up 与 push_down. push_up 用子节点来算父节点信息,如:sum = l.sum + r.sum push_down 父节点的修改信息下传到子节点 基本操作 push_up(u) bulid() 将一段区间初始化为线段树 modify 修改 $\left 阅读全文