随笔分类 - 一些研究
摘要:dp的优化众多,但用图论模型去解决实在巧妙。BZOJ 1981: [Google Codejam2010]Fence用剩余类加spfa解决。由于L特别大所以可以这么搞。http://cdqz.openjudge.cn/2015/1014/dp方程为:f[i]=min(f[j-1]+abs((i-j)-a[j]),1<=j<=i。最朴素实现为O(N^2)。可以将绝对值打开,用线段树维护,复杂度为O(NlogN)。但还是被卡掉了。假设我们当前读入到I,那么我们不妨先假设i只能到i+a[i]+1(代价为0),这时候我可以往前和往后走(代价为1)。将其抽象成一张图,从0开始走那么dis[n
阅读全文
摘要:一些统计维护的问题原文下载地址@http://pan.baidu.com/share/link?shareid=2769571370&uk=36862589树形数据结构方法NOI2005 sequence区间插入、删除、统一修改、翻转、求和、求最大子序列伸展树Spoj 10628. Count on a tree无修改的区间/树链上第K大划分树主席树 CTSC2008 nextwork有修改的区间/树链上第K大树套树 BZOJ3083: 遥远的国度 树的换根、链修改、子树查询 树链剖分BZOJ2631 Tree(伍一鸣)树的合并、分离、加减、询问Link-Cut Tree Bzoj31
阅读全文
摘要:Problem Zero:[neerc2011]Gcd guessing game现在有一个数x,1 ≤ x≤ n,告诉你n,每次你可以猜一个数y,如果x==y则结束,否则返回gcd(x,y),问最少只要几次就可以保证猜出答案。本题纯属娱乐。仅仅是一个GCD的游戏,跑题了。因为本题要求最坏情况,我们...
阅读全文
摘要:经典问题的非经典解法N皇后问题 主要来源:Matrix67这是一道行列式计算的经典例题,历史悠久,喜闻乐见。一个十分简单的,并且没有多少限制的是镜像优化,可以减少一半的搜索量,我记得没错USACO那道朴素算法再加这个优化就能A了。然后就有不少神牛提出了许多高深的优化方法。比如最后一个直接确定,无需再搜。比如链表,减少了对无用位置的检查,只是删除和还原时比较烦。【我会告诉其实我至今不会链表吗】比如改为非递归,但是代码量。。。不敢恭维。非经典解法之位运算我们可以记录三个状态S1,S2,S3 表示当前每行中、两条对角线上哪些位置分别被占。然后位运算牛就牛在我们可以O(1)算出某个数最右边的1 在哪里
阅读全文
摘要:给定一棵树,求出分别以每个点为根的树的深度。其实这道题是四五月份时宁波初中比赛时的题目,当时的数据范围自然是1000,然后O(n^2)水过。当时比赛时题做完了,闲的无聊,打算想一想O(n)做法,当时也感觉挺可做的。几个月后突然想起来,今天就写了一下。算是一道树形dp吧。这题描述简单,做法也算有趣,自己感觉是个有意思的问题。解答也一句话,意会即可:每个点的深度=MAX(每个点向下的最长路,每个点向上的最长路);每个点向下的最长路=MAX(子树的向下的最长路)+1;每个点向上的最长路=MAX(父亲向上的最长路+1,父亲向下的次长路+1)【当这个点是父亲最大的儿子时】, 父亲的深度+1【当这个点不是
阅读全文
摘要:问题概述:共有N个K元组(x1,x2,x3…xk),一个K元组最大,当且仅当没有一个K元组每个xi都比它大。求最大K元组。一般地,为了问题更加简洁,每个xi都为小于等于N的正整数,K看为较小的常数。朴素算法无论K等于几,均可在至多O(n^2)时间内解决。当K=1时,O(n)查找。 相关题目:不解释当K=2时,O(n)双关键字基数排序。 相关题目:NBOI2011牛人(xi任意,快排即可)当K=3时,O(nlogn)线段树。 相关题目:空心长方体当K=4时,O(nlognlogn)树套树。 相关题目:东方幻想乡模拟赛第5场yousei当K=5时,O(nlognlognlogn)树套树套树。当K=
阅读全文
摘要:对于图论中的某些问题,我们为了方便解决问题,一种常见的解题策略就是“拆”。这里我给出拆点和拆边的两个典型例子,算一个学习笔记把。拆点:网络流网络流中会遇到“某个点只能经过一次”这样的限制条件。由于经典的网络流算法是对边的限制,所以可以将点X拆成<X.a>,<X.b>。原来连入点的边连<X.a>,原来连出点的边连<X.b>。这样我们就可以通过对(<X.a>,<X.b>)的限制来限制点了。拆边:带花树给一个无向图和一个对应的顶点度序列(可以不与原图相同)。删去图中一些边能否使顶点的度与序列一一相同。一条无向边e连着两个点x,y
阅读全文
摘要:第一次换语言写代码,有感而发,打算做一个小小的对比。P:优点:通俗易懂、清晰流畅调试方便缺点:界面不美观用的人少直接可使用算法少C++:优点:紧跟时代潮流、用的人多语言灵活、变量随意定(区分大小写)、循环很精巧直接可使用算法(STL等)多#define操作相当灵活缺点:头文件等很烦运算符,名称很乱,看不懂,尤其是等号需打==数组定义要一个个打过来,下标不能负IO操作奇怪函数不能赋值最后需要return 0打开慢、编译慢调试不方便兼容性不好(int64需区分windows和Linux等)
阅读全文
摘要:作为一种特殊的网络流——费用流,是在原最大流的基础上,每条边给个权(费用),并让你使得每条边的流量*费用的总和最小。一种基于贪心的方法就是每次都找最小费用的路径增广。所以就有了SPFA流:每次对图SPFA一遍,按最小费用的路径增广即可。而可以看出,SPFA每次只增广一遍,感觉是十分浪费的。于是,就有zkw很牛B的发明了zkw流。其思路与最大流的ISAP算法类似。在我看来,起码zkw流是不会慢于SPFA流的。对于费用很小很集中,瓶颈容量小但总容量大的图,因为zkw流的多路增广的优势,其效率远远快于SPFA流。而我在今天之前,一直犯了一个错误,使zkw流变得比较慢(或者是很慢)。每次DFS时,对于
阅读全文
摘要:扩展GCD即求解ax+by=c(a,b,c一般为已知整数)此类的方程所用方法。其精华部分就在于GCD那个函数部分。证明等详见百度百科。先求ax+by=GCD(a,b) 保证有解那么对于原方程:有解条件:c mod GCD(a,b)=0一组解:x*(c/GCD(a,b)),y*(c/GCD(a,b))。这样,我们就能在至多O(logn)的时间内求出一组解了。有一个显然的性质是:x加上b且y减去a,方程仍满足。那么我们要取一个对于x(或y)的最小非负整数解时,就可以这样做:x=(x mod b+b) mod b (b>0) (x mod b-b) mod b (b<0) 即(x mod
阅读全文