经验笔记二

1.POJ上G++只能用 %f,C++可以%lf
2.连续区间异或和最大,我只会一个套路,就是01字典树了!
3.行和列是无关的,因此有时候可以把棋盘原题分解成两个一维问题。r[N]、c[N]...
4.线段树:当前区间加上了懒惰标记的值实际上加的值是lazy_tag*区间长度
5.线段树:成段更新需要用到延迟标记(或者说懒惰标记),简单来说就是每次更新的时候不要更新到底,用延迟标记使得更新延迟到下次需要更新or询问到的时候。
延迟标记的意思是:这个区间的左右儿子都需要被更新,但是当前区间已经更新了。
6.一个有环图上求概率或期望,所以考虑用高斯消元。
7.区间修改查询问题一般会想到用线段树或者树状数组来做,但是题目是离线查询,即完成修改后再查询的话,可以用到差分数组。
8.离线定义:就是把所有的数据一次处理完,而不是给一个处理一个!
9.差分:
区间修改完后查询!
以前我做这种题目总是会想到区间修改的线段树,当然这种方法对于大部分题目也确实可行,不过线段段树解决的应该是在边修改边询问的,就是让你自己判断这个操作是修改还是询问。这种是需要线段树来解决的,而对于先修改,最后再询问的题目。比如对[l,r]这个区间加上个C,我们可以这样吧 a[l] += C,a[r+1] -= C,最后我们再用一个变量temp扫一遍,就是加上对应a[i]的值,这时候的temp就是对应那个位置的值,同理乘法也是一样的思路。当然对于有些题目可能是需要我们记录某个东西的个数。思路也是这样。
10.树DP一般伴随DFS/记忆化搜索
11.树形结构代表的特点是连接和层次。


  1. 看到区间问题先要想到前缀和。尤其是多次询问!
  2. 看到求和求积问题先要想到long long。
  3. dfs概念

指一棵树被dfs时所经过的节点的顺序.

时间戳概念

指该节点在dfs被遍历到的开始以及时间.

时间戳用处

判断两点是否存在祖孙关系(如果一个点的起始到结束区间包含另一个,那它就是爸爸~)

结合起来的用处

例:给你一颗树,给出m个x和w,意为将x子树中的所有点加上一个权值w,最后询问所有点的权值 既然dfs序中x和他的所有子节点都在连续的区间上,那么我们就可以将它简化成差分的问题。 比如说给b节点加2,就可以简化为给b的差分数组+2,c的差分数组-2.而找b节点用到的就是时间戳.

4.差分的主要思想其实就是用O(1)复杂度来表示O(N)的覆盖
5.看到开关问题想到奇偶相关。
6.【map小记】
map是STL的一个有序关联容器,它提供一对一(其中第一个可以称为关键字,每个关键字只能在map中出现一次,第二个可以称为该关键字的值)的数据处理能力,由于这个特性,map内部的实现自建一颗红黑树(一种非严格意义上的平衡二叉树),这颗树具有对数据自动排序的功能。
7.
最小化最大值经典套路:
n 个数划分为 m 个区间, 每个区间的元素相加后有一个和, 求这些和
中最大值的最小值为多少。
二分和, 下届为单个最大值, 上届为全部值的和。 判断 mid 时是否可
以划分出至少 m 个区间, 如果不能, 则减小 mid, 如果可以, 就增大。
8.二进制负数-x是正数x的取反加1。
9.你一定要把递归当成人工智能,千万不要去想它是怎么做的!
10.冒泡排序次数 = 相邻两个数交换最后得到有序序列 = 逆序对数
11.做题一定要多画图啊
12.
两个整数相除,将小数点精确到N位(四舍五入):

算法如下:
1,得到两个数。A,B(A/B)
2,先计算得出商是多少,余数是多少。(结果值,最好使用字符窜,容易组合。)
3,余数*10,作为被除数,B作为除数。
4,转第二部,上作为小数点后面的值。

13.G++与C++区别
1)、输出double类型时,如果采用G++提交,scanf采用%lf,prinf采用%f,否则会报错
2)、使用GCC/G++的提醒:
对于64位整数, long long int 和 __int64 都是支持并且等价的.但是在读和写的时候只支持scanf("%
I64d", ...)和printf("%I64d", ...).
不支持"%lld"是因为MinGW下的GCC和G++使用的msvcrt.dll动态链接库并不支持C99标准.
根据ISO C++标准,在G++下,main函数的返回值必须是int,否则将会导致Compile Error(编译错误)的判答
3)、G++/GCC使用scanf、printf时注意引用<stdio.h>,只引用不识别
14.如果更大可以用邻接表来存储(注意边要开到2*n,因为是双向的。这是血与泪的教训)

14.DP的思路就是,如果要访问完[i,j],那么它的子区间一定访问完了。
15.出现聪明这个词的时候,这种题不是博弈论就是dp吧——qsc学姐
16.在图论的数学领域中,如果连通图 G的一个子图是一棵包含G 的所有顶点的树,则该子图称为G的生成树(SpanningTree)。生成树是连通图的包含图中的所有顶点的极小连通子图。图的生成树不惟一。从不同的顶点出发进行遍历,可以得到不同的生成树。
常用的生成树算法有DFS生成树、BFS生成树、PRIM 最小生成树和Kruskal最小生成树算法。

17.一般有个数据 n<16 或者 n<32 这个很可能就是状态DP的标志,因为我们要用一个int的二进制来表示这些状态。要注意好这些数据规模的提示作用。
18.求区间合法的个数,一般用前缀和。
19.数位DP:
既然从高位往低位枚举,那么状态一般都是与前面已经枚举的数位有关并且通常是根据约束条件当前枚举的这一位能使得状态完整(比如一个状态涉及到连续k位,那么就保存前k-1的状态,当前枚举的第k个是个恰好凑成成一个完整的状态,不过像那种状态是数位的和就直接保存前缀和为状态了),不过必然有一位最简单的一个状态dp[pos]当前枚举到了pos位。dp部分就要开始讲例题了,不过会介绍几种常用防tle的优化。
20.状压DP:
状态压缩其实是一种并没有改变dp本质的优化方法,阶段还是要照分,状态还是老样子,决策依旧要做,转移方程还是得列,最优还是最优,无后还是无后,所以它比较好理解。
21.感觉树形dp比背包多了一个辅助数组,背包直接一个数组循环下去,而树形dp因为有分支,不是线性的,所以就需要用一个辅助数组来进行转化最优情况!
22.经常会有卡SPFA,就用Dijkstra + 堆优化!
23.对于单终点最短路,只需要将每条边翻转就可以转换成单源最短路径问题。
24.因为人品可能为负数,而数组下标不能为负数,所以将0的位置转为10000,用 0 ~10000 代表RP为负数的状态,10000~20000 代表RP为正数的状态。

posted @ 2018-07-22 15:45  Roni_i  阅读(257)  评论(0编辑  收藏  举报