03 2015 档案
摘要:三分,对于单凸的函数(单调的也可以),可以找出最值。这道题可以感性认识一下。。。。。。 1 /************************************************************** 2 Problem: 1857 3 User: idy002 4...
阅读全文
摘要:其实这个用的是Mobius反演的第二种形式F(d) = (n div d) * (m div d)f(d) = [ gcd(i,j)=d ] (i in [1,a], j in [1,b]) 1 /***************************************************...
阅读全文
摘要:收获: 1、积性函数的积也是积性函数,基本的积性函数:常数函数,正比例函数,欧拉函数,Mobius函数,积性函数一般都知道表达式,所以一般都可以在线性筛时搞定。 2、遇到整除求和时,这个东西就已经是最简了,所以可以考虑提出它,然后尝试搞后边的东西的前缀和,如果可以成功,那么就可以在O(sqrt(...
阅读全文
摘要:收获: 1、当一个东西的取值范围很小时,或者感觉它很麻烦时,就枚举它 2、熟悉mobius函数、euler函数的和函数,以及euler函数用mobius函数的表示。 3、下取整分块理解更深了。 1 /***********************************************...
阅读全文
摘要:感谢PoPoQQQ 1 /************************************************************** 2 Problem: 3529 3 User: idy002 4 Language: C++ 5 Result: A...
阅读全文
摘要:收获:当一个东西的取值有限时,我们可以枚举它,然后统计它被计算了多少次。 1 #include 2 #include 3 using namespace std; 4 5 typedef long long dnt; 6 7 int prm[10000010], isnot[10000010...
阅读全文
摘要:[n/x] = yxx = [n/y] 则xx是最大的被除数,使得商向下取证不变。 1 /************************************************************** 2 Problem: 2301 3 User: idy002 4 ...
阅读全文
摘要:题意:有一个从小到大的由不包含平方约数的数组成的数列,从1开始,求第k项。“满足某种限制的数的第k个”+二分答案="前n个数有多少个数满足限制“求[1,n]中有多少个数没有平方约数,我们考虑求满足要求的数的补集。求[1,n]中有多少个数有平方约数,我们考虑枚举约数后用容斥解决。设Ai为包含[1,n]...
阅读全文
摘要:Splay 每个节点维护一个区间。 1 /************************************************************** 2 Problem: 3595 3 User: idy002 4 Language: C++ 5 ...
阅读全文
摘要:1 /************************************************************** 2 Problem: 2152 3 User: idy002 4 Language: C++ 5 Result: Accep...
阅读全文
摘要:对每个重心保存,依次遍历子树,记录下距离为d的深度最小的路径,在遍历时用遍历过的其它子树更新答案。收获:对于当前子树,可以写两个遍历函数,一个用于更新答案,一个用于更新维护的信息。 1 /*******************************************************...
阅读全文
摘要:终于自己独立A了一道点分治。点分治的题目和树规的题目很像,都是在树上乱搞,但点分治一般和路径更相关,如果用树规做会感觉冗余状态太多,内存和时间都无法承受,如果不用动态规划,直接在原树上运用这道题的方法,又无法保证时间复杂度(点分治让我们的算法对原树的形态依赖更小,可以保证时间复杂度)。 1 /**...
阅读全文
摘要:第三道点分治。首先找到黄学长的题解,他叫我参考XXX的题解,但已经没有了,然后找到另一个博客的简略题解,没看懂,最后看了一个晚上黄学长代码,写出来然后,写暴力都拍了小数据,但居然超时,。。。。然后改了一下存图方式,还是T,读入优化,还是T,最后把BFS找重心改成DFS找重心后才过的(因为DFS只遍历...
阅读全文
摘要:大概思路:树点分治,重心树中每个重心维护一个总的平衡树,树中保存属于该重心的点到该重心的距离,然后对于去掉该重心后形成的子树分别再保存一份。用这种方式实现的话,还可以支持修改与多次查询,每次操作都是O(logn*logn)感悟:点分治正如一个前辈说的,是“借助”重心的力量,来维护与查询与某点距离相关...
阅读全文
摘要:第一道树的点分治。感谢:http://blog.csdn.net/u013368721/article/details/40887575首先,找出原图的重心(最大子树大小最小的点(如果作为根)),去掉它后原图就分成了若干的森林,再在对应的森林中找出重心,递归这个过程(只有一个点时返回)。这样,我们就...
阅读全文
摘要:先将问题转化为带修改的求区间小于某数的数的数量,然后用树状数组套值域线段树解决。注意: 1、值域线段树要包括0 1 /************************************************************** 2 Problem: 2120 3 ...
阅读全文
摘要:f[pos][top]统计数字个数g[pos][top][digit]统计数位(对于f[pos][top]中的所有数) 1 /************************************************************** 2 Problem: 1833 3 ...
阅读全文
摘要:很久以前做过的一道数位DP,现在用一种新的解决数位DP的比较一般的方法。数位DP裸题是:求[L,R]有多少个数。先转化成求[0,R]有多少个数,然后区间相减即可。对于[0,R]中的所有数,用0补齐前面的空位,使得每个数的长度都为R的长度。状态:dp[pos][0]表示从最高位到pos位,没有顶上界的...
阅读全文
摘要:题解见:http://blog.csdn.net/qpswwww/article/details/44407371收获: 1、对于一个问题,看似不可做,但一定存在一定特点,我们要做的就是找出一些特点(比如最有解有什么特点,怎样做会尽可能优),尝试强化(加更多的限制)或弱化(减少一些限制)问题看会出...
阅读全文
摘要:题意:给定一个串,和一个数c,求一个长度最大的公共子串(可以重叠),并且该公共子串出现次数大于c。题解见罗穗骞论文。收获: 计算高度函数时,遇到rk[i]==1的点时,要将k设置成0。(k是"h[i-1]-1")。 1 #include 2 #include 3 #include 4 #de...
阅读全文
摘要:题意:给出一个串,求两个不相交的长度相等的子串,使得对应位置的差相等。题解:首先,假设串是a[0],a[1],...a[n],先作差,即a[1]=a[1]-a[0],a[2]=a[2]-a[1],a[i]=a[i]-a[i-1],然后我们求a[1],a[2],a[3],...a[n]的两个不相交的公...
阅读全文
摘要:第一道后缀数组后缀数组要维护三个数组:sa(suffix array), rk(rank)和ht(height)。含义分别是:sa[i]:将后缀按照字典序排序后,第i大的后缀的起始位置。rk[i]:起始位置为i的后缀的排名。ht[i]:起始位置为i的后缀与排名为rk[i]-1的后缀的最长公共前缀。对...
阅读全文
摘要:较水的网络流。 1 /************************************************************** 2 Problem: 1779 3 User: idy002 4 Language: C++ 5 Result...
阅读全文
摘要:收获:树上直径一定包含深度最深的点。然后O(nlogn)暴力。 1 /************************************************************** 2 Problem: 1776 3 User: idy002 4 Languag...
阅读全文
摘要:这是一道环上的问题,我们先将一个环展开,再复制一次。这样,任何一个合法方案一定对应在转换后的序列的一些连续的区间,使得它们的并的长度大于等于圈长。然后,我们将区间合并一下(就是将一些被其他区间包含的区间去掉)。假设某个答案的区间是r1,r2,r3,...rk,我们可以让ri为"与ri-1连接的右端点...
阅读全文
摘要:对于关系,看其是否是“等价关系”,即满足:自反,传递,对称。如果是可以用并查集来连接等价类。这道题是求原图补集的联通快个数,考虑原图度最少的点(由鸽巢原理,最多为2*e/n个)。先将未与其连边的点并在一个集合中,然后再用剩下的点暴力,每次O(n),最多暴力O(2*e/n)次,所以总的复杂度是O(e)...
阅读全文
摘要:dp[i][j] 表示,在AC自动机中,从根节点开始,走了i条边,并且经过的点不包含危险节点,走到了j节点的路径数。收获: 1、正难则反 2、一个字符串不包含给定pattern中的任何一个,则该字符串在AC自动机上走时不会走到“危险节点”。 3、DFS可以做的事情,可以考虑DP来做。 1 #i...
阅读全文
摘要:收获: 1、AC自动机可以在建立fail时将一些不存在的儿子指针指向对应的位置。 2、判断环时不要想当然地写个这样的版本:bool dfs( int u ) { if( vis[u] ) return true; vis[u] = true; for( int t=0; t11...
阅读全文
摘要:ac自动机中,如果以trie中的节点为节点,(fail[i],i)为边,可以建立一颗树,该树有如下特点:“节点u是节点v的祖先 当且仅当 u代表的字符串是v代表的字符串的一个后缀”。(u代表的字符串是由根节点到u路径上所有的边代表的字符顺次组合成的,我们记作str(u))。本题中的每一个P都对应tr...
阅读全文
摘要:收获:AC自动机定数组大小时,如果不确定,就定10^6(极限了) 1 /************************************************************** 2 Problem: 3172 3 User: idy002 4 La...
阅读全文
摘要:第一道AC自动机题目。记一下对AC自动机的理解吧:AC自动机=Trie+KMP。即在Trie上应用KMP思想,实现多Pattern的匹配问题。复杂度是预处理O(segma len(P)),匹配是O(len(T))。应该也是下界了。它预处理做了以下事情: 1、建立所有Pattern的Trie 2、...
阅读全文
摘要:练习 trie 1 #include 2 #include 3 #define maxn 1000000 4 5 struct node { 6 int v; 7 char *str; 8 node *son[26]; 9 }pool[maxn], *tail=pool...
阅读全文
摘要:第一道trie还需要写题来建立自己的代码习惯。 1 #include 2 #include 3 #include 4 #define maxn 20010 5 using namespace std; 6 7 struct node { 8 char v; 9 int sz;...
阅读全文
摘要:KMP的next数组,对于next[i],是:1~i-1的最长的匹配的前缀和后缀的长度(也即在i位置匹配失败后,应该跳到的模式串的位置)然后我们将所有满足要求的字串按照它的末尾位置分类。 1 #include 2 #include 3 #define M 10007 4 #define maxn...
阅读全文
摘要:读入优化有3s多。 1 #include 2 #include 3 #define maxn 1000010 4 #define maxm 10010 5 6 int n, m; 7 int aa[maxn], bb[maxm], f[maxm]; 8 9 void gn( int &rt ...
阅读全文
摘要:开始补坑。kmp中的fail数组fail[i]是指“当模式串的i位置匹配失败时,应该再用模式串的fail[i]位置匹配“ 1 #include 2 #include 3 #define maxn 100010 4 5 char aa[maxn*2], bb[maxn], cc[maxn]; 6...
阅读全文
摘要:二分答案,网络流是否满流判断合法性。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 210 6 #define oo 0x3f3f3f3f 7 using namespace std; 8 9 str...
阅读全文
摘要:题意弄了半天:给出一个有向图,带边权,src,dst. 求出src到dst的最大流,再求出从src到dst流量最大的路径的流量,求它们的比值。 1 #include 2 #include 3 #include 4 #include 5 #define oo 0x3f3f3f3f ...
阅读全文
摘要:将一个无向图分成许多回路,回路点交集为空,点幷集为V。幷最小化回路边权和。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 2010 6 #define oo 0x3f3f3f3f 7 using namespace st...
阅读全文
摘要:给出一个有向图,以及src和dst。判断是否存在从src到dst的两条路径,使得除了src和dst外,没有其它点同时属于两条路径。给每个点一个为1的点容量(src和dst为2),边的容量也是1,然后判断最大流是否大于等于2.收获:边不能重复:将点拆成两个点考虑,然后考虑匹配。点不能重复:给每个点一个...
阅读全文
摘要:和HDU 1565是一道题,只是数据加强了,貌似轮廓线DP来不了了。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 2510 6 #define oo 0x3f3f3f3f 7 using namespac...
阅读全文
摘要:黑白染色,源指向白,黑指向汇,容量都是方格中数的大小,相邻的格子白指向黑,容量为oo,然后求一次最小割。这个割是一个简单割,如果只选择不在割中的点,那么一种割就和一个选数方案一一对应,割的大小就是不选的那些数的大小,我们需要最小化这个值。答案=总和-最小割 1 #include 2 #incl...
阅读全文
摘要:题意:给出一个有向图,边带权,求一些环,使得每个点属于且仅属于一个环,幷最小化环边的权值和。思想和最小路径覆盖是一样的,将每个定点拆成两个点,假设u拆成u1,u2,那么所有边(v,u)对应新图中的(v1,u2),(u,v)对应(u1,v2)。然后会发现一种合法方案和新图(是一个二分图)的一个完美匹配...
阅读全文
摘要:好吧,这道题我是T掉了,也不想去写二分的算法,写这个是记录下这个收获:网络流中如果出现极端数据(一方很多,一方很少),那么可以考虑是否可以压缩,这道题就可以将人按照可以居住的星球的情况分类,然后就大大减少点和边。T了的代码: 1 #include 2 #include 3 #include...
阅读全文
摘要:每个栅栏其实就是一条边,修一些栅栏,使得狼不能抓到羊,其实就是求一个割,使得羊全在S中,狼全在T中。 1 #include 2 #include 3 #include 4 #include 5 #define maxn 40010 6 #define oo 0x3f3f3f3f ...
阅读全文
摘要:以前用KM写过,现在再用费用流写。 1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7 #define abs(a) ((a) edge; 19 vector g[maxn]; 20...
阅读全文
摘要:资源分配,每个时间点有m个机器可用,要将这资源分配给n个任务中的一些,要求每个任务在自己的时间范围中被分配了p[i]个资源,建图:建立源,与每个时间点连边,容量为m,每个任务向其对应的时间段中的每个时间点连边,容量1,每个任务向汇连边,容量为该任务需要的时间。收获: 本题中的有:任务,时间,机器三...
阅读全文
摘要:我们知道二叉搜索树的中序遍历是一个已经排好序的序列,知道序列我们无法确定树的形态(因为有多种)。但是,Treap如果告诉我们它的关键字以及权值,那么就可以唯一确定树的形态(Treap的O(logn)的期望时间复杂度就是依靠一个随机堆的深度不会太深)具体的,已知关键字序列:k1,k2,k3...kn和...
阅读全文
摘要:我的第一道需要程序建矩阵的矩阵优化DP。题目可以将不同的p分开处理。对于p==0 || p==1 直接是0或1对于p>1,就要DP了。这里以p==3为例:设dp[i][s1][s2][r]为前i列,结尾为0的有s1行(0表示女生,1表示男生),结尾为01的有s2个,结尾为011的有n-s1-s2个,...
阅读全文
摘要:题意:给出平面上一些线段,在线询问与x=x0相交的线段中,交点y最大的线段的标号,支持添加线段。大概思路:用线段树维护,线段树每个线段记录贯穿(左右端点在该区间外或上)的原线段中能覆盖其它贯穿该线段的原线段(即每个线段树线段记录贯穿该线段的所有原线段中“最高”的)细节:添加原线段s到线段树线段nd:...
阅读全文
摘要:感谢:http://blog.csdn.net/ggggiqnypgjg/article/details/6645824/O(n)求给定字符串的以每个位置为中心的回文串长度。中心思想:每次计算位置i的答案时,利用已经算出的1~i-1位置的答案。 1 #include 2 #include 3 #...
阅读全文
摘要:此文以祭奠因低级错误而导致调试很久而失去的时间。20130302取模的时候,如果写成这样:a = b%M * c%M * d%M要保证b,c,d在M以内,否则要写成a = (((b%M) * (c%M)) * (d%M))%M20130305题目说“对答案mod 1000000007"指的是要“(x...
阅读全文

浙公网安备 33010602011771号