小结(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.
③注意设计的算法要与编号无关.
④除非进行一次枚举,求出n个hash值.
④这种方法可以应用于所有的判断相同整体的问题上.

三. 同余类分析

BZOJ 2118 墨墨的等式
PC 1325 长途旅行

权值过大的时候,考虑使用这种方法.

这种问题求解的,通常是方案值存在性问题计数问题.

一般选取的同余值A,要满足:若方案值为p是可以的,那么方案值为p+A也是可以的.

通常这种方法会涉及最短路算法.

四. 权值过大的调整思路

我们在使用基于权值的数组计算时,可能会应该目标太大而出现MLE和TLE的情况。
假如还是使用相同的方法,我们可以做如下几种常见的调整:离散化按权值大小分块同余类分析

五. BigNumber

①用字符串存储,注意不要误用int;
②注意比较数的大小的时候,首先要比较长度,然后再按字典序比较;
③涉及运算时要用数组倒着存,高精度模拟;

六. 字典序比较

UOJ #9 vfk的数据

【方法1】逐位比较O(L).

【方法2】求Hash,二分找最大相同位,比较下一位.
预处理O(L),比较O(logL).

七. 排序

其实有时候,快排未必是最佳选择,我们需要熟悉多种排序.

排序的常用方法:
①冒泡排序:针对小数据;
②快速排序/sort:普通数据;
③基数排序/Trie树排序:当元素的种类很少时考虑使用;
不要忽略方法①和方法③.

八. 逆向回代法

XSY 1335 寿司晚宴
PC 1326 数列

逆向回代法,通常是利用强制在线的漏洞.
漏洞通常的表现为:上次的答案加上这次的读入,上次的答案异或这次的读入

要满足这两个条件才能使用:
①知道或可以快速算出最后一次的答案
②当前知道本次的答案和本次加密的某些数值,要求上一次的答案.
可以将上一次的答案设为未知数,代入本次得到的等式解方程.

九. 积性函数 欧拉线性筛

要求1:会基本的线性筛
要求2:会求以下的积性函数
①欧拉函数phi
②莫比乌斯函数μ
③约数个数d
④约数和s
⑤乘法逆元inv

十. 经典问题:修改元素成为LIS

PC 1329
PC 1304

ai:=aii,然后求LIS.

十一. 经典问题:区间存在一个数整除其他所有数

PC 1328

等价于区间gcd=区间min.

十二. 差分约束

di+xdj,则add(ij,x),求最短路.
注意小于与小于等于的转化.

初始赋值:
如果要使得相差尽可能小,则di=0
如果要求点i离得最远的点,di=0dj=

十三. 经典问题:给点判断有多少对满足形状

PC 1321 四轮车

这种判断形状的题目,如果使用的方法跟点的位置关系有关随便设置一种点的位置关系即可,然后除去重复数

十四. 经典问题:前缀和维护al1+al+12+...+ar(rl)

记两个前缀和数组.

十五. 思考问题的调整方法(重要!!!)

思想问题时的调整:
- 优化:探究性质,数据结构,算法;
- 重述:从不同的角度重新表述问题;
- 转化:转化问题;
- 逐步满足:先满足一个条件,然后再将一个条件与两个条件建立关系;
- 普遍性:先考虑一般性的问题,然后再与原问题建立类比的联系;
- 特殊性:先考虑特殊性的问题,然后再与原问题建立类比的联系;

十六. 最优性问题

最优性问题,通常有枚举检索、参数搜索、贪心、动态规划的思路.

十七. 博弈问题

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;}

③注意事项:
若题目要求答案保留n位小数,则EPS<1e(n),否则会出问题.

十九. 概率与期望

PC 1307 小象涂色
PC 1301 比赛

只需要简单的几个认知.
①期望的和=和的期望;
②期望的定义;
③概率的定义;
④概率的递推;

二十. 位运算

PC 1306

涉及位运算的最优性问题通常要从位思考,设计贪心算法
使用Trie等数据结构

二十一. 计数问题

PC 1305
PC 1302 数字

解决计数问题的出发点通常有两个:动态规划,组合数学.

计数问题常见的转化是全集-补集,更甚的是容斥原理.

二十二. 高精度

高精度压位后的输出要注意补齐前导零.

二十三. C++的一些问题

  1. 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;}
  1. 头文件

自己常用的头文件按照一个顺序写会比较好看,下面给出以后的参考:

#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

对于最优性问题,有参数搜索的方法.

可能的范围中,我们可以按照坐标枚举答案,可以按照权值单调性枚举答案,可以按照某些特定顺序枚举答案,也可以二分枚举答案.

我们要做到的是,可能的范围尽可能小,枚举的方法尽可能快.

如果答案在给定的输入中,可能的范围就是O(n)个离散的点.

主要讲一下单调性枚举答案
就是把可能出现的权值从大到小排序,然后依次枚举.
通常效率不会低,只要数据不坑可以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,更不能荒废学业。

永不停止那追梦的脚步,为珍惜,为证明,为奠基,为贡献……

时贰零壹陆年贰月拾叁日。

0 0