摘要: 对于noip时的程序要注意: 1.stdin stdout 要写对 2.文件名要写对 3.头文件能多写就不少写 "优秀的演算法笔记" "day1" "day2" "day3" "day4" "day5" "day6" 阅读全文
posted @ 2017-11-20 21:42 Mr_Wolfram 阅读(242) 评论(0) 推荐(0)
摘要: "题解:shawnZhou" "讲算法的BYVoid" "题解" (https://www.61mon.com/) 常见错误(http://blog.csdn.net/functionendless/article/details/78221717) http://cuitianyi.com/ 阅读全文
posted @ 2017-11-20 21:41 Mr_Wolfram 阅读(216) 评论(0) 推荐(0)
摘要: 图论模板 LCA 离线 tarjan prim,复杂度与dijkstra相似,稍后再看 include include include include include include using namespace std; const int MAXN=5005,MAXM=200005; int 阅读全文
posted @ 2017-11-20 21:40 Mr_Wolfram 阅读(214) 评论(0) 推荐(0)
摘要: 朴素的素数筛法中 bool chk(int x){ if(x==1) return 0; if(x==2)return 1;//一定要特判2 if(!(x&1)) return 0; int t=sqrt(x); for(register int i=3;i 阅读全文
posted @ 2017-11-20 21:39 Mr_Wolfram 阅读(196) 评论(0) 推荐(0)
摘要: 某两点之间的路径上所有边权的异或值即dis1^dis2……^disn. 由于x^y^y=x,所以dfs预处理出每一点到根节点的异或值,对于每次询问,直接输出 disu^disv. include include include include using namespace std; int rea 阅读全文
posted @ 2017-11-20 21:38 Mr_Wolfram 阅读(174) 评论(0) 推荐(0)
摘要: 反向BFS预处理,求出所有符合题意的点,再正向BFS,(注意对于边权恒为一的点,BFS,比SPFA高效) 输入时n与m分清 include include include include include include using namespace std; const int MAXN=1000 阅读全文
posted @ 2017-11-20 21:37 Mr_Wolfram 阅读(148) 评论(0) 推荐(0)
摘要: 题目略带一点贪心的思想,先跑三遍最短路(边权为一,BFS比SPFA高效) 一起跑总比分开跑高效,枚举两人在何点汇合,输出最小值。 include include include include include include using namespace std; const int MAXN=4 阅读全文
posted @ 2017-11-20 21:36 Mr_Wolfram 阅读(123) 评论(0) 推荐(0)
摘要: 枚举 等差数列(ZJOI2004) 给定 n(1m[i],fa[i]=find(i 1),else fa[i]=i; 我认为此题与清北学堂2017的题相像,原题可使用暴力枚举,此题必用并查集优化,思想很好。 "treasure" 仓库扩张(USACO Contest DEC05) 在 FJ 的农场里 阅读全文
posted @ 2017-11-20 21:35 Mr_Wolfram 阅读(202) 评论(0) 推荐(0)
摘要: 首先此一眼就能看出来是一个非常基础的 最长不下降子序列(LIS) ,其朴素的 N^2做法很简单,但如何将其优化成为N logN? 我们不妨换一个思路,维护一个f数组,f[x]表示长度为x的LIS的最大的最后一个数字是f[x]。(为什么是最大的?可以应用 贪心 的思想,发现对于相同的x,f[x]越大其 阅读全文
posted @ 2017-11-20 21:34 Mr_Wolfram 阅读(257) 评论(0) 推荐(0)
摘要: 一道水题然而坑点很多。 include include include include using namespace std; int read(){ int rv=0,fh=1; char c=getchar(); while(c'9'){ if(c==' ') fh= 1; c=getchar 阅读全文
posted @ 2017-11-20 21:33 Mr_Wolfram 阅读(253) 评论(0) 推荐(0)
摘要: 题目中的表述很明显是一道二分答案+最短路的题目,二分收取的费用x判断能否到达奥格瑞玛。检验函数用SPFA跑最短路,注意,费用高于x的点不能使用。 include include include include include include using namespace std; const in 阅读全文
posted @ 2017-11-20 21:32 Mr_Wolfram 阅读(188) 评论(0) 推荐(0)
摘要: 可以发现只有当两个序列中都没有重复元素时(1~n的排列)此种优化才是高效的,不然可能很不稳定。 求a[] 与b[]中的LCS 通过记录lis[i]表示a[i]在b[]中的位置,将LCS问题转化为最长上升子序列问题,转化方法如下: for(int i=1;i include include inclu 阅读全文
posted @ 2017-11-20 21:31 Mr_Wolfram 阅读(326) 评论(1) 推荐(1)
摘要: 这是一道典型的二分答案问题(最大值最小,最小值最大)关键是对于细节的处理。 二分的框架: cpp //l=max{num[i]},r=sum{num[i]} while(l 1; if(chk(m)){ r=m 1; }else l=m+1; } cout include include inclu 阅读全文
posted @ 2017-11-20 21:30 Mr_Wolfram 阅读(340) 评论(0) 推荐(0)
摘要: 一道二分答案加前缀和 题目中已经暗示的很明显了 “尽可能靠近” “ 最小值” 本题的主要坑点在于 long long 的使用 abs函数不支持long long !!! include include include include include using namespace std; cons 阅读全文
posted @ 2017-11-20 21:30 Mr_Wolfram 阅读(242) 评论(0) 推荐(0)
摘要: DP 题目问的是最大空暇时间,那么就定义dp[i]为第i分钟的最大空暇时间,显然满足最优子结构,我们发现dp[i]仅与其后的值有关,那么从后往前推,如果第i分钟没有任务,dp[i]=dp[i+1],如果有任务,就遍历所有任务 dp[i]=max{dp[i+task[j]]} 即本问题可以看成分组背包 阅读全文
posted @ 2017-11-20 21:29 Mr_Wolfram 阅读(153) 评论(0) 推荐(0)
摘要: 这道题是一道splay裸题,然而身为蒟蒻的我并不会,所以这道题我维护的是一个大根堆与一个小根堆结合起来的类似沙漏的结构。 本题难点在于询问的不是最大最小值,而是第K小值,所以我们想到了维护这样两个堆,上面是一个大小限定为K 1的大根堆,下面是一个小根堆,每次插入/查询操作时,保持前K 1大的始终在大 阅读全文
posted @ 2017-11-20 21:28 Mr_Wolfram 阅读(250) 评论(0) 推荐(0)
摘要: 所谓带权并查集 本题所求的不止是两个编号之间是否有关系,还要求两个编号之间有什么关系,这就要求我们维护多个数组,fa[]数组维护两个编号之间的连通性,dis[]维护编号为i的战舰到fa[i]之间的距离,num[]维护编号为i的战舰所在的那一列有多少战舰。 find函数 每次find的时候都更新num 阅读全文
posted @ 2017-11-20 21:27 Mr_Wolfram 阅读(165) 评论(0) 推荐(0)
摘要: 并查集 这是一道比较特殊的并查集,开一个三倍的数组, 1~n保存同类,n~n×2保存猎物,n 2~n 3保存天敌; include include include include using namespace std; const int MAXN=300005; int read(){ int 阅读全文
posted @ 2017-11-20 21:26 Mr_Wolfram 阅读(155) 评论(0) 推荐(0)
摘要: 首先这是一道线段树裸题,但是线段树长度不确定,那么我们可以在建树的时候,将每一个节点初始化为 INF,每次往队尾加一个元素即一次单节点更新,注意本题的数据范围,其实并不用开 long long,具体请看注释。 cpp include include include include define ls 阅读全文
posted @ 2017-11-20 21:25 Mr_Wolfram 阅读(221) 评论(0) 推荐(0)
摘要: 求有向图的权值为一的最小环 并查集做法 维护一个dis[],表示i号元素到fa[i]的距离。 对于输入的每两个点u,v,询问这两个点的fa[]是否相同,如果相同就成环,维护最小值,mi=min(mi,dis[u]+dis[v]+1)。如果不相同,merge(u,v)。目测是最简单的做法。 但是只适用 阅读全文
posted @ 2017-11-20 21:24 Mr_Wolfram 阅读(126) 评论(0) 推荐(0)
摘要: 这道题第一眼以为是一道字符串的题,但细想一下是一道求欧拉路的图论题。 把每一对对应关系看成一条边,本题即求这张图上是否存在一个欧拉回路或欧拉路,并要求字典序最小的方案,那么我们在dfs的时候就要从该点所连的最小的点开始遍历,并将所得的结果存在一个数组中,最后逆序输出。 阅读全文
posted @ 2017-11-20 21:22 Mr_Wolfram 阅读(165) 评论(0) 推荐(0)
摘要: 我们发现每次询问都是对于任意两点的,所以这是一道多源最短路径的题,多源最短路径,我们首先想到floyd,因为询问的时间是不降的,所以对于每次询问,我们将还没有进行松弛操作的的点k操作。 include include include include include include using nam 阅读全文
posted @ 2017-11-20 21:20 Mr_Wolfram 阅读(122) 评论(0) 推荐(0)
摘要: 图论的做法是topsort 一看见有序我们就想到了DAG图,于是用topsort做,对于每一个加入队列的顶点,都用它的时间去更新它所指向的点的时间,本质上仍是DP的思想,dp[i]=max{dp[j]}+ti[i] (j i). 阅读全文
posted @ 2017-11-20 21:20 Mr_Wolfram 阅读(184) 评论(0) 推荐(0)
摘要: 线段树 函数名要写上。。。 LL 在运算的时候要防溢出。 include include include include define lson l,m,rt'9'){ if(c==' ') fh= 1; c=getchar(); } while(c ='0'&&c 1)); // sum[rt 1 阅读全文
posted @ 2017-11-20 21:19 Mr_Wolfram 阅读(347) 评论(0) 推荐(0)
摘要: 本题的描述:城市联盟,最短距离。。 使人想到了prim求MST,再一看数据范围:完全图!,那么一定得用prim,因为只有5000个点,所以不加优化的prim就能过。 include include include include include include using namespace std 阅读全文
posted @ 2017-11-20 21:18 Mr_Wolfram 阅读(180) 评论(0) 推荐(0)
摘要: 对于没有重复元素的全排列来说,存在如下的对应关系 X=an (n 1)!+an 1 (n 2)!+...+ai (i 1)!+...+a2 1!+a1 0! ai为整数,并且0num[j]){ t++; } }k+=t fac[n i]; } return k; } void recontor(in 阅读全文
posted @ 2017-11-20 21:17 Mr_Wolfram 阅读(240) 评论(0) 推荐(0)
摘要: 本题的思想很好,正难则反 首先如果暴力枚举每个数的约数个数,一定会超时,那么我们就从约数的角度考虑,题目中问的是1~n的约数个数和,那么我们就枚举约数,看每个约数在1~n中出现过几次。 include include include include include include using nam 阅读全文
posted @ 2017-11-20 21:15 Mr_Wolfram 阅读(210) 评论(0) 推荐(0)
摘要: 高精度GCD include include include include include include using namespace std; void init(int num[]){ char s[10005]={0}; scanf("%s",s); num[0]=strlen(s); 阅读全文
posted @ 2017-11-20 21:14 Mr_Wolfram 阅读(234) 评论(0) 推荐(0)
摘要: 同余方程 形如 $ax \equiv b \pmod n$ 的式子称为线性同余方程。对于这样的式子有解的充要条件是 $gcd(a,n) \mid b$ . 于是扩展gcd求解 将原方程化为一次不定方程 $ax+ny = b$ . 利用扩展欧几里得算法求解不定方程 $ ax + ny = b$ 的整数 阅读全文
posted @ 2017-11-20 21:13 Mr_Wolfram 阅读(13024) 评论(2) 推荐(3)
摘要: 模意义下的组合数计算 直接利用Pascal公式 ◦ n,k ≤ 1000 ◦ 对模数没有要求 定义直接算逆元 ◦ k较小 ◦ 模数为质数 预处理阶乘逆元 ◦ n,k≤ 10s ◦ 模数为质数 错位排列 表述为:编号是1、2、…、n的n封信,装入编号为1、2、…、n的n个信封,要求每封信和信封的编号不 阅读全文
posted @ 2017-11-20 21:11 Mr_Wolfram 阅读(497) 评论(0) 推荐(0)
摘要: 尺取法: 顾名思义,像尺子一样取一段,尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。之所以需要掌握这个技巧,是因为尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的时候,所以尺取法是一种高效的枚举区间的方法,一般用于求取 有一定限制的区 阅读全文
posted @ 2017-11-20 21:10 Mr_Wolfram 阅读(275) 评论(0) 推荐(0)
摘要: 因为本题的数据范围很小,所以可以预处理一个二维数组,O(1)查询,但是这是一道区间上的题,并且gcd有区间可加性,所以想到了用线段树来维护,然而此题并不用修改,ST表有着比线段树更小的常数。 include include include include include include define 阅读全文
posted @ 2017-11-20 21:09 Mr_Wolfram 阅读(185) 评论(0) 推荐(0)
摘要: 这道题是一道背包问题,考虑一个背包, 显然如果我们直接设dp[i]表示前i个使差值最小所需的最少翻转次数,是具有后效性的。 所以我们将直接求最值,改为求某个值是否可行,这种求最值转变为求可行性的思想是非常实用的。 状态 dp[i][j]表示使用前i个物品修改得到差值j的最小步数。 第一步求出原来两个 阅读全文
posted @ 2017-11-20 21:08 Mr_Wolfram 阅读(281) 评论(0) 推荐(0)
摘要: 本题非常有趣。 (n^6) 枚举四个端点,每次遍历矩阵求解。 (n^4) 先处理前缀和,枚举四个端点,每次比较前缀和和正方形面积。 (n^3) 枚举左上方端点,在枚举边长,前缀和优化 (n^2logn) 枚举左上方端点,发现条件是单调的,于是二分边长 (n^2) DP做法,枚举右下端点,若该点是0, 阅读全文
posted @ 2017-11-20 21:07 Mr_Wolfram 阅读(224) 评论(0) 推荐(0)
摘要: 首先有序化垃圾被丢入的时间,然后用背包的解法, 一维数组f[high]=life 表示在垃圾堆high高度的时候,奶牛可以存活life的时间 对于每件物品,循环从d~0 如果这个高度的生命值不小于这个垃圾丢下来的时间 如果 高度+这个垃圾的高度不小于d,就输出这个垃圾丢下来的时间 不然 这个高度+这 阅读全文
posted @ 2017-11-20 10:43 Mr_Wolfram 阅读(275) 评论(0) 推荐(0)