莫比乌斯系数的筛法 利用线性筛完成的莫比乌斯系数(函数)的推导 注意mu[1]=1;void init(){ mu[1]=1; FOR(i,2,M-1){ if(!mark[i])prime[++cnt]=i,mu[i]=-1; for(int j=1;j<=cnt;j++){ int t=i*prime[j]; i
线性筛 线性筛O(n) 推导一下复杂度: 对于第二重循环 可发现30=2*3*5是由15=3*5推出来的 有一个数的最小质数为x 则可用小于等于这个x的质数推出其他合数 那么每个数只会被推出一次(它只有一个最小质数) 所以总的复杂度为O(n)#includeusing namespace std;#define FOR(i,x,y) for(int i=(x),i##_END=(
中国剩余定理 中国剩余定理,是建立在扩展欧几里得上的算法 用来求线性模方程的解 即给出许多模数mi,然后给出余数ai,求原数x 代码如下struct China{ #define N 5 LL A[N],p[N],T[N],m[N],T1[N],M; int n; void exgcd(LL a,LL b,LL &x,LL &y){ if(!b){x=1;y=
莫队算法 莫队算法较为朴素,适用于大部分的区间查询,主要在于对询问的排序 和区间的滑动 排序参照一下模板struct node{ int l,r,id; bool operator <(const node &_)const{ if(_.l/S!=l/S)return l<_.l; return r<_.r; }}Q[M];然后是L和R的滑动int
AC自动机专题小结 最近比较忙,AC自动机专题花了两个大周才勉强推完关于与AC结合的一些题型如下: 1.AC自动机模板题 废话 2.AC自动机结合dp 经常会和矩阵联系起来或是一些转移的预处理(trie图),但都比较裸 3.AC自动机加fail树 个人理解是前缀树上的后缀树模板题就不说了Problem J可以看出是道dp题 但是发现串的长度很大 这种题的一般思路是: 1.先敲暴力 2.矩阵快速幂优化
矩阵快速幂 一道模板题 可以发现相乘的三个for可以都for到n 矩阵可以把时间复杂度缩为n3logkn^3logk#include<bits/stdc++.h>using namespace std;#define FOR(i,x,y) for(int i=(x);i<=(y);i++)#define P 1000000007void Add(int &a,int b){ a+=b;
AC自动机 一个自动AC的东西... 套用KMP的fail指针,然后再是利用字典树进行字典与文章的匹配 以下是模板#include<bits/stdc++.h>using namespace std;#define FOR(i,x,y) for(int i=(x),i##_end_=(y);i<=i##_end_;i++)#define DOR(i,x,y) for(int i=(x),i##_end
树上统计 解法很多,主要有主席树+dfs序 树上差分 树上启发式合并 线段树合并1.主席树+dfs序#include<bits/stdc++.h>using namespace std;#define FOR(i,x,y) for(int i=(x),i##_end_=(y);i<=i##_end_;i++)#define DOR(i,x,y) for(int i=(x),i##_end_=(y
2017NOIP游(gun cu)记 Day 0 就像初赛那样,天上飘着小雨,放眼望去,所有人都躲在屋檐下 穿着各色的校服,扎堆在一起 下了车,和zyl撑一把伞,缓缓向人群中走去…没有想到时间是如此之快4月21日,我在125上A了第一道题——A+B problem 记得那时连全角半角都分不清,导致交上去CE了好多次 旁边的小C帮我指出了错误 我急着在提交板上改,结果就被gay了… 记得那时有很多同学去那学了两三天,但放弃的
区间第K值(可持久化线段树) 可持久化数据结构的一个经典应用 可以说是建k个线段树,但只用nlogn个节点 代码实现#include<bits/stdc++.h>using namespace std;#define FOR(i,x,y) for(int i=(x),i##_end__=(y);i<=i##_end__;i++)#define DOR(i,x,y) for(int i=(x),i##_end__=(y)
Trie树 一种用于检索的数据结构 大致就是开一个数组,记录节点 然后记录经过这个节点的字符串个数,以及这个节点表示的字符串个数 分别用pre pass end记录 复杂度大约为len∗mlen*mm为操作数,len为字符串长度 复杂度很小,但内存会比较大 代码实现如下:struct Trie_Tree{ static const int M=3000005; int pre[M][
2017-11-9离线赛总结 (NOIP七连测第七场) 失分小结: 估分:175 实际分数:155 最后一题范围判错,痛失20分 这个NOIP最后一场离线赛全程敲暴力听说是用来攒rp的 第二题有想法是个人都有,然后无法实现…. 最后一题其实还是蛮水的,有时正解还是要冲一冲的 但想都没想就丢了个暴力上去,然后就被拉开四五十分了题解就不挂了毕竟最后一场,没什么心情写题解距离NOIP还有一天 fighting !
2017-11-8离线赛总结 (NOIP七连测第六场) 失分小结: 估分:160 实际分数:170 今天身体不舒服,第三题理所当然地爆零了搞起来状态好就会写一样 前面两题还过得去,该水的分都水到了,只是第二题的正解敲了半天没调出来有些可惜还是代码功底弱的原因 第一题: 感觉自己的写法有些鬼畜瞎凑出答案 bfs+dfs, bfs保证每步最优,dfs求联通块struct node{int x,y,sp;};queue<node>q;int
2017-11-7离线赛总结(NOIP七连测第五场) 失分小结: 估分:290 实际分数:270 今天的题目难度较小,除了第二题炸了longlong 致命错误以外,整个流程走的还是不错的,先是花了一个多小时水到200(100+60+40) 然后回头看第二题,发现是到水题,直接gang掉 然后第三题,想了蛮久的,正打算打表找规律的时候,xiaoC过来说set中没有重复元素 ???这不是道水题吗 然后一波高精,除了3的数据其他的数据都过了
2017-11-6离线赛总结(NOIP七连测第四场) 失分小结: 估分:155 100+20+35 实际分数:140 100+20+20 考完太突然发现第二题的正经切分的运算被删掉了,实际的20分是玄学解法帮我水的… 第三题由于造数据太烦,就没有怎么去管他,然后dp顺序的错误导致又失去15分 本来的考试note上写的预估分数是100+30+50,后来感觉第二题只有20分不太好,就放弃写第三题下面15分,回过头去写第二题 但又因为第二题
2017-11-5离线赛总结(NOIP七连测第三场) 失分小结: 估分:100+80+40=220 实际分数:100+10+35=145 和估分相差甚远,主要是由于第一题的难度提升 又在第一题上卡了太久,导致第二题随便打了个暴力后又去水第三题 虽然主体顺序是没有错的,但是心态就不一样了,想着多水点分,又感觉时间来不及,虽然最后第二题想到了最小生成树,但又因为取边取错爆炸,暴力(dp)写错 题解: Task 1: 第一题如果直接考虑两个数
Tarjan求强连通分量 强连通分量可以用Tarjan求 比两遍dfn大概快30%定义一个栈 把点压进去,然后根据自己所能到的点,求出能到达的dfn序最小的点 由此得到从此点到low点中的点(在栈中)可以成为一个强连通分量 具体实现是当x点满足dfn==low时,将栈中的点全部弹出至x点; 可以证明每个点最多被弹出1次,每条边最多被遍历一次 复杂度为O(n+m)O(n+m)int col[N],sz[N],cnt
2017-11-4离线赛总结(NOIP七连测第二场) 估分:270 实际分数:280 这次的难度略小于NOIP 最后一道题作为水题竟然没有做出来 第二题又又又叒卡过去了hahahahhahahahahah 实际正解也是好敲的,谁知道其实内存开的是256MB 题解: 第二题: 一看到颜色的个数如此诡异,就可以想到是用状压 然后模拟颜色的排序,求逆序对(预处理) 直接状压dp的复杂度是n2∗2nn^2*2^n 可以水到90分 然后如果
LCP 最长公共前缀 定义dp[i][j]为从n到i点及j点的最长匹配长度 状态转移方程为if(str[i]==str[j])dp[i][j]=dp[i+1][j+1]+1else dp[i][j]=0循环顺序for(int i=n;i>0;i--){ for(int j=n;j>0;j--){ }}这种算法可以快速地O(1)求出两个子串的匹配长度 可以运用于dp的优化