摘要:在解一个区间的最值问题时,我们可以用到单调队列。单调队列维护的是区间最值。1.最大值的维护: 比如我们要维护一个区间为k的最大值的单调队列,由于新插入 的节点他的“生命力”肯定比原先已经在队列中的元素“活”的时间长,将插入元素不断与队尾元素比, 如果他大于队尾元素,那么r--将队尾元素删掉,(因为目前插入的这个元素值(设为pos)更大,而且“活”的时间 长,有pos在,队尾元素的有“生”之年永远都没法为最大值,故而直接无视比pos小的队尾了)。直到对空位置或者 找到了一个比pos大的队尾。 2.K区间的维护: 比如当前k区间的起点为i,即区间为[i,i+k-1],那么如果队头元素front..
阅读全文
摘要:http://acm.fzu.edu.cn/problem.php?pid=1887按照题目要求先求出每个联通分支,然后在每个联通分支里面按照单位花费,从小到大排序,贪心一下就行了。#include <iostream>#include <cstdio>#include <string.h>#include <cmath>#include <algorithm>#include <vector>#include <queue>using namespace std;const int maxn = 105;st
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3920状态压缩DP.dp[mask] , 表示mask二进制表示中为1的元素都被击中的最小代价。当然如果有奇数个1就可以忽略了。dp[mask | tj | tk] = min( dp[mask | tj | tk] , dp[mask]+dis[j,k] ) ; ( tj=(1<<(j-1)) , tk=(1<<(k-1)).如果n=2,有四个元素的时候0000=> 0011 0101 10010011=> 11110101=> 11111001=> 1111
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3923题意大概就是有条n长度的项链,m种不同的颜色,问可以组成多少种不同的项链(翻转与旋转后相同的都算是同一条项链)解法:polya+乘法逆元题目显然就是很裸的polya,不过有些地方要注意下的,先简单介绍下polya。这里有个比较详细的讲解 http://hi.baidu.com/%C1%E9%C1%FAzys/blog/item/6d5c0d3e4fc887d19f3d6212.htmlfun(a,b) 表示乘幂 a^beuler(a) 表示a的欧拉函数n 长度 c 颜色数polya的模板:int ans
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3927反幻方,挺有意思的一道题具体可以见证明 http://www.cnblogs.com/lwbaptx/admin/Files.aspx给出的一个构造反幻方的方法定理:若n(n>=3)阶方阵为 A=[aij]a[i][j]=(i-1)*(n-1)+j ; (i=1,...n, j=1,....n-1)a[i][j]=n*(n-1)+i; (i=1,...n,j=n)则A是一个n阶反幻方#include <iostream>#include <cstdio>#include &
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3911好吧,纠结很久才发现的那个错误。泪奔。。。。。用到了线段树中的懒操作,具体的话,就看线段树里面的结点信息吧==!#include <iostream>#include <cstdio>#include <algorithm>#include <string.h>#include <cmath>#include <vector>using namespace std;const int maxn = 100005;struct nod
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3902题意:给出一个简单多边形,判断这个多边形是否是轴对称多边形.把原来的n个点扩展,加上各边的中点,扩展为2n个点。然后对称轴一定是一个点和它对面的一个点组成。(i,i+n)再验证在这条对称边的两端的对应两点组成的线段是否垂直平分这条对称轴.理论上的复杂度是 O(n*n),但实际上应该达不到的吧=!#include <iostream>#include <cstdio>#include <algorithm>#include <cmath>#include &
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3884二分+验证验证是否可以把t个桃子放在同一点的时候,这t个桃子必然是连续的,假设存在于区间[a,b]这个区间的两个端点必然有一个是满的(所以扫描的时候左右扫两遍)先假设a点是满的那么找第t个桃子所在的位置再找中间第(t+1)/2个桃子的位置 (距离和最小)此时得到中间位置,左右两边的位置,就可以验证是否超出花费了。注:当t是偶数的时候,中间的桃子应该是有两个的,我考虑之后就TLE了,因为我的算法复杂度是 O(lgm*n*lgn*lgn) (m是桃子总数,n是位置数)后来统一考虑中间的那个桃子就是第(t+1
阅读全文
摘要:http://acm.hdu.edu.cn/showproblem.php?pid=3880比赛的时候卡了很久,最后yy出一个很奇怪的结论,现在给出一点简单的证明。题意大概是给出互质的两个数a,b. 还有一个边界数M。求出一个 具有最小元素的 setA 集合,使得对任意正整数m ( a*m<=M && b*m<=M) . a*m or b*m is in setA.首先假设 a<b. ( gcd(a,b)=1)设整个范围是 (b*1,b*2,b*3, .........b*t) (b*t<=M) 个数是 M/b;设 ans = 0;(1) ans 加上
阅读全文
摘要:http://acm.zju.edu.cn/onlinejudge/showContestProblem.do?problemId=4366(题意大概就是给出一些在凸多边形内部不相交的切割,求出边数最大的多边形的边数)比赛的后半段时间差不多是我在搞这道题,搞了个错误的算法,一直WA到最后。由于watashi神没有给出月赛的报告! scorpio牛说出一个很飘逸的叫“括号序列”的算法。大概步骤:(1)对一个切割 i,j (i<j) ,i的出度加1,j的入度加1(2)从小到大,找第一个出度不为0的开始点st。(3)从st开始顺时针扫描。顺时针压每条原始边。(这里的压边用压0表示) 遇到出度不
阅读全文
摘要:http://acm.bupt.edu.cn/onlinejudge/newoj/ShowContest/show_contest_problem.php?contest_id=140&problem_id=196&problem_rank=A我用的是记忆化搜索来实现树状DP。首先以点1为根进行建树。然后dp[i][0],dp[i][1] 记录的是以i为根的,到其子树的叶子结点的两个最小的距离注意i有0个或1个子树的情况,还要注意1这个根节点的子树情况。最后搜索一遍dp[i][0]+dp[i][1],取最小值。1Y,可是发现时间并不是很快,500多ms。可能是我用了vector
阅读全文
摘要:http://soj.me/show_problem.php?pid=2012KJ推荐的这道题,关于强联通分量的。这里主要是利用 Kosaraju 算法,两次bfs求出强联通分量,第二次dfs2()主要是以第一次的ord的倒序进行dfs。缩点,然后把原图变为一个新的DAG图,然后统计新的DAG图的入点为0的个数。注意这里输出的是序号,不是个数。#include <iostream>#include <cstdio>#include <algorithm>#include <vector>#include <string.h>#incl
阅读全文