算法
文章平均质量分 75
算法刷题
gokingd
保持理智
展开
-
12月补题记录
之前因为期末考试等原因,不少题都是CV的,现在放假了,打算一次性给补回来。其中包括12月末和1月份上旬的所有LC每日一题打卡题已经之前周赛没有复盘的题。并从今天开始会重新每日3题+每一场周赛了。...原创 2022-01-19 20:20:08 · 345 阅读 · 0 评论 -
leetcode周赛268 题解
掉分之旅…前几场都打的比较顺,一直在上分,今天这场多半是掉分了…赛后复盘,感觉这场其实还是挺简单的…其实每把都感觉有机会ak,这把感觉是机会最大的一次,然而…希望下次能AK!!t1 直接暴力 1At2 模拟 1At3 哈希+二分t4 暴力打表/ 求下一个十进制回文数+进制转换t3 我其实赛中有想过存下标来搜索,但是忘记加二分了…然后居然想去用二维vector的前缀和求,结果依然是tle 其实仔细想想,这题还蛮简单的,存出现下标,然后二分搜区间下标。t4 暴力打表可以做。无奈t3耗时太长原创 2021-11-21 15:45:24 · 119 阅读 · 0 评论 -
基于FFT的大整数乘法
多项式求值对于多项式f(x)=a0+a1∗x1+a2∗x2+...+an−1∗xn−1f(x)=a_{0}+a_{1}*x^{1}+a_{2}*x^{2}+...+a_{n-1}*x^{n-1}f(x)=a0+a1∗x1+a2∗x2+...+an−1∗xn−1通常我们要花费O(n2)O(n^2)O(n2)的时间来求其nnn个点的处的取值。1965年Cooley and Tukey提出的FFT能够在O(nlogn)O(nlogn)O(nlogn)的时间求得nnn个点处的值。其本质是利用复数的周期性和原创 2021-10-30 17:42:28 · 2297 阅读 · 4 评论 -
主席树模板
马上就要省赛了,一方面是复习算法,另一个方面是为了总结模板主席树是可持久化线段树,由n棵线段树组成,为了节约时间,利用了前缀和的思想,每一颗线段树维护的是前i 个数的信息,这样做差就能得到某个区间的信息。为了节约空间,查找到上一次的信息,不必每次都建立一颗完整的线段树,我们根据线段树的性质可以知道,每次只需要更新一条链的信息,从而大大减少空间。建树部分和线段树类似inline int bu...原创 2019-08-28 21:20:57 · 105 阅读 · 0 评论 -
二维差分数组和二维前缀和的个人看法
一维差分数组和前缀和都挺熟悉的,做题在打cf的时候做到了一个看别人用二维差分数组求前缀和的题,惊呆了,于是来补了下这方面的知识。在学习和理解二维的时候,我们拿一维来对比就行了,思想是类似的但是略有所不同。设一个二维数组a[i][j] 那么它的二维前缀和即为从(i,j) 到原点(0,0) 所有数之和,或者说这个矩形的大小。前缀和不是单用来求和的,而是在查询某一段区间的值时,能有O(1) 的高效。...原创 2019-08-13 00:07:11 · 1412 阅读 · 0 评论 -
线段树模板
线段树用于区间的修改统计问题,能用线段树维护的东西,必须满足区间可加性,即可用左右子结点推出父节点。但其实线段树的用法远不止这些,这里来总结线段树的基本模板写法。首先是递归建树 需要注意的地方是存树的数组要开4倍大小push_up函数用来更新结点,这里以区间求和为例inline void push_up(int k){ t[k]=t[k<<1]+t[k<<1|1]...原创 2019-08-20 00:01:06 · 130 阅读 · 0 评论 -
逆元总结
若a*b≡1 mod(m) 则称a 为 b 的逆元 或者 b为 a 的逆元 (inv)当且仅当 a与 模数m 互质,则a存在逆元当进行分数取模的时候 ,需要转换为整数取模,这个时候就需要求逆元了,为什么这么说呢,看下面的分析求逆元对于一个质数可以用费马小定理如1e9+7最后用快速幂取模求就行了,快速幂可以看我另一篇博客...原创 2019-07-30 22:17:29 · 309 阅读 · 0 评论 -
manacher算法模板
void pre(){ str[0]='$'; int k=0; for(int i=0;i<strlen(s);i++){ str[++k]='#'; str[++k]=s[i]; } str[++k]='#';} int manacher(){ int sum=0,mx=0,id=0; for(...原创 2019-08-03 12:54:19 · 86 阅读 · 0 评论 -
树状数组模板
网上关于树状数组的介绍很多,这里就不详细介绍,主要是总结模板首先lowbit部分int lowbit(int x) {return x&(-x);}树状数组的标准用法是单点修改求前缀和普通的用法如下(复杂度均为logn)单点修改` 区间查询(求前缀和)初始化的话执行n次add操作void add(int x,int k){ while(x<=n){ ...原创 2019-08-06 21:05:58 · 1646 阅读 · 0 评论 -
树状数组
最近在看树状数组树状数组在我的理解来看就是 找一种最好的方案使数组之间的排列在修改和查询时的复杂度最低 而树状数组就巧妙利用lowbit 来使得分配的数组操作次数最少。比方说单点修改,你不需要按自然数顺序修改所有的前缀数组,你只需要按lowbit顺序修改logn个数组 。查询同理。下面贴上树状数组的模板,还是挺好写的。int lowbit(int x) {return x&(-x)...原创 2019-07-06 22:18:55 · 95 阅读 · 0 评论 -
交换两个变量
本文将给出java代码,其实语言什么的不重要,重要的是算法思想其实本文本来是要总结排序算法的,但是前面就写了这么多,就分开好了排序总结看这里---->>>>首先,实现交换操作的时候,将使用高级操作:不使用中间变量交换两个变量这里有两种方法,分别是减法和异或先看减法a=b-a;b=b-a;a=b+a;这里有一种很好理解记忆的几何原理假设a,b是数轴上的两...原创 2019-07-13 18:33:33 · 272 阅读 · 0 评论 -
快速幂取模
今天在网上看了一些快速幂取...转载 2019-07-08 15:04:14 · 88 阅读 · 0 评论 -
尼姆博弈
本文不讲述复杂的推导过程与证明过程,直接给出结论,方便记忆。尼姆游戏:有n堆若干个物品,两个人轮流从某一堆取任意多的物品,规定每次至少取一个,多者不限,最后取光者得胜。稍叫说明,(0,0,0,…,0)为必败状态,不论谁面对这种状态都是必败。给出下面两个规则:1.一个状态是必败状态当且仅当它所有的后继都是必胜状态。2.一个状态是必胜状态当且仅当它至少有一个后继状态是必败状态。(相关分析...原创 2019-04-18 17:16:30 · 493 阅读 · 0 评论 -
牛客小白月赛13题解(更新中。。)
小白月赛太真实了 连小白都算不上先放上会的,不会的一个一个补,后面会一直更新发现了好多不会的算法,在解决这个题的同时也会更新的文章来系统的学习那一方面还是放个链接吧 传送门A.这是真签到了,直接交代码是不行的,打个表就能发现规律偶数输出-1,奇数输出1后面想了想这应该算一个数学公式吧,你要是把斐波那契数列通项公式带进式子进行化简应该是可以验证其正确性的当然了,奇偶的时候要记...原创 2019-04-14 20:07:14 · 256 阅读 · 0 评论 -
acm中stl大总结(吐血总结)(更新中)
在打比赛的时候stl能帮助我们省下很多时间,减少很多麻烦,这么久也只是零零散散地用,有时忘了就百度,导致比赛的时候根本想不起来,还有很多的内容并不熟知,所以决定系统地总结学习一下来加深印象首先举例说明最常用的(对我来说) 本篇文章会不断更新,添加用到的,好用的stl模板万能头文件 <bits/stdc++.h>包含了我们需要的所有头文件不过唯一的缺点就是降低了编译的速度(...原创 2019-04-03 19:37:09 · 862 阅读 · 1 评论 -
石子合并
话不多说直接上题显示果实合并,洛谷的p1090,传送门问的是任取两堆合并,就相当于哈夫曼编码这里我是用的优先队列直接实现的#include <bits/stdc++.h>using namespace std;const int MAX=1e5+5;int a[MAX];int main (){ int n; cin>>n; pri...原创 2019-03-28 15:36:29 · 135 阅读 · 0 评论 -
素数筛总结
首先是埃式筛,就是从2开始,把所有2的倍数全都标记,第一次遍历时有未被标记的就是素数,然后再把他的倍数给标记。#include <bits/stdc++.h>using namespace std;/**** 埃式筛****/const int MAX=1e6+10;int n;int prime[MAX];int main (){ cin>>...原创 2019-03-13 19:55:58 · 90 阅读 · 0 评论 -
全排列总结
马上蓝桥杯省赛了… 菜鸡又是去当分母的…把一些基础的算法都总结一下,当作复习了首先最简单的是用stl中的next_permutation和prev_permutation了next_permutation(start,end) 是输出下一个排列,所以用之前要对数组进行从小到大排序void Perm(int* a,int n){ sort(a+1,a+n+1); do{...原创 2019-03-20 21:56:21 · 165 阅读 · 0 评论 -
康拓展开
康拓展开模板简单的说,康拓展开就是全排列数在自然数区间的一个映射比如,12345就是第一个全排列,所以对应的就是0(注意,从0开始)所以我们只要按公式展开就行了X = A[0] * (n-1)! + A[1] * (n-2)! + … + A[n-1] * 0!就是用该位的逆序对个数乘以当前序号的阶乘int cantor(int *a,int n){//a是全排列的数组 int...原创 2019-03-19 21:50:58 · 174 阅读 · 0 评论