- 博客(112)
- 收藏
- 关注
原创 STL集合
string定义迭代器string::iterator it;插入字符 在迭代器之前插入字符s.insert(it,'p');删除字符 删除迭代器指向字符s.erase(it);删除区间元素 左闭右开区间s.erase(it,it+2);替换 从a位置开始将长度为b的串替换为c字符串s.replace(a,b,c);查找a字符串第一次...
2018-05-25 11:04:52 523
原创 js知识点
JSON菜鸟的JSON教程 JSON 对象使用在大括号({})中书写。 对象可以包含多个 key/value(键/值)对。 key 必须是字符串,value 可以是合法的 JSON 数据类型(字符串, 数字, 对象, 数组, 布尔值或 null)。 key 和 value 中使用冒号(:)分割。 每个 key/value 对使用逗号(,)分割。**eg:**var myjson=...
2018-03-09 16:58:59 371
原创 前端知识点
1.不让用户选取内容 在不想让用户选取的容器css中添加以下代码 -webkit-user-select:none; -moz-user-select:none; -ms-user-select:none; user-select:none;
2018-02-06 13:16:57 305
原创 ACM生涯总结
1.关于个人 两年半的时间里,经历了大大小小许多场比赛,有的好,有的不好,有的打出了真正的实力,而有的因为小失误而错失了奖牌。两年前的这个时候估计我还是再iava工作室,因为举办省赛的时候在大一中选拔,我没有被选上,而又因为我根本没有3个人的完整的队伍,我看不到继续下去有什么希望,因为我当时认为,如果不能出去比赛拿到奖牌,那么所有的努力都将是白费的,毕竟3年来什么成果都没有根本就没有办法承受,
2017-12-09 14:50:58 518
原创 最小点覆盖,最小边覆盖,最大匹配,最小路径覆盖,最大独立集总结。
如果没有申明是什么图默认是二分图最小点覆盖:点覆盖的概念定义: 对于图G=(V,E)中的一个点覆盖是一个集合S⊆V使得每一条边至少有一个端点在S中。最小点覆盖:就是中点的个数最少的S集合。 普通图的最小点覆盖数好像只能用搜索解,没有什么比较好的方法(可能我比较弱。。)所以在此只讨论二分图的最小点覆盖的求法结论: 二分图的最小点覆盖数=该二分图的最大匹配数,具体证明的方法看大佬博客,里面还给出了如
2017-11-18 20:17:37 8964 1
原创 容斥或欧拉(hdu 5514)
传送门 题意:给定n个青蛙,每一个青蛙的步长是ai,可以无限次跳,总共有m块石头,编号从0~m-1,围成一个圆,刚开始所有的青蛙都在0号石头上,青蛙跳到的石头都被占据,问被占据的所有的石头的编号和时多少。 思路:假如a是一只青蛙的步长,则a*k是它可能走的所有情况(k为正整数),a*k%m的所有值就是这只青蛙你能跳到的所有石头,但是这样根本就求不出来,(a*k+b*m)%m的值和上面的值是相同的
2017-10-12 20:17:46 387
原创 母函数
hdu 1208 题意:给定n求将n进行整数划分的种类数。 思路:母函数。 什么是母函数呢?前面那个链接已经讲的很清楚了,不过有点理论化,可以看看这篇博客比较接地气。 我个人的理解就是将每一个东西能提供的价值看作是一个一元多项式的系数,然后将所有东西的一元多项式乘起来,然后系数就代表的就是组成系数的方案数有多少种。 普通型母函数#include<cstdio>#include<cstri
2017-10-02 11:08:32 522
原创 tarjan(hdu 5934)
题目链接 题意:给n个炸弹的坐标和爆炸半径,引爆代价。当另一个炸弹在一个炸弹的爆炸范围之内,则这个炸弹也会爆炸。求让所有炸弹爆炸的最小花费。 思路:根据炸弹之间的关系建图,比如a能引爆b就在a到b建立一条有向边。然后将图缩点,然后统计入度为0的点的爆炸代价,累加就是结果。 同一个强联通分量里面的点取价值最小的那个引爆,入度不为0的点肯定能由其他入度为0的点到达。#include<iostrea
2017-09-30 18:59:42 341
原创 中国剩余定理
poj 2891 大佬博客#include<cstdio>#include<cstring>#include<cmath>#include<queue>#include<iostream>#include<algorithm>#define LL long longusing namespace std;const int maxn=4e6+10;const int inf=0x
2017-09-28 21:08:12 272
原创 树的点分治
poj 1741 题意:给定n个点的一棵树,还有一个k值,问树上任意两节点之间距离小于等于k的有多少对。 思路:先将无根树转化为有根树,可以统计出来每个点到达根的距离,然后就可以将所有的节点深度排序,可以O(n)计算出满足题意的有多少种。 但是这样包含在同一棵子树中的两个节点的贡献值,而且还漏掉了在同一颗子树的两个节点的贡献,因为这样算的是通过根的距离,所以我们就可以将所有的情况都计算出来,然
2017-09-27 20:36:16 294
原创 后缀自动机
clj大佬论文 自己对于后缀自动机的理解:每一个节点代表的是具有相同的right集合的子串(right集合的定义具体去看clj大佬的论文),整个最后构成的有向无环图,可以看成是一棵树,step[i]代表的是right[i]中子串的最长长度也就是论文中所说的Max(i),pre[i]代表的是i节点在树中的父节点,这里和AC自动机里的fail指针有点类似,往上找就相当于找到的是当前串的后缀在SAM中出
2017-09-21 17:51:55 372
原创 树链剖分
题目链接 题意:给定一颗树,树上每一个节点都有一个权值,然后有q次查询, I a b c a节点和b节点之间的路径上的点的权值加上c D a b c a节点和b节点之间的路径上的点的权值减上c Q a 查询a节点的权值。 树链剖分是将树按照重链分成许多链,变成一个线性结构,这样就可以直接用线段树等数据结构处理了,每两个点之间链
2017-09-08 16:01:04 281
原创 hdu 6156(数位dp)
题目链接 题意:定义了一个f函数f(n,k)=k(如果数字n在k进制下是回文数字)否则的话f(n,k)=1。然后问在区间[L,R]之内进制在l到r之间的f函数的所有所有值之和是多少。 思路:因为进制比较小所以可以直接枚举进制然后再进行数位dp计算结果。#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>
2017-08-23 15:27:39 391
原创 hdu 6143
题目链接 题意:给定m个不同的字符,然后每个人名有姓和名两部分,长度都为n。问这姓名不同且姓和名不能有相同字符的人最多有多少种。 思路:我们可以枚举姓中的字符个数当姓的字符个数定了之后,名的选法就可以选剩下的全部字母了,然后方法有(m−i)n(m-i)^n,当姓不同时,不管名一样不一样,这两个都不是同一个名字。当枚举姓的字符数的时,当字符数为2时,方法不能是2n2^n因为这样会有全选1中字符的情
2017-08-18 11:08:36 465
原创 hdu 6109(并查集+set)
hdu 6109 思路:尽量让多的条件满足,当有一个条件和前面的冲突时,就是分隔符的时候,用并查集维护相同的数,set维护不同的数。当当两个数在同一个并查集中时代表两个数相同,不在同一个并查集是说明两个数可能相同也可能不同。当a在b的set中时代表b和a不相同。所以当我们每次判断两个数是否相同时先找并查集,并且要顺带更新set因为a==b,b\neq c,所以a\neq c但是这样每次更新一个并查
2017-08-15 10:29:46 495
原创 高斯消元
#include<cstdio>#include<cstring>#include<ctime>#include<map>#include<iostream>#include<algorithm>#define LL long longusing namespace std;const int maxn=300;const int inf=0x3f3f3f3f;int equ,v
2017-08-12 11:21:59 329
原创 bitset(hdu 6085)
题意:给定两个数组a和b然后q次询问,输出ai%bi==k的个数的奇偶性。 思路:可以转化为给a数组每个都减去k求(ai-k)%bi==0的有多少个,又因为只有当bi>k时才会有结果所以可以预处理处所有的答案为k的结果最后O(1)输出就好了。枚举k然后从大到小枚举bi每次都将bi的倍数统计出来 然后每次就可以算出(ai-k)%bi==0的有多少个了,具体的看代码和注释。 这里有一个关于bits
2017-08-11 16:44:17 390
原创 pollard_rho(大数质因子分解)
poj 1811 题意:判断一个数是不是素数,是的话输出prime否则的话输出这个数的最小素因子。 大佬博客 hdu 4344 题意:给出一个长为n(n小于2^63)的管子,现在要在管子上做标记,每隔L个长度单位做一个标记,从管子头端开始,保证最后一次标记恰好在管子的尾端。让你找出有多少个这样的L(n>L),且他们之间两两互素,然后求出这些L的和最大值。 思路:首先可以想到L肯定是n的因子
2017-08-08 08:42:31 936
原创 欧拉函数
这里面有详细的解释/*线性筛O(n)时间复杂度内筛出maxn内欧拉函数值*/int m[maxn],phi[maxn],p[maxn],pt;//m[i]是i的最小素因数,p是素数表,pt是素数个数,phi[i]是i的欧拉函数int make(){ phi[1]=1; int k; for(int i=2;i<maxn;i++) { if(!m[
2017-08-07 18:01:30 289
原创 Miller-Rabin随机性素数测试算法
大佬博客 个人比较菜会用板子就好了。 送上例题hdu 2138 虽然暴力可以过但是还是用来学算法吧。#include<cstdio>#include<cstring>#include<ctime>#include<iostream>#include<algorithm>#define LL long longusing namespace std;const int maxn=1
2017-08-07 17:40:44 841
原创 取模最短路
hdu 6071 题意:图上有4个点,给定一个k求从2点出发最后回到2这个点且距离不小于k的最短距离。 思路:题目上说的从2出发最后又回到2,所以这是一个回路,而两个回路可以形成一个新的回路,假如现在有两个回路,长度分别为a和b则可以形成新的回路长度a+n*b。题目上让求不小于k的最短路又是回路,所以我们可以找到从2点出发的最小回路将它看做前边提到的b则,我们只需要找到最小的a就可以找到最优解了
2017-08-05 12:46:13 842
原创 反素数
反素数定义 大佬博客 题目链接 给定一个n求因子个数为n的最小的值是多少。#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define LL long long#define ULL unsigned long longusing namespac
2017-08-04 18:38:13 1121 1
原创 NTT(快速数论变换)
大佬博客 和FFT一样都是快速求多项式乘法的,但是这个用的是整数,没有精度误差,运算起来也会更快。#include <cmath>#include <cstdio>#include <cstring>#include <iostream>#include <algorithm>#define LL long longusing namespace std;const int maxn
2017-08-04 16:20:15 514
原创 莫比乌斯反演
大佬博客 hdu 1695 题意:让求从a~b区间和c~d区间有多少对的数的gcd为k,不能有重复的,gcd(2,3)和gcd(3,2)算重复的。 莫比乌斯函数应用的经典题,先求出所有的值然后再减去重复区间的值就好了。假设F(n)的值为gcd(x,y)==n(a<=x<=b,c<=y<=d)的有多少种。 G(n)代表n|gcd(x,y),(a<=x<=b,c<=y<=d)的有多少种。 由莫
2017-08-02 18:57:07 278
原创 巧解容斥
hdu 6053 题意:给定一个a序列,让求有多少种b序列满足,b序列的对应值小于等于a序列的值,且b序列的任意区间的数的gcd>=2; 思路:任意区间的数的gcd>=2则说明,b序列任意两个数不互素,这就可以枚举约数,假如约数为k,则a序列的每个数ai的贡献为ai/k向下取整个值,全部乘起来就是约数为k的b序列种类,,每种余数之和就是ans,但是会有重复的,后面容斥一下就好了。#include
2017-07-28 17:40:04 341
原创 lucas定理
题目链接 大佬博客还有扩展lucas 题意:给你n和m求C(n,m)。 C(n,m)=n!/(m!*(n-m)!); 当题目数据不是很大的时候可以打表,存一个阶乘表和逆元表,这样就可以直接计算了,但是当n和m很大的时候,就要用lucas定理了,前提是模数要是素数。 lucas定理:C(n,m)%p=C(n/p,m/p)*C(n%p,m%p)%p; 逆元:由费马小定理a ^ (p-1) =
2017-07-27 11:54:07 566
原创 各种数论定理
小技巧 当算某个数的阶乘或者算很大的次方的时候,可以将数字转换为10^n的进制表示方法(比如1000进制或者10000进制),这样出来点的数字和原答案是一样的,只不过在一个数组的一个元素中多存了几位。约数个数定理 首先,n可以分解质因数:n=p1^a1×p2^a2×p3^a3*…*pk^ak, 由约数定义可知p1^a1的约数有:p1^0, p1^1, p1^2……p1^a1 ,共(a1+1)个
2017-07-27 09:13:41 1103
原创 字符串hash
大佬博客 题目链接 题意:刚开始给定n个字符串,每一个字符串有一个权值,后面有q次询问,1代表将a字符串的权值改为吧,2为询问有多少个字符串的后缀包含a并且权值是小于等于a字符串的权值的。 思路:上面大佬的博客里面讲了字符串的hash,这道题预处理处每一个字符串的hash值,然后n^2统计出任意两个字符串之间的后缀关系,最后用nq的复杂度查找就好了。#include<cstdio>#incl
2017-07-24 18:37:16 352
原创 伸展树(Splay)
codevs 4655序列终结者 Splay树是一个优化过的二叉搜索树,所以它满足二叉搜索树的性质,二叉搜索树有可能退化为一条链,n^2的时间复杂度,而Splay经过一系列的旋转操作使其平均复杂度控制在log(2)n但是常数比较大,因为要进行一系列的旋转操作。/*因为Splay_tree满足排序二叉树的性质,所以当查询或者修改某一个[L,R]区间的时候,就可以将L旋转到跟的位置,将R旋转到根的
2017-07-22 10:23:52 405
原创 Treap
POJ - 3481 警告:千万不要初始化种子,这oj会RE被坑了一天QAQ。 Treap就是一个用随机数优化了的二叉搜索树,二叉搜索树满足某个节点的值大于等于左儿子节点的值,小于右儿子节点的值,但是这样插入的值就会有可能形成一条链造成很低的效率,所以采用了用随机数优化的方法,随机的给每一个节点赋予一个优先级,在插入节点时,节点的优先级满足堆的性质(小顶堆或大顶堆),值满足二叉搜索树的性质,这就
2017-07-19 17:35:49 270
原创 动态主席树
ZOJ 2112 题目大意:给n个数,有m个操作。修改某个数,或者询问一段区间的第k小值。 动态主席树的意思就是原来的数组已经建好主席树了,然后又要修改数组中的某个值,然后还有许多查询,当然不止一次修改。 如果我们每次都建立主席树的话假如有n个数m次修改就是n*m的时间复杂度,这在n,m很大的时候就不行了,于是我们就新引进树状数组来存数组的变化值,当每次查询的时候只要将原来主席树里的值算出来,
2017-07-17 10:16:31 814
原创 静态主席树
POJ - 2104 主席树和值域线段树存的值都是一样的,但是主席树是n棵线段树,第i棵线段树存储的是i和i之前的所有信息(和前缀和类似),所以在求有关区间L~R的时候就可以用第R棵线段树减去第L-1棵线段树对应节点的值就得到了L~R之间的线段树。 类似值域线段树,没次插入一个数的时候最多修改一条树链,所以我们在给每个节点都建议可线段树的时候,它和前一棵线段树的差别也只有一条链,所以当我们在建第
2017-07-13 15:27:35 340
原创 值域线段树
题目链接 题目可转化为值域线段树的写法,题目上说让求所有区间和的值在L到R之间的有多少个,每一个区间值可以由数组的前缀和快速求出来,设sum[i]为i之前的和,i小于j即求sum[j]-sum[i]在L到R之间的有多少个,可以转化为 sum[j]-R<=sum[i]<=sum[j]-L,用sum[i]建一颗值域线段树每次询问在sum[j]-R到sum[j]-L之间的值有多少个累加起来就是结果。/
2017-07-11 18:42:39 1161
原创 hdu 2243 AC自动机+dp(矩阵快速幂优化)
做这个之前建议做一下poj 2778 这道题要求长度小于等于m的字符串包含所给串的有多少种,可以算出所有的情况然后减去不包含所给串的情况就是所求的。 大佬博客 大佬博客 矩阵里面存的是从i节点到j节点走一步共有多少种走法(不能走题目上给的字符串)。 然后将这个矩阵m次幂就可以求出走m步(长度为m的字符串)有多少种不包含做给串的字符串。小于等于m将其各个次幂加起来就好了,可以改一改矩阵一次就
2017-07-07 17:38:47 360
原创 字符串的最大最小表示法
算法描述:给定一个字符串s,可以进行左循环(右循环)移位,总共的结果有strlen(s)种,在这些结果中最小的是那个,最大的是哪个。 详解描述 论文传送门 HDU3374 题目意思:给定一个字符串s求循环几次会是字典序最小的(最小表示),最大的(最大表示),分别会出现几次。 思路:第一个用上面提到算法就可以算,后面的只需要求出以为后的有几个循环就就好了。#include<cstdio>#
2017-07-05 11:50:41 465
原创 扩展KMP
详解链接 hdu4300题解链接#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=1e6+10;int Next[maxn],extend[maxn];void get_next(char a[]){ int len
2017-07-04 20:24:29 311
原创 Manacher算法--O(n)回文子串算法
马拉车算法详解地址#include<cstring>#include<cstdio>#include<iostream>#include<algorithm>using namespace std;int p[2000010];//记录以s[i]为中心的回文串最大可向右延伸几位,p[i]-1为原串以i为中心的最长回文串长度int Find(string s){ int mx=0
2017-07-04 15:31:41 339
原创 kmp
/*kmp的next数组存的是i之前的串的前缀和后缀的最长匹配长度*/#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>using namespace std;int next1[10100];int bmBc[10100],suff[10100],bmGs[10100];string st
2017-07-04 10:15:03 310
原创 01背包变形(poj2184)
题目链接 题意:给定n头牛,每一个牛都有一个智商和默契值,要求选出一些牛,使得它们的智商和>=0且默契和>=0是智商和+默契和最大; 思路:没有 0.0。。。最后还是看了好久大佬的博客才想通的; 吧前面的值看做01背包的费用,后面的值看做01背包的价值; dp[i]代表费用为i时最大价值是多少,因为有负数所以想了好久都没想到怎么处理,最后看到大佬的解法,将10w这个点看做坐标轴原点,大于10
2017-04-26 19:46:04 374
原创 计数dp
1265: Hmz 的女装 思路:当起始点颜色固定后,我们可以依次求出其往后的每个点的涂色方式,包含和起始点颜色相同还有和起始点颜色不同,而当前点的状态可以由上一个点的状态推出来,最后选择和起始点不同的方式数就好了(起点终点颜色相同),又分成了两段,两段相成就好;#include<cstdio>#include<queue>#include<cstring>#include<iostream
2017-04-24 10:52:16 700
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人