09 2013 档案
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4751 题意:有n个人,每个人都认识一些人,要求把他们分成两个集合,使得两个集合中的人都相符两两认识。 如果两个人单向认识或者相互不认识,那么必定在不同的集合,因此建立边,染色就可以了。。 1 //STATUS:C++_AC_31MS_388KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4750 题意:Q个询问t,求在一个无向图上有多少对点(i,j)满足 i 到 j 的所有路径上的最长边的最小值大于等于t。 (i,j)所有路径上的最长边的最小值,容易想到就是 i, j之间的瓶颈路,瓶颈路也就是最小生成树上的边了。注意到每条边的权值都是不相等的,那么MST就是确定的。假设当前MST的边的权值是f[i],Kruskal的并查集中维护一个cnt[i],表示以节点 i 为根的集合的节点个数,那么两个集合x和y合并,点对数就增加cnt[fa[x]]*cnt[fa[y]]*2,sum为点...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4749 题意:给两个串S和P,求S串中存在多少个与P串的大小关系一样的串。 因为数字的范围是1 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4747 题意:求一个数列中,所有mex(L,R)的和。 注意到mex是单调不降的,那么首先预处理出mex(1,j)的值,复杂度O(n),因为mex最大为n。同时预处理出每个数a[i]的右边第一次出现a[i]的位置,用next[i]表示。然后依次从1开始枚举起点 i,则就是求 i 到n的所有mex的和了。i从i+1变化,j>next[i]的mex值都不会变化,因为还是存在a[i]。那么只要考虑i+1到next[i]-1这个区间了,这个区间中,mex第一次大于a[i]的位置k,[k,next[i.
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4742 题意:求3维的LIS。。 用分治算法搞得,参考了cxlove的题解。。 首先按照x排序,然后每个三元组一个编号1-n。接下来只要考虑y和z的值,假设[l,mid]区间已经求好,那么我们对[l,r]区间按照y排序,更新[mid+1,r]区间的最优值时,只要考虑z值了,用树状数组维护z的最长LIS,遇到[mid+1,r]区间的就更新。 1 //STATUS:C++_AC_1750MS_5348KB 2 #include 3 #include 4 #include 5 /...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4738 题意:在有重边的无向图中,求权值最小的桥。 注意trick就好了,ans为0时输出1,总要有一个人去丢炸弹吧。。。 1 //STATUS:C++_AC_62MS_8144KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #includ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4737 题意:给一个数列a0, a1... , an-1,令f(i, j) = ai|ai+1|ai+2| ... | aj,求数列中有多少对f(i,j)满足f(i,j) 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4734 注意到F(x)的值比较小,所以可以先预处理所有F(x)的组合个数。f[i][j]表示 i 位数时F(x)为 j 的个数,方程容易转移:f[i][1 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4727 水题。。 1 //STATUS:C++_AC_187MS_288KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/userstatus.php?user=zhsl 题意:给两个大数,他们之间的加法法则每位相加不进位。现在可以对两个大数的每位重新排序,但是首位不能为0,求两个数相加最大的和。 从最高位开始,考虑和最大贪心,每次从两个大数中找两位a和b,max=(a+b)%10的和最大。如果max有多种组成情况,对于a+b10的组合情况,如果有a+b10的组合情况。。 1 //STATUS:C++_AC_453MS_2260KB 2 #include 3 #include 4 #include 5 //#include 6 #i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4725 如果直接建图复杂度过大,但是考虑到每层之间的有效边很少,只要在每层增加两个虚拟节点n+i和2*n+i。n+i节点向i 层的所有连边,权值为0。i 层的所有点向2*n+i节点连边,权值为0。然后每层直接建立边就可以了,即2*n+i-1向n+i连边,权值为c,2*n+i向n+i-1连边,权值为c。3*n个点,最多有有9*n条边。。 1 //STATUS:C++_AC_730MS_14340KB 2 #include 3 #include 4 #include 5 //#in...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4722 简单的数位DP,f[i][j][k]表示第 i 位数为 j 时余数为k的个数,然后直接找就可以了。。 1 //STATUS:C++_AC_31MS_412KB 2 #include 3 #include 4 //#include 5 #include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #in...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4720 先两两点之间枚举,如果不能找的最小的圆,那么求外心即可。。 1 //STATUS:C++_AC_0MS_292KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4717 每两个点之间的距离变化是一个单峰函数,因为每次求的值最大值,多个单峰函数的最值函数还是单峰的。。 1 //STATUS:C++_AC_515MS_256KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4716 直接搞。。 1 //STATUS:C++_AC_0MS_288KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include 14 #include 15 #include 16 #include 17 #include 18 #include 19 #in...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2686 经典的多进程DP,比较简单。f[x1][y1][x2][y2]表示起点到点(x1,y1)和(x2,y2)的最优值,然后分层转移就可以了,每一层为斜向右的线。。 1 //STATUS:C++_AC_46MS_6172KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12...
阅读全文
摘要:原来还有如此简单粗暴的办法,当数字比较小(比如10^9)时,我们可以用sqrt函数直接求平方根。但是当数字达到10^20时,sqrt就没用了。此时我们可以用二分来找平方根。但是如果又要精确到小数点后若干位,那么二分也不知道要跑多久。于是我们使用手动开方的算法。首先将数字每两位分成一段。如:745836942。就分成:7|45|83|69|42,即从个位开始分。共分成五段,第一段是7。对第一段的数字7开方取整,可得到2。此时,要在2后面接一个数字b,并在7后面加上下一段的数45,使产生的两位数2b的平方不大于745。我们知道,数是10a+b,其平方是100a^2+20ab+b^2。我们可以暂..
阅读全文
摘要:摘自:http://blog.sina.com.cn/s/blog_7a1746820100wp67.html“在一棵树上进行路径的修改、求极值、求和”乍一看只要线段树就能轻松解决,实际上,仅凭线段树是不能搞定它的。我们需要用到一种貌似高级的复杂算法——树链剖分。树链,就是树上的路径。剖分,就是把路径分类为重链和轻链。记siz[v]表示以v为根的子树的节点数,dep[v]表示v的深度(根深度为1),top[v]表示v所在的链的顶端节点,fa[v]表示v的父亲,son[v]表示与v在同一重链上的v的儿子节点(姑且称为重儿子),w[v]表示v与其父亲节点的连边(姑且称为v的父边)在线段树中的位..
阅读全文
摘要:题目链接:http://acm.hunnu.edu.cn/online/?action=problem&type=show&id=10857&courseid=55 比赛的时候把题目看成取恰好K个点了,,,悲剧。。然后按照正确的题意的话,是比较好做的,求个凸包,然后DP就可以了,f[i][j][k]表示第 i 个点到第 j 点选择k个点的多边形的最大面积,那么f[i][j][k]=Max{ f[i][j][k], f[i][y][k-1]+area(p[i],p[y],p[j]) }就可以了。。 这题相当悲剧,题目的数据范围描述错了,k应该是小于等于30,因为题目sb,
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29359 题意:一个数列,有三种操作: 1.区间[a,b]之间大于零的数整出c。 2.区间[a,b]之间所有的数减去c。 3.求区间[a,b]的和。 只要注意到每个数最多除lgn次,总共除n*lgn次,那么直接对除法进行单点更新就可了,关键要分析好复杂度。。 1 //STATUS:C++_AC_3020MS_33996KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4283 题意:n个人排队,每个人有一个权值val[i]。从第一个人开始出队,进入一个栈中,每次可以留在栈中或者从栈中移出一个,如果第 i 个人是第k个出栈的,那么有sum+=(k-1)*val[i],求是的sum最小。 f[i][j]表示区间第 i 个人到第 j 个人sum的最小值,那么每次转移的时候我们只要枚举第 i 个人是什么时候出的栈就可以了,假设第 i 个人是第k个出的栈,那么f[i][j]=Min{f[i+1][i+k-1]+(k-1)*num[i]+f[i+k][j]+k*(su...
阅读全文

浙公网安备 33010602011771号