小结(2016-02-02至2016-02-13)
来源:互联网 发布:淘宝培训班 深圳沙井 编辑:程序博客网 时间:2024/05/20 19:50
小结(2016-02-02至2016-02-13)
目标
上次的总结中:
这个寒假还有好多作业……
BZOJ目前已经切了前16道,这个假期切完前25道就好了……
下学期要把学校的题都完成,也把BZOJ第一版做得差不多了.
然而很明显没有继续切下去,因为觉得有更好的选择,倒是把学校OJ的一版给做完了.
重新组织一下下学期的目标:完成初中的所有题,完成UOJ第一版.
这个假期的OI训练告一段落,除了GDKOI前还会做一点水题练手感.
收获
接下来总结一下这两个星期的收获.
一. 分块
CodeVS 1080 线段树练习
BZOJ 2002 弹飞绵羊
CodeChef Chef and Churus
CodeForces #80 Div 1 D
分块,是在想不到其他方法的时候才用的,很多时候可以骗大量部分分.
三种分块类型:对位置分块,对数值大小分块,对操作分块.
二. 同构问题(整体判断问题)
BZOJ 4337 树的同构
①可以用Hash或者枚举.
②为了提高准确率,可以考虑使用多个Hash.
③注意设计的算法要与编号无关.
④除非进行一次枚举,求出
④这种方法可以应用于所有的判断相同整体的问题上.
三. 同余类分析
BZOJ 2118 墨墨的等式
PC 1325 长途旅行
当权值过大的时候,考虑使用这种方法.
这种问题求解的,通常是方案值的存在性问题和计数问题.
一般选取的同余值
通常这种方法会涉及最短路算法.
四. 权值过大的调整思路
我们在使用基于权值的数组计算时,可能会应该目标太大而出现MLE和TLE的情况。
假如还是使用相同的方法,我们可以做如下几种常见的调整:离散化,按权值大小分块,同余类分析。
五. BigNumber
①用字符串存储,注意不要误用int;
②注意比较数的大小的时候,首先要比较长度,然后再按字典序比较;
③涉及运算时要用数组倒着存,高精度模拟;
六. 字典序比较
UOJ #9 vfk的数据
【方法1】逐位比较,
【方法2】求Hash,二分找最大相同位,比较下一位.
预处理
七. 排序
其实有时候,快排未必是最佳选择,我们需要熟悉多种排序.
排序的常用方法:
①冒泡排序:针对小数据;
②快速排序/sort:普通数据;
③基数排序/Trie树排序:当元素的种类很少时考虑使用;
不要忽略方法①和方法③.
八. 逆向回代法
XSY 1335 寿司晚宴
PC 1326 数列
逆向回代法,通常是利用强制在线的漏洞.
漏洞通常的表现为:上次的答案加上这次的读入,上次的答案异或这次的读入;
要满足这两个条件才能使用:
①知道或可以快速算出最后一次的答案
②当前知道本次的答案和本次加密的某些数值,要求上一次的答案.
可以将上一次的答案设为未知数,代入本次得到的等式解方程.
九. 积性函数 欧拉线性筛
要求1:会基本的线性筛
要求2:会求以下的积性函数
①欧拉函数
②莫比乌斯函数
③约数个数
④约数和
⑤乘法逆元
十. 经典问题:修改元素成为LIS
PC 1329
PC 1304
十一. 经典问题:区间存在一个数整除其他所有数
PC 1328
等价于区间gcd=区间min.
十二. 差分约束
若
注意小于与小于等于的转化.
初始赋值:
如果要使得相差尽可能小,则
如果要求点
十三. 经典问题:给点判断有多少对满足形状
PC 1321 四轮车
这种判断形状的题目,如果使用的方法跟点的位置关系有关,随便设置一种点的位置关系即可,然后除去重复数
十四. 经典问题:前缀和维护al∗1+al+1∗2+...+ar∗(r−l)
记两个前缀和数组.
十五. 思考问题的调整方法(重要!!!)
思想问题时的调整:
- 优化:探究性质,数据结构,算法;
- 重述:从不同的角度重新表述问题;
- 转化:转化问题;
- 逐步满足:先满足一个条件,然后再将一个条件与两个条件建立关系;
- 普遍性:先考虑一般性的问题,然后再与原问题建立类比的联系;
- 特殊性:先考虑特殊性的问题,然后再与原问题建立类比的联系;
十六. 最优性问题
最优性问题,通常有枚举检索、参数搜索、贪心、动态规划的思路.
十七. 博弈问题
PC 1313 日历游戏
博弈问题,要么直接找规律,要么记忆化搜索或者递推.
至于sg函数,暂时也没时间看了.
十八. 浮点误差
①产生原因
浮点数的误差是怎么形成的
浮点数的误差的产生一般由于两个原因:
1)由于计算机内部以二进制保存,所以十进制的有限位的小数,在计算机内部会是一个无限位的小数。
例如 十进制的0.9虽然只有一位小数,转成2进制是无限循环小数0.1110011001100110011…
2)计算机保存浮点数的精度有限,例如float可以保留十进制最多7位(二进制23位)有效数字,double 可以保留十进制15~16位(二进制52位)有效数字。那有效数字以后的就被忽略了。
例如上面的0.9的表示受精度所限,精度以后的就被忽略了,这样
float时,它是0.89999998
double时,它是0.90000000000000002
②写法
#include <cmath>const double EPS=1e-5;inline int cmp(double i,double j){ if (fabs(i-j)<EPS) return 0; return i<j?-1:1;}
③注意事项:
若题目要求答案保留
十九. 概率与期望
PC 1307 小象涂色
PC 1301 比赛
只需要简单的几个认知.
①期望的和=和的期望;
②期望的定义;
③概率的定义;
④概率的递推;
二十. 位运算
PC 1306
涉及位运算的最优性问题通常要从位思考,设计贪心算法。
使用Trie等数据结构。
二十一. 计数问题
PC 1305
PC 1302 数字
解决计数问题的出发点通常有两个:动态规划,组合数学.
计数问题常见的转化是全集-补集,更甚的是容斥原理.
二十二. 高精度
高精度压位后的输出要注意补齐前导零.
二十三. C++的一些问题
- struct的本体成员函数使用:
struct E{ int u,v; E (int u=0,v=0) {u=u,v=v;}}mp[N];int main(void){ mp[1]=E(1,2); //建立1到2的边 //效果:mp[1].u=1,mp[1].v=2 return 0;}
- 头文件
自己常用的头文件按照一个顺序写会比较好看,下面给出以后的参考:
#include <cstdio> //必须的读入输出#include <cstring>#include <cstdlib>#include <cctype> //读入优化常用#include <ctime>#include <cmath>#include <climits>//上面的基本的#include <algorithm> #include <map>#include <set>using namespace std;//stl的
二十四. 二分
①手写二分
给一份没有问题的二分模板:
inilne int work(int w){ int l=左边界,r=右边界,mid; for (;l<=r;) { mid=l+r>>1; if (w满足mid的条件) l=mid+1; else r=mid-1; /* 或if (...) r=mid-1; else l=mid+1; */ } return r;//判断合法,后修改的是答案}
②stl二分
前提:区间已经排好序
函数:
lower_bound(first,end,val)
upper_bound(first,end,val)
对应查找区间[first,end)
得到下标的方法:
loc=lower_bound(a+1,a+n+1,val)-a
loc=upper_bound(a+1,a+n+1,val)-a
返回的是什么下标:
当存在val时,val存在的区间是 [lower_bound() ,upper_bound());
当不存在val时,upper_bound()=lower_bound()=比val大的第一个元素的位置.
二十五. 参数搜索
PC 1304 Incr
PC 1303 Graph
对于最优性问题,有参数搜索的方法.
在可能的范围中,我们可以按照坐标枚举答案,可以按照权值单调性枚举答案,可以按照某些特定顺序枚举答案,也可以二分枚举答案.
我们要做到的是,可能的范围尽可能小,枚举的方法尽可能快.
如果答案在给定的输入中,可能的范围就是
主要讲一下单调性枚举答案:
就是把可能出现的权值从大到小排序,然后依次枚举.
通常效率不会低,只要数据不坑可以AC,用途比二分枚举更广(二分枚举需要满足单调性)。
一些问题可以用这种方法解决:RMQ,PC 1304,etc.
二十六. 树剖
树剖总是容易忘记怎么写,这里写一些记忆树剖的方法。
下面列举的是树剖每部分对应需要的数组:
遍历:vis[N];
找重儿子:size[N],hv[N];
找LCA或路径询问:dep[N],pre[N],top[N];
节点编号维护:tid[N],num(,pid[N]);
写树剖的时候,就根据所需要处理的问题,先用笔列出两次(一次)遍历中需要求出的东西,然后再开始写。
涉及到路径问题的要写两次遍历:找重儿子、剖分。
二十七. 树上问题
常见的方法有树形dp,树链剖分,树上倍增,树上莫队,点分治,LCT(不会).
可以考虑现将树上的问题放在一条线上考虑,然后再进行转化.
感言
重重烟雾遮掩山巅,陡峭山峰屹立眼前,这一重重的关卡!
登上此途,必会历经重重磨难,我踌躇不前。苍穹之上的那个存在,轻蔑地看着蝼蚁般渺小的我,嘲笑着我的无知和胆怯。
这条路,是只属于我的路,是只有我能完成的路,我又怎么能放弃呢?风险再大又何妨!强大与弱小,成功与失败,皆在一念之间。
不再踌躇,我拔出利剑。为了自己珍惜的人,我只能到达这一个终点,默念心底的誓言,放手一搏。
荆棘丛生又如何?刀山火海又如何?我一定会斩破重重云雾,登上山巅,与至高无上的主宰一决高下!
搞好OI,为了更好的未来,为了提高自己的学习能力,为了锻炼自己的思维逻辑。
学好学校的知识,为了给自己打好未来的基础,有更全面的发展。
绝对不能放弃OI,更不能荒废学业。
永不停止那追梦的脚步,为珍惜,为证明,为奠基,为贡献……
时贰零壹陆年贰月拾叁日。
- 小结(2016-02-02至2016-02-13)
- 【2016-02-23】近期小结
- 小结(2016-01-15至2016-02-01)
- Foundation小结02
- 2017.08.02小结
- 2017 09 02 小结
- 2016小结
- 2016小结
- 2016小结
- 2008-02-02 年度小结
- {小结}2016暑期Aug~Sep训练小结
- MongoDB学习02之语法小结
- iOS每日小结-02流程控制
- MongoDB小结02 - 配置、启动MongoDB
- shell脚本学习02-第一章小结
- block小结--02 block的种类;
- 语法——JavaScript知识小结02
- 今日小结(2016-07-04)
- 使用Fresco加载图片
- NYOJ-擅长排列的小明
- 奇葩问题 eclipse中DDMS的LOGcat只有一列level
- equals 与 ==的用法
- uva11636 - Hello World!
- 小结(2016-02-02至2016-02-13)
- 一位学软件工程的学生对软件行业的困惑
- NYOJ-D的小L
- uvaoj-340:猜数字游戏的提示
- NYOJ-最少步数
- Building Maintainable Software-java篇之Keep Unit Interfaces Small
- 算法学习--动态规划
- uva11039 -Building designing
- 博客搬家 -> www.wilkeryun.com-> 搬回csdn