复习!
把做过的题争取都看一遍,弄明白出现过的所有问题,省一不是问题!
具体一点的话,那就把黄题及以上写一下思路吧。(按题号)
2019年11月6日
Y P1017进制转换 将一个整数装变成某负进制 类比正进制的转换,手写一下负数的模运算(整数模运算后判负加至非负)
Y P1020导弹拦截 用单调队列求最长上升子序列(nlogn),同位置下元素越小越优;最少多少条不下降子序列 <=> 最长下降子序列(Dilworth定理)
Y P1022计算器的改良 模拟 统计等号左右两边常数和和系数和,然后移项、同分。注意退出循环的条件。wo字符串处理是真的弱啊。。
Y P1024一元三次方程求解 根据零点的性质(变号)求即可,因为题目中已经告诉解间的距离。注意区间移动时要避免在边界处重合!
Y P1025数的划分 搜索|dp 原来写的搜索,现在一看先想到了dp 50ms -> 10msf[第几个数][上一个是什么][用了多少了]感性的理解上应该还可以再减枝、加记忆化。
Y P1057传球游戏 环上的dp。注意边界的处理,区分n与m的意义!
2019年11月7日
Y P1071潜伏者 模拟,题意要求每个字母都至少出现一次
Y P1076寻宝 模拟
Y P1090合并果子 贪心|哈夫曼树 由于没有位置影响所以不用dp
Y P1091合唱队形 正反向各一遍求出每个点在两意义下的lis,最后O(n)求答案
Y P1111修复公路 并查集||最小生成树 最早联通时间,可以最小生成树求到每点的最短时间,也可以把边按时间排序用并查集连接求.并查集代码更短.
Y P1113杂务 拓扑排序求最长链 拓扑图dp,按顺序更新就行了.
(黄题写不完了,先看蓝题吧)
2019年11月12日
B货车运输 树lca 树上路径具有可并性质的信息可用rmq维护
B火柴排队 逆序对|贪心 相同rank的匹配差值才最小,所以求a序列元素相对位置在b序列相对位置映射中的逆序对
B聪明的质检员 二分答案×前缀和 每次二分出W后都求一遍前缀和,看似麻烦实则省去了相交区间的大量重复运算;前缀和不是直接保存最终答案,而是加速问题中重叠部分的求解,至于每个区间的长度最后乘上即可,复杂度不变。
B HH的项链 树状数组|前缀和 为了处理重复只求一遍的问题采取了离线按右端点排序和记录每个位置的上一个相同颜色位置每次遇到一种颜色进行一次单点减和一次单点加的策略
B 斗地主 搜索 尽量减少搜索树的浅层的分支可以更快找到答案,从而更好得进行最优化剪枝
B 关押罪犯 并查集 采用二倍数组或额外一个数组来维护对立关系。二倍数组更方便
B 矩阵取数游戏 dp+高精度 对于相互独立的行分别进行dp求解,最后合并答案。高精度要熟练!
B 最优贸易 spfa×dp 最短路模型的dp,将转移方程改为到节点的最小价格即可。注意无权图的Edge结构体不要写上wi,否则死得很惨!!
B 国王游戏 贪心×高精 列式后设量,交换相邻两项 消除同类项,根据性质排序。高精除!
B 灾后重建 Floyd 本质是Floyd,只是便外层循环为时间顺序。考察对Floyd的理解。
B 小木棍 搜索剪枝 框架:一根拼完再搜下一根 剪枝:长棍不行短棍凑出的相同长棍也不行;先搜长棍再搜短棍可以减少搜索树在浅层的分支;同一根棍从小向大搜;只有长度是总长的因子才可能成为答案
B 垃圾陷阱 线性dp 维度之间的转化,数组值只有0/1感性理解上会有些浪费。
B 银河英雄传输 加权并查集!!
1 int find(int x){ 2 if(fa[x] == x)return x; 3 int rt = find(fa[x]); 4 d[x] += d[fa[x]]; 5 return fa[x] = rt; 6 } 7 8 void merge(int i,int j){ 9 int x = find(i),y = find(j); 10 fa[x] = y; 11 d[x] = size[y]; 12 size[y] += size[x]; 13 }
d[]距根的距离,size[]子树大小。合并时新儿子的距离更新为父亲大小,然后将新儿子的大小加到父亲上。路径压缩时先更新祖先再更新自己的信息。
B 星球大战 并查集 正难则反:正着拆集合不好维护就倒着并集合。看准了数据范围!
B 最大数 线段树|单调栈+二分 用线段树维护区间最大值,新加点相当于是add(++cnt);但是对于这道题来说因为只要查询自右端点开始一段区间的最大值,所以位置偏左而值又偏小的元素一定不如位置靠右且更大的元素,因此可以维护一个单调递减的单调栈,每次在栈中二分位置即可。
B 瑞瑞的木棍 欧拉回路+字典树 区分欧拉路。欧拉路的条件是每个点都有偶数个度或有且仅有两个奇数度的点;欧拉回路的条件是每个点都是偶度。这就行了?联通才有欧拉路!!
B 无序字母对 欧拉路 如果图联通且所有点的度数均为偶数或有且仅有两个点为奇数度,则存在欧拉路。若存在欧拉路,则若存在奇数度的点那么就从奇数度的点出发否则从任一点出发dfs即可得到欧拉路。求字典序最小只要贪心的选就好了。联通是欧拉路的必要条件!
B 矩形 二维前缀和 边界上的点数=大矩形-内部小矩形。这道题应该是评错了...
号外:512Mb = 2^9Mb = 2^19Kb = 2^29B = 2^32bit ≈ int a[(int)1e8] "两年oi一场空,mle见祖宗..."
B 平均数 二分+sliding windows模型判断 与s[i-m]取min就能保证序列的长度大于等于m。
B [模板]最长公共子序列 要注意题目,但不要被误导。。因为给出的是一个排列,所以相当于在b序列上求a序列映射的lis。
B 砝码称重 dfs×01背包 如题,搜索到每个状态后dp更新答案。
B 通往奥格瑞玛的道路 二分+dijkstra ”经过城市中最多一次收费的最小值“经典的二分题的表述。二分后不走比mid更贵的点,然后吧减的血看作长度跑最短路即可。
B 路径统计 最短路 再开一个数组统计到每个点的最短路的方案数,然后根据加法原理递推即可。
B 跑路 倍增+Floyd 观察到n很小,边权都为一,而跑路器又是跑2的指数次方,所以直接建邻接矩阵存点与点的可达性,再多出一维来存边长到了2的几次方即可(2^k 只能由2^k-1+2^k-1而不能由2^k-1+2^k-2推来)。因为无论是多少次方都在相同时间内跑完,所以最后合并为一个矩阵。最后怎么跑都无所谓了。这道题的关键在于要想到开矩阵处理新的长边。
B 翻转游戏加强版 加不加强都差不多。无非就是裸的爆搜过不去罢了。观察性质发现只要第一行确定了,整个局面就确定了。所以之枚举第一行的状态即可。推而广之:若某一部分可以决定整个局面,那么不妨暴力枚举这个部分,然后判断形成的局面合不合法。
B 黑匣子 对顶堆 对顶堆不仅可以求中位数,还可以在线求排名为i的数。只要改变两个堆的大小就行了。
B 斐波那契数列 矩阵快速幂 对于n ≤ 10^10^6 或 2^63这样的数据范围时,要想到矩阵快速幂是一个log级别的算法。
B 车站分级 拓扑排序 向等级变化的方向连边,然后拓扑排序求最长链(最长链是大小关系连续单调变化的最长段即最小级数)
B 消息扩散 tarjan缩点 taijan的裸题好像都评蓝了..入度为0的强连通分量一定且只需要它们得到消息,入度不为零的点就可以从他们入度的源头拿来消息了。所以答案就是入度为0的scc数目。
B 维护序列 线段树×标记+标记区间和 挺裸的...先乘再加,这样下放标记时只要将两标记都乘一下就好了。否则加标记下放的处理会使子节点的乘标记成为实数。
B 选课 树形dp 树上的背包,再每个节点上跑它子树的01背包即可。
B 二叉苹果树 树形dp 状态是f[root][减去几个] = 这个子树中的最大苹果数
B 食物链 并查集 三种个关系,三倍数组维护即可。情况很有限,不要疯狂无脑取模。。分类讨论可以使代码更清晰。。
1 if(find(u) == find(v)||find(v+n) == find(u))ans++; 2 else{ 3 fa[find(u+n)] = find(v); 4 fa[find(u+n+n)] = find(v+n); 5 fa[find(u)] = find(v+n+n); 6 }
B [模板]nim游戏 博弈论 各堆数目异或和为零的局面行动者必败。这类题要分析每种状态分别可以转移到那些状态,若可以转移到必败态则该状态为必胜态,若不能转移到必败态则该状态为必败态,有点必要充分条件的意味。
B 取石子游戏 威佐夫博弈
直接说结论了,若两堆物品的初始值为(x,y),且x<y,则另z=y-x;
记w=(int)[((sqrt(5)+1)/2)*z ];
若w=x,则先手必败,否则先手必胜。
——摘自洛谷题解
结论题...证明真心看不懂,隐隐约约感觉这种题可以当作图论题dfs去拿部分分,但是这种玄学的式子谁能在考场上推出来啊。。
B 消防局的设立 树形dp 很典型,一道与其他树形dp套路不完全一样的题。第二维存到根节点的距离(-2~2),是树形dp的另一种模型吧
B 解方程 秦九韶算法 观察式子性质,充分利用计算机的长处,递归求解秦九韶算法。考上少遇到这种题要想办法把式子变形成利于求解的形式。
B 骑士精神 ida* 下限为与目标的区别个数。注意ida*预估函数一定要优于答案,否则可能导致答案被预估后无法取出。
B 受欢迎的牛 scc 显然一个联通块内的牛地位是平等的。唯一的出度为0的scc中的牛就是明星,因为他们除了所在scc内的牛都不喜欢,所以其他牛都不可能成为明星;又因为只有这么一个,所以其他牛都只能指向这个scc,所以这个scc的大小即为答案。
B 叠积木 加权并查集 同银河英雄传说,题意差不多,代码都差不多。。
B 最短路 最短路 题目和算法一样,,只要注意过程中不要取模就好了,一定要看明白是取模后最大还是最大的取模输出。
2019/11/13
B 二进制方程 并查集+高精 相同字母代表的含义相同,所以将相同的字母放到同一集合中,表示含义相同(这里把字母拆成长度个元素)。最后每个集合均有两种选择,乘法原理乘出答案。整道题中只有最后输出答案时用到了高精度,所以无需写结构体,直接数组模拟即可。
P2513...
2019年11月14日
B P2513 逆序对数列 前缀和优化dp 表面上看起来是构造,实则是dp.f[i][j] = 方案数(i:考虑到第i个数,j:逆序对数)
B 校园网 tarjan缩点 每加一条边都可以使一个入度为0的点和一个出度为0的点合法,所以答案为两种点数目的较大值.此处有一坑点——若整张图强连通,那么仅有一个出入度均为0的点,此时不需要加边,但是直接去取max会取出1来,所以要特判过去。。
B 冗余道路 tarjan缩点 每加一条边可以消去两个非法点,每个非法点至少需要一条边,故最终答案为(n+1)/2;