Skip to content

Commit

Permalink
4.4
Browse files Browse the repository at this point in the history
  • Loading branch information
dtcxzyw committed Apr 4, 2019
1 parent 24fa90b commit faf6d08
Show file tree
Hide file tree
Showing 18 changed files with 608 additions and 38 deletions.
12 changes: 4 additions & 8 deletions Queue.md
Original file line number Diff line number Diff line change
Expand Up @@ -356,7 +356,7 @@
- [ ] Codeforces 786E ALT
# 分块及按大小分类
- [x] LOJ#6277-6285
- [ ] bzoj2741
- [x] bzoj2741
- [ ] bzoj3463
# 插头dp
- [x] P5056 【模板】插头dp
Expand All @@ -373,12 +373,9 @@
- [ ] LOJ#2049. 「HNOI2016」网络
- [ ] LOJ#2056. 「TJOI / HEOI2016」序列
- [x] Luogu P3206
- [ ] bzoj2989 数列
- [ ] bzoj2141
- [x] bzoj2989 数列
- [ ] bzoj2961
- [ ] bzoj3236
- [ ] bzoj3295
- [ ] bzoj3672
# 2-SAT
- [ ] LOJ#571. 「LibreOJ Round #11」Misaka Network 与 Accelerator
- [ ] LOJ#2155. 「POI2011 R1」同谋者 Conspiracy
Expand Down Expand Up @@ -492,8 +489,7 @@
- [ ] bzoj2458
- [ ] bzoj3745
- [ ] bzoj3984
- [ ] bzoj4184
- [ ] bzoj4311
- [x] bzoj4311
- [ ] bzoj4456
# BM 算法
- [ ] LOJ#2981. 「THUSCH 2017」如果奇迹有颜色
Expand Down Expand Up @@ -550,6 +546,7 @@
- [ ] CF603E Pastoral Oddities
- [ ] bzoj2527
- [ ] bzoj2738
- [x] BZOJ3110
# 博弈论
- [ ] LOJ#524. 「LibreOJ β Round #4」游戏
- [ ] LOJ#531. 「LibreOJ β Round #5」游戏
Expand All @@ -573,7 +570,6 @@
- [ ] P3673 小清新计数题
# 二进制分组
- [ ] CF710F String Set Queries
- [ ] bzoj2989 数列
- [ ] bzoj4140
# 矩阵快速幂
- [x] [JLOI2015]有意义的字符串
Expand Down
65 changes: 64 additions & 1 deletion Review/Backmatter.tex
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ \section{初稿}
该笔记在内容上还是较为完整的,在接下来的时间内我会在巩固的过程中继续学习并补充新的高级算法
/数据结构,以应战省选和NOI2019。

在我作为D类队员参加了NOI2018现场赛后,我发现了自己的严重问题——知识点掌握不扎实,
在我作为D类队员参加了NOI2018现场赛后,我发现了自己的严重问题------知识点掌握不扎实,
导致我没能拿到该得的分数。所以我决定自己写一写复习笔记来建立出一套自己的思维体系。

同时作为目前校内在OI道路上走的最远的人(其他人初赛都过不了。。。孤单),我没有
Expand Down Expand Up @@ -165,3 +165,66 @@ \section{二轮复习}
比赛在即,我要更加努力。

THUWC2019\&WC2019\&FJOI2019 Round 1加油!!!

\section{三轮复习}
2019年4月4日

一轮更比一轮咕。

这三个月来我对该笔记做了大量修改,主要内容如下:

\begin{itemize}
\item 补充了一些学习计划外的技巧(\CJKsout{需求刺激进步})
\item \CJKsout{升级了Checker}
\item \CJKsout{将某些连自己都看不懂的文字表述修改为
将来的我看不懂的文字表述}
\item 准备对解题思路程序化,添加了几类问题的系统解题思路。
未来可能会做思维导图?
\end{itemize}

再记一下上一轮复习牵挂的事:

\begin{itemize}
\item THUWC2019:进了面试,口语测试体验极差(\CJKsout{老师你刚才只叫我读啊,
我就一个单词一个单词地念啊。老师:好了你可以出去了。}),拿到了神奇的三等约:
再来一次。
\item WC2019:冬眠营果然名不虚传,我从去广州开始一直睡到了FJWC2019。考试体验
极差,交互题暴零又让我拿了一次Cu(要是CTSC2018没有Day3我就可以达成集齐NOI系列
赛事Cu的成就了,可惜今年为了不浪费时间没报CTSC和APIO)。考试前还被去年CTSC/APIO
的室友嘲笑了一番:你怎么看起来这么落寞啊。在考试前知道了他去年PKUWC已经签了无条件
本一,进考场时心里很不是滋味。
\item FJOI2019 Round 1:鸽到和FJOJ2019 Round 2一起进行,还有一个星期左右。
不过从FJWC2019的模拟成绩来看,我连D类都够不着。
\item 她:与我不再有任何联系,不过看她的学习和生活没有受到任何影响我也就放心了。
\end{itemize}

接下来的计划:
\begin{itemize}
\item 完成系统解题思路梳理,把会的东西全部挂上去,不熟的东西舍弃掉。
\item 继续按照专题刷题。
\item 从头开始Review(下一次后记的时间会不会咕到退役?)。
\item 省选后开始看集训队论文。
\item 刷各大赛事的题目。
\end{itemize}

她离开后我感觉心里空落落的,有开心的事没有人分享,受到了打击也没有人安慰。再加上这一个
月多都在家里,每天除了吃饭睡觉散步,其它时间都待在电脑面前,一天没说几句话。我感觉自己
快要疯了,白天有时会摸鱼看新闻写Checker,晚上有时候写题写到一点多(有时在写Checker),
在自己房间里会颓废看视频,会一个人和自己用记事本聊天,会一个人缩在被子里泣\CJKsout{
(《水浒传》~第二十五回~王婆计啜西门庆~淫妇药鸩武大郎:看官听说:原来但凡世上妇人,哭有
三样:有泪有声谓之哭,有泪无声谓之泣,无泪有声谓之号。)}。我不知道再这样下去自己的生理
和心理会不会崩溃,写初稿的第一个月自己可不是这样的。只能强制自己死撑了,崩溃了也算是一种
解脱,只是感觉对不起身边对自己寄予厚望的人们。好怀念那一个月的时光啊,那可能是我最幸福
也是最痛苦的回忆了。

对于她的行为,我不能理解,无法接受,但是必须尊重。一年后的生日礼物按照计划准备,但自己
不想再打扰她,还是自己保存着吧。对于自己的感情,认识她之前我就已经跟自己讲得很清楚,只能
按照自己的承诺继续等。虽然复合的希望渺茫(我也不知道即使她愿意复合,我会不会再次信任她),
但这种来自直觉的决策应该是正确的,我等她两年。

感觉自己离开课堂好久了,有点厌学,根本不知道老师到底在讲什么,我已经没有退路了。
moe又在今年开始缩减自主招生规模,提高要求,更是把我逼到绝境。要是像室友那样早一年
进入面试,或许自己就不会遭受这么多打击了。看着他签了无条件本一后一脸轻松的样子,自己
很是羡慕,这两年省排名在自己左右的人基本都签了,就我只有一张废纸。

目前还有两次机会,我希望自己也能有一个True Ending。
6 changes: 5 additions & 1 deletion Review/CG/Base.tex
Original file line number Diff line number Diff line change
Expand Up @@ -206,12 +206,16 @@ \subsection{pick定理}
该多边形的面积为$a-\frac{b}{2}+1$
\end{theorem}
\subsection{切比雪夫距离}
切比雪夫距离是两点坐标之差的最小值。
切比雪夫距离是两点坐标之差绝对值的最大值。

分别考虑到原点曼哈顿距离和切比雪夫距离为1的点$P,Q$
发现将$P$绕原点旋转$45^\circ$再缩放$\sqrt{2}$倍后等于$Q$

因此$P(x,y)\rightarrow Q(x+y,x-y)$$Q(x,y)
\rightarrow P(\frac{x+y}{2},\frac{x-y}{2})$\CJKsout{忽然联想到FWTxor。}

对于到某点的曼哈顿距离$\leq k$的限制,可以变换坐标系将其转化为到该点的切比雪夫距离
$\leq k$,由此将斜的正方形转化为与坐标轴对齐的正方形,更好统计。
\subsection{精度处理}
一般引入$eps=1e-8$来避免精度问题。

Expand Down
2 changes: 1 addition & 1 deletion Review/GameTheory/SGFunction.tex
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ \section{SG函数与SG定理}
\subsection{适用范围}

一切Impartial Combinatorial Games都等价于Nim游戏,可以使用SG函数
解决。\index{I!Impartial Combinatorial\\ Games}
解决。\index{I!Impartial Combinatorial Games}

该类游戏拥有如下特征:\footnote{参见 Impartial game - Wikipedia
\url{https://en.wikipedia.org/wiki/Impartial_game}}
Expand Down
2 changes: 1 addition & 1 deletion Review/Main.tex
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
}
\usepackage{amssymb}
\usepackage{amsmath}
\usepackage[hyperfootnotes=true]{hyperref}
\usepackage[unicode,pdftitle=OI知识点复习笔记,pdfauthor=dtcxzyw,colorlinks=true,linkcolor=black,hyperfootnotes=true,CJKbookmarks=true]{hyperref}
\usepackage{tabularx}
\usepackage{url}
\usepackage{makeidx}
Expand Down
2 changes: 1 addition & 1 deletion Review/Optmize/OptmizeMethod.tex
Original file line number Diff line number Diff line change
Expand Up @@ -159,7 +159,7 @@ \subsection{拉格朗日乘子法}
\lstinputlisting{Source/Source/Optmize/LOJ2671.cpp}

\subsubsection{KKT条件}
\index{K!Karush–Kuhn–Tucker\\ Conditions}
\index{K!Karush–Kuhn–Tucker Conditions}
KKT条件是拉格朗日乘子法的扩展,用于求解不等式约束下的最优化问题。

看上去不太好求解,留坑待补。
Expand Down
11 changes: 7 additions & 4 deletions Review/Other/Owys.tex
Original file line number Diff line number Diff line change
Expand Up @@ -75,10 +75,12 @@ \subsection{基于硬件的优化}
因为Cache会存储额外信息。
\item 寻址优化:高维数组寻址时使用指针代替。
\item Cache优化:在性能敏感的地方,使用指针存储儿子(当然还要考虑if判断
nullptr的开销)。
nullptr的开销,当然也可以使用)。
\item 尽可能使用引用而不是指针:当派生类有多个基类,在继承体系中向上转型时,
由于空引用是非法的,程序只要计算指针的偏移;由于允许存在空指针,根据规定,空指针
向上转型后仍然是空指针,需要一次特判。
\item 手写位运算代替乘除法:有时编译器为了符合标准需要做一些额外工作。
\item 使用最高效的整型:比如用int代替bool,或者使用C++11新增的int\_fastXX\_t
\end{itemize}
\subsection{位运算}\label{Bitwise}
\subsubsection{符号判断}
Expand Down Expand Up @@ -177,7 +179,7 @@ \subsection{搜索优化}
\end{itemize}
\subsection{数组清零}
\begin{itemize}
\item 整个数组的清零可以使用memset,因为它的实现可能有循环展开/SIMD优化。
\item 整个数组的清零可以使用memset,因为它的实现一般有循环展开/SIMD优化。
\item 若仅修改整个数组的部分数据,可以重新扫一遍修改时的数据,撤销修改操作/
直接将对应位置置0(这会影响到算法时间复杂度,尤其是对于Dsu On Tree/cdq分治);
\item 对于树状数组,在模拟树状数组修改算法置零时,若当前值为0,则直接退出,因为
Expand Down Expand Up @@ -220,6 +222,7 @@ \subsection{读入优化}

若需要输入浮点数,直接调用strtod,然后用其参数str\_end重定位。若需要输入输出浮点数,
可以使用支持自定义buffer的std::strstream,不过要注意这个类在C++98中已被弃用。
也可以考虑使用sprintf。

Update:经过单步调试追踪到strtod在glibc中实现。其具体实现在
\_\_\_\_STRTOF\\\_INTERNAL(/stdlib/strtod\_l.c)中,其实现依赖GMP,性能。。。。
Expand All @@ -234,13 +237,13 @@ \subsection{快速乘法取模}

还有一个无法严格证明正确性的trick:将$a*b\%mod$表示为$a*b-\lfloor a/mod*b\rfloor*mod$
其中$floor$内部使用long double计算。$floor$操作直接使用强制转型,因为$a/mod*b$就在
long long的表示范围内。由于最终结果在范围内,两个乘法事实上计算的是模$2^64$意义下的乘法,
long long的表示范围内。由于最终结果在范围内,两个乘法事实上计算的是模$2^{64}$意义下的乘法,
暂时溢出并没有关系。

实现代码:
\begin{lstlisting}
typedef long long Int64;
Int64 mulmB(Int64 a, Int64 b) {
Int64 mulm(Int64 a, Int64 b) {
Int64 res =
(a * b -
static_cast<Int64>(
Expand Down
30 changes: 17 additions & 13 deletions Review/Other/TricksAndIdeas.tex
Original file line number Diff line number Diff line change
Expand Up @@ -174,7 +174,7 @@ \subsubsection{树分块}
}。
\subsubsection{平衡修改与查询的复杂度}
例如对于规模为$n$的元素,修改复杂度为$O(n\lg n)$(比如暴力重建),而查询复杂度
$O(\lg n)$。此时可以考虑每$\sqrt{n}$个元素分块,修改/查询复杂度均为
$O(\lg n)$。此时可以考虑每$\sqrt{n}$个元素分块,单次修改/查询复杂度均为
$O(\sqrt{n}\lg n)$
\subsection{MITM}
\index{M!Meet In The Middle}
Expand All @@ -201,6 +201,10 @@ \subsection{扫描线}
若某条件仅存在于一个区间/时间段中,则可在起点与终点的后一点处打添加/删除标记,
查询时先处理完当前时间的所有添加/删除的标记,再计算答案。
对于一些计算几何题也可以考虑使用该方法。

\subsubsection{逆扫描线}
若需要维护每个时间段内元素集合的信息,带有插入和删除操作,可以考虑将其看做元素存在于
一段时间区间,使用线段树(分治)维护区间插入。
\subsection{差分}
\begin{itemize}
\item 对于离线区间加法,可以在起点与终点后一点处打标记,最后做一遍前缀和。
Expand All @@ -221,7 +225,7 @@ \subsection{优先队列维护长序列}\label{PQS}

更加形式化的描述:这些方案构造出了一个DAG,如果某个方案被选中,它的前驱必定被选中。
每次选取一个方案后将它的后继加入优先队列。如果这个DAG是一棵树,就不需要去重,最好构造
出可树型转移的方案表示
出可树形转移的方案表示

\subsection{集合选数最值问题}
\subsubsection{类型一}
Expand All @@ -240,8 +244,8 @@ \subsubsection{类型一}
\item 改变下一个集合:若$i<n,2\leq |S_{i+1}|$,存在后继
$(i+1,2,s-A[i+1][1]+A[i+1][2])$
\item 注意到变换下一个集合时当前集合选择的数肯定不是最大值,但存在这种方案。
所以指定当$j=2,i<n2\leq |S_{i+1}|$时当前集合选择最大值,然后改变下一个集合。
即存在后继$(i+1,2,s-A[i][2]+A[i][1]-A[i+1][1]+A[i+1][2]$。此时并不能保证
所以指定当$j=2,i<n,2\leq |S_{i+1}|$时当前集合选择最大值,然后改变下一个集合。
即存在后继$(i+1,2,s-A[i][2]+A[i][1]-A[i+1][1]+A[i+1][2])$。此时并不能保证
其后继不大于前驱,对集合以$A[i][1]-A[i][2]$为关键字升序排序就可以解决这个问题。
\end{itemize}

Expand Down Expand Up @@ -310,6 +314,8 @@ \subsection{整体二分}
将其分为2个集合;
\item 递归分治左右集合。
\end{enumerate}

注意修改与查询之间也是有时间先后关系的,可以调用std::stable\_partition完成稳定划分。
\subsection{cdq分治}\label{CDQ}
cdq分治用来解决偏序问题(支持动态偏序问题,但仍然要求离线)。

Expand Down Expand Up @@ -337,9 +343,9 @@ \subsection{启发式合并}
\subsection{启发式分治}
区间$[l,r]$是否符合条件与区间的特殊值相关,求符合条件的区间数。

如果区间中的某个数的特殊性可以决定跨越它的区间的是否符合条件,那么就可以
如果区间中的某个数的特殊性可以决定跨越它的区间是否符合条件,那么就可以
从两边开始向中间寻找这个数,然后递归处理被划分的两个区间。每次划分的复杂度取决于
左右两端那端更快找到特殊值,时间复杂度$O(n\lg n)$。实际时间复杂度还取决与跨数
左右两端哪端更快找到特殊值,时间复杂度$O(n\lg n)$。实际时间复杂度还取决与跨数
区间的处理复杂度,一般使用可持久化数据结构预处理整个区间,然后枚举较小区间的端点
查询与较大区间的贡献,一般时间复杂度$O(n\lg^2 n)$

Expand Down Expand Up @@ -379,9 +385,6 @@ \subsection{注意事项/常见转化/思想}
逆序对-最大覆盖数*2(可非相邻交换1次与减少1对逆序对抵消)。
\item 「LibreOJ Round \#11」Misaka Network 与任务:需要大量同指数快速幂且已知
底数范围时使用线性筛预处理。
\item 「Antileaf's Round」咱们去烧菜吧:将多项式乘积转换为ln求和,最后做一次exp。
,ln可以使用泰勒展开直接填充,但要注意合并同类项保证$O(n\lg n)$的复杂度。
简单生成函数之积的计算考虑两边取ln!!!
\item 解题时先考虑不带修改的情况。
\item 利用时间存储数据。
\item THUWC2019 D2T1:对于统计树上所有路径的权值和问题,除了点分治外,一个比较简单
Expand Down Expand Up @@ -423,7 +426,7 @@ \subsection{注意事项/常见转化/思想}
\item 矩阵快速幂时若时间复杂度不优则观察矩阵的性质。
\item 与排序有关的问题:考虑枚举某个数$x$,将整个序列表示为01序列。序列在全局下有序,说明相邻的数
之间都是有序的。
\item 「HAOI2018」字串覆盖:根据数据范围提示讨论子串大小,不重复子串长则出现次数少,分两种情况使用
\item 「HAOI2018」字串覆盖:根据数据范围提示讨论子串大小,不重叠子串长则出现次数少,分两种情况使用
不同方法处理。「雅礼集训 2017 Day1」字符串:$k*q$小于等于定值$1e5$,并且当$k$较小与$q$较小时都有
较优的做法,分情况处理。一般来说,若存在两个量的乘积不超过定值,并且存在两种高效算法分别主要与这两个
量有关,那么就可以考虑对询问分类处理。
Expand Down Expand Up @@ -458,8 +461,8 @@ \subsection{注意事项/常见转化/思想}
\item 树上某点的儿子的子树大小只有$O(\sqrt{n})$种,可以合并以优化复杂度。
\item 边在满足指定条件时连通:
\begin{itemize}
\item 单向限制+强制在线:重构树
\item 双向限制+可离线:扫描线+LCT
\item 单向限制$(w\leq a)$+强制在线:重构树
\item 双向限制$(a\leq w \leq b)$+可离线:扫描线+LCT
\end{itemize}
\item 连通块计数
\begin{itemize}
Expand Down Expand Up @@ -530,13 +533,14 @@ \subsubsection{代码注意事项}
\item std::set的插入最好使用hint与区间。
\item (分段)打表时注意源代码不能超过100KB。
\item 不要使用std::bitset的set与test,它们会执行越界检查。不过operator[]的性能
尚未验证,因为它们的返回值是bool的Proxy Class————std::bitset::reference。
尚未验证,因为它们的返回值是bool的Proxy Class------std::bitset::reference。
\item 跨平台scanf/printf:最保险的方式是手写输入输出。另一种方式是使用<cinttypes>
提供的PRI/SCN*宏。例如不管long long输入输出是\%lld还是\%I64d,都可以使用SCNd64/
PRId64表示。
\item 需要稳定划分时不能使用维护左区间end位置与swap操作实现,必须使用额外缓冲区,
调用std::stable\_partition。
\item set与map的插入与删除操作不影响之前取得的迭代器的有效性。
\item 调试输出时重定向至stderr,即使忘记删掉也可以降低风险。
\end{itemize}
\subsection{本节注记}
2013年许昊然的国家集训队论文答辩《浅谈数据结构题的几个非经典解法——<Claymore>命题报告》
Expand Down
Loading

0 comments on commit faf6d08

Please sign in to comment.