08 2013 档案
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26586 题意:给一个图,每条边有一个权值。要你求选择一棵树,权值和为sum,然后在树上选择一条边权值为w,然后使得sum-2*w最小。 首先求一遍最小生成树,然后求出每两个点之间的最小瓶颈路,然后枚举边就行了。。 1 //STATUS:C++_AC_916MS_30048KB 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=15505 每个h[i]维护两个值l[i]和r[i],分别表示大于h[i]的左边最远距离和小于h[i]的右边最远距离,DP转一下,然后直接求。。 1 //STATUS:C++_AC_80MS_1360KB 2 #include 3 #include 4 #include 5 #include 6 #include 7 using namespace std; 8 #define mem(a,b) memset(a,b,sizeof(a)) 9 typedef long lo...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26580 题意:给一个模式串,然后m个匹配串,要求删掉匹配串中的所有存在的模式串,使得余下的串中没有模式串。 数据很大,需要O(N)的算法。。。 首先kmp求出模式串的next数组,然后就是kmp匹配了。 但是我们要注意到是要删尽,如BBUGUG,这个样例是删没了的,因此在kmp匹配的时候,对于每个字符 i,我们需要维护两个值 l 和 r,分别表示 i 的左边的有效字符串的下标和右边有效字符串的下标。同时还要维护一个cur[i]数组,表示位置为 i 的字符的next值。然后如...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26579 考虑两个性质:蚂蚁的相对位置不变,蚂蚁碰撞时相当于对穿而过,然后排两次序就可以了。。 1 //STATUS:C++_AC_204MS_3048KB 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 #inc...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29365 首先排序,然后维护一个后缀,等差求下和就可以了。。 1 //STATUS:C++_AC_2090MS_1716KB 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...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29364 题意:给一个序列,输出序列中,二进制1的个数最少的数。。 随便搞搞就行了,关于更多算法,可以看. 1 //STATUS:C++_AC_290MS_1324KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29358 状态虽然很多,但是非常稀疏,dfs搜索然后剪下枝。。 或者DP,f[i][j][k]表示前 i 个物品能否到达第一个背包和第二个背包容量分别为 j 和 k 的状态,然后判断第3个背包是否能装下剩下的。f[i][j][k]=f[i-1][j][k] | f[i-1][j-v[i]][k] | f[i-1][j][k-v[i]].. 搜索: 1 //STATUS:C++_AC_10MS_1308KB 2 #include 3 #include 4 #include ...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=29357 直接模拟就可以了。。 1 //STATUS:C++_AC_190MS_1884KB 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...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26482 题意:给一颗树,根节点为送电站,可以无穷送电,其它节点为house,电量达到pi时可以点亮,边为电线,传输有容量上限,求最多点亮多少个house。。 简单树形DP,f[i][j]表示第 i 个节点电量为 j 时最多点亮的house个数。那么f[u][j]=Max{ f[u][j], f[u][j-k]+f[v][k] | v为u的儿子节点 }。。 1 //STATUS:C++_AC_208MS_2032KB 2 #include 3 #include 4 #...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26480 题意:简单来说,就是给一个图,然后从每个honor list中的点求最短路。。 边权值为1,Bfs就可以了,注意这里是无向图。。 1 //STATUS:C++_AC_84MS_1788KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #inclu...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26476 题意:给一个字符序列,比如MWMMW,每次可以取前面两个中的一个,取出来后,取出来的那个个数加一,要求使得两个字符的个数不超过n,求最多能取多少个。。 贪心就可以了。 1 //STATUS:C++_AC_36MS_1480KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26475 题意:每次输入一个操作,如果是数字,那么放入一个容器中,如果是#号,取出当前容器中的中间值。。 数据结构基础题,显然维护两个堆就可以了,两个堆的size大小不超过1... 其实各种数据结构都可以搞,比如线段树,先离线然后离散,然后线段树记录size,二分查找。。 1 //STATUS:C++_AC_856MS_3192KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include ...
阅读全文
摘要:题目链接:http://www.bnuoj.com/bnuoj/problem_show.php?pid=26474 题意:给一个数列,可以对三个数操作:把最后一个数放到第一个,前两个数后移一位。问最后能否到达相应的目标序列。。 先考虑三个数A B C,变换后两种情况B C A和C A B,可以证得(列举3个数的大小情况,枚举证),这三个序列变换后的逆序对个数的奇偶性是相同的,而且只有这3个序列相同,所以A B C只能到达与之奇偶相同的序列,而且是全部能到达。那么多个数的情况也是一样的,就是多个3元组的扩展。因此如果变换后的逆序奇偶性相同,那么有解,否则无解。。 1 //STATUS...
阅读全文
摘要:题目链接:http://poj.org/problem?id=2480 题意:多次求sigma(gcd(i,n), 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 #include 19 #include 20 #include 21 #include 22 //#in...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2705 题意:求 sigma(gcd(i,n), 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 #include 19 #include 20 #include...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2820 题意:多次询问,求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 #include 19 #include 20 #i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4689 题意:初始序列1,2...n,求所有满足与初始序列规定大小的错排数目。。 这道题目感觉很不错~ 题目数据很容易想到用压缩DP,但这题测试数据很多,状压基本都会TLE。。 f[i][j]表示前 i 个数还有 j 个+号没有放数字,-号全部放满。 当 i 为+号时:1、当前这个数不放,即放在后面的位置中,f[i][j]+=f[i-1][j-1]。2、当前这个数放在前面的位置中,f[i][j]+=f[i-1][j]*j。所以f[i][j]=f[i-1][j-1]+f[i-1][j]*...
阅读全文
摘要:转自教主...很多人都关心这个问题,来信问我。我一直想总结一下经验,让大家可以免得走弯路。今天终于开始写这篇文章。我的文章一般都会在发表之后不断改动,所以如果转载请只给出链接,以便得到最新的版本。面向对象语言不适合入门有的人抱怨很多学校开始教授 Java 而不是以前的 C 或者 Pascal。的确,Java 有很多问题,使得它不适合作为一种入门语言。其实 Java 本质上是把自身的一种古板的设计强加于程序员,使得他们失去了灵活的思维。比如 Java 缺少高阶函数,也就是不能把函数作为参数或者变量传递,这导致了需要使用繁琐的设计模式 (design patterns) 来达到对于 C 语言都..
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4705 题意:给一颗树,从树上任意选择3个点{A,B,C},要求他们不在一条链上,求总共的数目。 容易想到枚举每个点,然后从每个点的所有分支中选择3个分支,然后从每个分支中选择1个点。假设点u有k个分支,每个分支的节点个数为a1,a2...an,那么方案数就是这个数列中所有3个数的积的和。直接枚举肯定会TLE的。我们可以维护3个前缀和,f1[i]表示前 i 个数选择一个的方案数,f2[i]表示前 i 个数选择两个的方案数,f3[i]表示前 i 个数选择3个的方案数。那么f1[i]就是前缀和,...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4704 题意:求a^n%m的结果,其中n为大数。 S(1)+S(2)+...+S(N)等于2^(n-1),第一次多校都出过吧。然后就是一个裸的大数幂了。。 关于大数的A^B mod C推荐看AC神的两篇文章,... 当然,这个还以一个更简单的方法,由费马小定理:a^(p-1)=1(mod p),那么a^n=1(mod p)可以转化为:2^(n%(1e9+7-1)) % 1e9+7... 1 //STATUS:C++_AC_15MS_1360KB 2 #include 3 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4699 题意:开始有一个光标,每次有5中操作:1,光标当前位置插入一个数,2,光标当前位置删除一个,3,光标向左移一位,4,光标向右移动一位,5,询问前面的数列的最大前缀和。 由于每次删除的数都是在当前的光标位置,而且询问的前缀和都是在光标前面的位置,因此问题简化了很多,否则要用Splay tree搞了。我们可以直接用一个链表或者两个栈来维护光标以前的最大前缀和,然后直接模拟操作就可以了。。。 1 //STATUS:C++_AC_671MS_10824KB 2 #include 3 #in...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4696 题意:给一个图,每个点的出度为1,每个点的权值为1或者2。给n个询问,问是否能找到一条路径的权值和M。。。 首先由于每个点的出度为1,所以必然存在环。容易证明,一个环中存在1或者与环相连的路径存在权值为1的节点,那么必然每个数都能组成,如果没有1那么所有偶数都能组成。。。 可以无视代码> 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4687 题意:给一个无向图,求所有的最大匹配的情况所不包含的边。。 数据比较小,直接枚举边。先求一次最大匹配hig,然后依次枚举所有边,假设此边为一个匹配,那么删掉边的两个节点,然后再剩下的图中求最大匹配t,如果t 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #incl...
阅读全文
摘要:看了两篇博客,觉得写得不错,便收藏之。。 首先是第一篇,转自某Final牛带花树……其实这个算法很容易理解,但是实现起来非常奇葩(至少对我而言)。除了wiki和amber的程序我找到的资料看着都不大靠谱比如昨晚找到一篇鄙视带花树的论文,然后介绍了一种O(E)的一般图最大匹配……我以为找到了神论文,然后ACM_DIY众神纷纷表示这个是错的……于是神论文成为了”神论文“……又比如围观nocow上带花树标程,一看……这显然是裸的匈牙利算法……货不对板啊当然……如果二分图的匈牙利算法还不会请先围观求二分图最大匹配的匈牙利算法。实际上任意图求最大匹配也是找增广路,但是由于奇环的出现,找增广路变得困...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4691 后缀数组模板题,求出Height数组后,对Height做RMQ,然后直接统计就可以了。。。 1 //STATUS:C++_AC_828MS_11284KB 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 #incl...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4686 因为ai= ai-1*AX+AY ,bi= bi-1*BX+BY ,那么ai*bi=AX*BX*A*ai-1*bi-1+AX*BY*ai-1+BX*AY*bi-1+AY*BYAY。令Sn为ai*bi前n项的和,Sn=Sn-1 + an*bn,因此我们可以构造一个如下的转移矩阵: 然后矩阵乘法优化就可以了。。。 注意此题n=0的情况! 其实矩阵大小只要5就可以了,那几个常数项可以合并到一列。。。 1 //STATUS:C++_AC_1296MS_232KB 2 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4690 纯沙茶模拟题。。。 1 //STATUS:C++_AC_93MS_228KB 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 #incl...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2301 题意:多次询问,求有多少对数满足 gcd(x,y)=k, a 1 //STATUS:C++_AC_2052MS_2052KB 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 #...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4135 题意:求区间[A,B]与K互素的数的个数。 首先对K分解质因数,然后容易原理搞,复杂度O(sqrt K).. 1 //STATUS:C++_AC_0MS_228KB 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 #...
阅读全文
摘要:题目链接:http://www.spoj.com/problems/VLATTICE/ 题意:求gcd(x,y,z)=1,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 #include 19 #include 20 #include 21 #include 22 #i...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2005 题意:题目转换后的模型就是求Σ(gcd(x,y)), 1=2就行了... 1 //STATUS:C++_AC_16MS_2052KB 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://blog.sina.com.cn/s/blog_7812e98601012cim.html函数式(现在又称主席式。。。)数据结构从来都没写过,感觉这个东西可以挖掘出不少东西出来,于是开一组专题。先根据Seter 留下的文本做一些记录。。主席树大概是一种离线结构,我以前反正没看到过这东西,所以就自己给他起名字了!如果谁知道这东西的真名,请告诉我!现在我们知道,主席树的全名应该是 函数式版本的线段树。加上附带的一堆 technology。。。。总之由于原名字太长了,而且 “主席” 两个字念起来冷艳高贵,以后全部称之为主席树好了。。。主席树的主体是线段树,准确的说,是很多棵线..
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2190 简单的欧拉函数题,实际上就是求gcd(x,y)=1, 0 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 #include 20 #i...
阅读全文
摘要:题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=2818 题意:给定整数N,求1有详细介绍。现摘录如下:下面代码就是带有计算欧拉函数的线性筛素数。代码原型的起源已经无从考证,可以作出一个合理的揣测,是某位搞OI或者ACM/ICPC的神牛第一次写出来的。1234567891011121314151617181920bool com[MAXN];int primes, prime[MAXN], phi[MAXN];phi[1] = 1;for (int i = 2; i j1)在i = i1, j = k的时候被筛掉一次,又在i =...
阅读全文
摘要:题目链接:http://poj.org/problem?id=3241 题意:平面上有n个点集,现在把他们分成k个集合,使得每个集合中的每个点都至少有一个本集合的点之间的曼哈顿距离不大于X,求最小的X。 题目要求划分集合之后,每个集合的曼哈顿最小生成树的最长边不超过X,那么容易想到就是整个点集的曼哈顿最小生成树的第n-k条边。。 那么主要就是求曼哈顿最小生树的问题了,有O(logn)的算法可以轻松解决建图的问题,主要是利用到了环切的性质,考虑到很多边其实都是没有用的:对于某个点,以他为中心的区域分为8个象限,对于每一个象限,只会取距离最近的一个点连边。。 ...
阅读全文
摘要:原文链接,。。。关于曼哈顿距离最小生成树,还推荐看一、曼哈顿距离最小生成树曼哈顿距离最小生成树问题可以简述如下:给定二维平面上的N个点,在两点之间连边的代价为其曼哈顿距离,求使所有点连通的最小代价。朴素的算法可以用O(N2)的Prim,或者处理出所有边做Kruskal,但在这里总边数有O(N2)条,所以Kruskal的复杂度变成了O(N2logN)。但是事实上,真正有用的边远没有O(N2)条。我们考虑每个点会和其他一些什么样的点连边。可以得出这样一个结论,以一个点为原点建立直角坐标系,在每45度内只会向距离该点最近的一个点连边。这个结论可以证明如下:假设我们以点A为原点建系,考虑在y轴向右..
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3640 题意:Cain被困在一个洞穴里,洞穴有n个出口,每个出口有一个难度值C[i],Cain有一个初始的战斗值f。现在Cain随机选择一个出口,如果f大于出后的难度,那么Cain将会花floor( (1+sqrt(5))/2*C[i]*C[i] )天出去,否则Cain的f将会增加C[i]并且消耗掉一天时间,然后重新尝试。求Cain逃出洞穴天数的期望值。。。 首先用BFS把Cain所有的f值的可能情况求出来,然后就可以列出方程,这里因为期望都是由大的f推...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2196 题意:给一颗树求距离每个节点的最远距离。。 每个节点维护两个信息就可以了,f[u][0]和f[u][1],分别表示子树的最大深度和次大深度,然后一边DFS合并子树就行了。。 1 //STATUS:C++_AC_15MS_1016KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4679 题意:给一颗树,每个边有一个权值,要你去掉一条边权值w剩下的两颗子树中分别的最长链a,b,使得w*Min(a,b)最小。。 说白了就是要枚举每条边,然后在O(1)的时间内求出两颗子树的最长链。因此我们可以考虑用树形DP,首先一遍DFS,对于每个节点维护两个信息,hign[u]:u为根节点的子树的深度,f[u]:u为根节点的子树的最长链。然后还要维护一个hige[i][0]和hige[i][1],分别表示u为根节点的子树,不包括边 i 的深度和最长链。然后再一遍DFS,根据上一节点的信...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4678 题意就不说了,太长了。。。 这个应该算简单博弈吧。先求联通分量,把空白区域边上的数字个数全部求出来a[i](就是一个连通分量),然后就是n堆石子,每堆每次可以取一个或者全部取掉,然后要注意在取玩边上的石子后,剩下的就只能一次取掉了,因此我们直接把空白区域上的算做一个a[i]+1。然后这个SG函数很好求,奇数是1,偶数是2。。。 1 //STATUS:C++_AC_156MS_4268KB 2 #include 3 #include 4 #include 5 //#in...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4681 题意:给A,B,C三个串,求一个最长的串D,满足D是A和B的subsequence,C是D的substring。。 比赛那天把substing搞成了subsequence,,,sd。。。 挺水的一题,直接枚举C在A和B串中的位置,当然是最短的位置,然后求两遍A和B的最长公共子序列,一个从前往后,另一个从后往前,然后遍历枚举就可以了,O(n^2).. 1 //STATUS:C++_AC_343MS_8164KB 2 #include 3 #include 4 #inclu...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4675 题意:给一个大小为N的数列a[i],然后一个数M以及一个数K,要你求得一个数列b[i],其中b[i]有K个数与a[i]中的不相同,使得gcd(b[i])=j。对于每个 j ,求出满足的b[i]的个数。。 首先我们统计数列a[i]每个数的个数,假设现在求gcd(b[i])=j,那么可以在t=M/j的时间内求出 j 的倍数的个数cnt。那么就相当于在cnt个中选择N-K个不变C(cnt,N-K),在剩下的 j 的倍数中有(t-1)^(cnt-t)种,非 j 的倍数中有t^(N-cnt)种...
阅读全文
摘要:题目链接:http://poj.org/problem?id=2926 题意:求5维空间的点集中的最远曼哈顿距离。。 降维处理,推荐2009武森《浅谈信息学竞赛中的“0”和“1”》以及《论一类平面点对曼哈顿距离问题》。 1 //STATUS:C++_AC_735MS_184KB 2 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4669 题意:给一串数字连乘一个环,求连续的子串中组成的新的数字能被K整除的个数。 首先容易想到用DP来解,f[i][j]表示以第 i 个数字结尾的所有前缀数中,余数为 j 的个数,那么Σ(f[i][0])就是答案。 f[i][ j*10^len(num[i])+num[i] ]+=f[i][j]。 但是这个要处理环的问题,所以我们要保证每次求的f[i][j]长度不能超过n。所以我们需要在转移f[i][j]的时候,要求出以当前数字num[i]开始的长度为n的数的余数r[i],那么在统计完...
阅读全文
摘要:原帖地址:http://www.oschina.net/news/43167/130-essential-vim-commands从 1970 年开始,vi 和 vim 就成为了程序员最喜爱的文本编辑器之一。5年前,我写了一个问自己名为 “每个程序员都应该知道的 100 个 vim 命令” 这次算是之前那篇文章的改进版,希望你会喜欢。基础:e filenameOpenfilenamefor edition:wSave file:qExit Vim:q!Quit without saving:xWrite file (if changes has been made) and exit:sa..
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4671 假设是3 m,首先按照第一列按照1 2 3 1 2 3 1...排下去,然后个数就是一个 (m/3)+1,(m/3)+1....m/3的形式,题目要求不相差1,那么对于第二列serve直接从后往前就可以了,总可以保证不想差1,最多两列就可以解决。。 1 //STATUS:C++_AC_31MS_272KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #in...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4666 题意:动态的增加或者删掉k维空间的点,求每次操作后剩下的点集中的最大的麦哈顿距离。 如果是一维情况很好做,直接用个数据结构来维护就行了,那么多维情况怎么办?其实多维情况是可以降到一维情况的。考虑二维的情况:|xi-xj|+|yi-yj|,我们展开绝对值之后,就可以得到四个式子:(xi+yi)-(xj+yj), (-xi+yi)-(-xj+yj), (xi-yi)-(xj-yj), (-xi-yi)-(-xj-yj),根据不等式 |x|+|y|>=x+y,那么我们对所有的点求出(xi+.
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3380 题意:有m种不同的元素,每种元素都有n种不同的相位,现在假设有每种元素各一个,其相位是等概率随机的。如果几个元素的相位相同,那么帕琪就可以把它们组合发动一个符卡(Spell Card)。现在问帕琪能够发动等级不低于l,即包含l个相同相位的不同元素的附卡的概率。 首先所有的总数是n^m,然后只要求满足情况的数目了,对于 l >m/2我们可以直接用组合数来求的,即n*Σ( C(m,i)*(n-1)^(m-i) ),如果 l m){27 ...
阅读全文
摘要:题目链接:http://acm.sgu.ru/problem.php?contest=0&problem=495 题意:有n个盒子,每个盒子里面放了一个奖品,m个人轮流去选择盒子,如果盒子里面有奖品,就把奖品拿走,盒子留下,否则直接走人。求最后被抽走的奖品数期望。。。 如果直接考虑用期望来建立DP,复杂度都很高,而且题目精度过高。换一个角度思考,考虑每个奖品不被拿走的概率(1/n)^m,那么不被拿走的期望就是n*(1/n)^m,则拿走的期望n-n*(1/n)^m,复杂度O(1)。还可以考虑f[i]表示第 i 个人拿到奖品的概率,那么1-f[i]就是没有拿到奖品的概率,是对立事件,则f[
阅读全文
摘要:题目链接:http://poj.org/problem?id=3071 题意:有2^n只足球队打比赛,编号1和2,3和4等进行淘汰制,胜利的进入下一轮接着淘汰,求最后哪支球队赢的概率最大。 简单题概率DP,画一颗树就知道方程了,f[i][j]表示第 i 轮第 j 只球队获胜的概率,则f[i][j]=Σ( f[i-1][k] ),k为第 j 只球队能遇见的所有球队。 1 //STATUS:C++_AC_94MS_320KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2262 题意:LL在一个迷宫里面转,每次走向周围能走的点的概率都是一样的,现在LL要随机的走到canteen哪里,求期望。 这个是带环的求期望问题,并且没有什么特殊性,只有列出方程,然后gauss消元了。首先用BFS求出能走的点,并判断能否走到canteen。然后列出期望方程,E[i]=Σ( E[j]*p[j] ) +1。然后好求了,注意题目中有多个canteen。。。 1 //STATUS:C++_AC_437MS_700KB 2 #include 3 #include 4 #...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4418 题意:简单来说就是给你1个环(n - 1 , n - 2 …… 0 ,1 , 2 , 3 …… n - 2)。你可以走1 - m步每步的概率是给定的。。保证sum(pk)(1 n - 1 ,d = 1代表从n - 1 -> 0。 由于这里同一个点每次转移的方向是不一样的,因此要进行拆点,即0, 1, 2, 3 -> 0, 1, 2, 3, 4, 5,4和5分别表示2和1这个点的相反的方向。然后做一遍BFS,看是否能到达Y点,如果能的话,列出期望方程:E[i]=Σ( (E[j]+k
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4664 题意:一个平面上有n个点(一个凸多边形的顶点),每次可以连接一个平面上的两个点(不能和已经连接的边相交),如果平面上已经出现了一个三角形,则不能在这个平面上继续连接边了。 首先在最优情况下,优先考虑的是一个点不连两条直线,否则就直接输了。因此一个n个点的局面连了一条直线后,分为了两个子游戏,i个点和n-i-2个点,则sg[n]=mex(sg[n]^sg[n-i-2])。然后打表找规律,发现大于n大于68后就是34的循环节了。 1 //STATUS:C++_AC_203MS_428KB...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4661 题意:有n个人呈树状结构,每个人知道一个独特的消息。每次可以让一个人将他所知的所有消息告诉和他相邻的人。求所有人都知道所有消息花时花的步数最少的所有方案数。 首先需要满足的是最小的步数,所以我们一定是先把所有消息先传到一个人手中才是最优的,然后再从这个人传回去,也就是每条边走两次。我们只需要考虑单向传到某个人的方案数cnt,因为再传回去也是cnt。那么我们可以枚举每个点为收集点,把所有的和加起来就是答案。这里就是一个树形DP的问题,转移的时候是一个组合问题:记录f[u],cnt[u]...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4665 本题的2-SAT建图颇为复杂,有时间再来填坑(自己写的一直挂着,标程建图太复杂了)。。。然后用暴力搜索,用一个栈保存第一个序列就可以了,因为题目是SPG,并且重复的最多只有四个,所以搜索很好过。。 1 //STATUS:C++_AC_62MS_276KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #incl...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4655 先不考虑相临的有影响,那么总数就是n*prod(ai),然后减去每个相邻的对总数的贡献Σ( Min(a[i],a[i+1])*prod(i-1)*prod(i+2) ),其中prod(i)为[1,i-1]这个区间a[i]的积,prod(i+2)表示的是[i+2,n]这个区间,答案就是n*prod(ai)-Σ( Min(a[i],a[i+1])*prod(i-1)*prod(i+2) ),可以得到取得最大值是ai的排列就是最小,最大,次小,次大,例如:1 2 3 4 -> 1 4 2 3
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4662 倒推考虑长度就可以了。 1 //STATUS:C++_AC_31MS_240KB 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...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4089 开始方程想错T^T,题解见下面。。。 dp[i][j]表示队列中有i个人,Tomato排在第j个,能发生所求事件的概率。 显然,dp[n][m]即为所求。 j == 1 : dp[i][1] = p1*dp[i][1] + p2*dp[i][i] + p4; 2 k : dp[i][j] = p1*dp[i][j] + p2*dp[i][j-1] + p3*dp[i-1][j-1]; 化简: j == 1 : dp[i][1] = p*dp[i][i] + ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4336 题意:买食品收集n个卡片,每个卡片的概率分别是pi,且Σp[i] Σp[i]*f[s]=Σp[i]*f[s|(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 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3853 简单概率DP,转移方程:f[i][j]=f[i][j]*p1+f[i][j+1]*p2+f[i+1][j]*p3+2 —> f[i][j]=(f[i][j+1]*p2+f[i+1][j]*p3+2)/(1-p1). 1 //STATUS:C++_AC_2828MS_32180KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4651 题意:求n的整数拆为Σ i 的个数。 一般的递归做法,或者生成函数做法肯定会超时的。。。 然后要奇葩的用到一个,然后根据公式递推就可以了,先预处理下,复杂度O(n*sqrt(n)).. 1 //STATUS:C++_AC_796MS_1012KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #includ...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4649 题意:给一个位运算的表达式,每个运算符和其后的运算数有一定概率不计算,求最后表达式的期望。 因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就得到了总体的期望。 对于每一位,状态转移方程如下: f[i][j]表示该位取前i个数,运算得到j(0或1)的概率是多少。 f[i][1]=f[i-1][1]*p[i]+根据不同运算符和第i位的值运算得到1的概率。 f[i][0]同理。 1...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4648 求遍前缀和,然后扫描标记下就可以了。。。 1 //STATUS:C++_AC_453MS_1792KB 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 #incl...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4647 注意这题两人的决策是想要使得自己的分数与对方的差值最大。。 注意到数据范围,显然是贪心之类的,如果没有变那么很简单,如果有边,那么我们进行拆边,把边的权值的一半加到所连的点上。然后排个序贪心。。 1 //STATUS:C++_AC_218MS_1020KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #in...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4035 很不错的概率DP题目,因为这题是无向图,所以要对叶节点和非叶节点考虑,然后列出方程后,因为数据很大,高斯消元如果不特定优化会超时,可以转化方程,然后求解系数。解法: 题意: 有n个房间,由n-1条隧道连通起来,实际上就形成了一棵树, 从结点1出发,开始走,在每个结点i都有3种可能: 1.被杀死,回到结点1处(概率为ki) 2.找到出口,走出迷宫 (概率为ei) 3.和该点相连有m条边,随机走一条 求:走出迷宫所要走的边数的期望...
阅读全文
摘要:题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3593 带环的概率DP一般的做法是求出转移方程,然后高斯消元解方程。但是这里的环比较特殊,都是指向f[0]。 此题的转移方程为:f[i]=Σ(f[i+k]*p[k])+f[0]*p[0]+1. 我们可以设 f[i]=A[i]*f[0]+B[i].带入右边有: f[i]=Σ(A[i+k]*f[0]*p[k]+B[i+k]*p[k])+f[0]*p[0]+1. -> f[i]=Σ(A[i+k]*p[k...
阅读全文
摘要:题目链接:http://poj.org/problem?id=3744 简单的概率DP,分段处理,遇到mine特殊处理。f[i]=f[i-1]*p+f[i-2]*(1-p),i!=w+1,w为mine点。这个概率显然是收敛的,可以转化为(f[i]-f[i-1])/(f[i-1]-f[i-2])=p-1。题目要求精度为1e-7,在分段求的时候我们完全可以控制进度,精度超出了1e-7就不运算下去了。当然此题还可以用矩阵乘法来优化。 考虑概率收敛代码: 1 //STATUS:C++_AC_0MS_164KB 2 #include 3 #include 4 #include 5 //#i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4609 题意:给n个棒子,求任意组成3根能形成三角形的概率。 用FFT求出任意两根棒子组合成新的长度,这种长度的组合有多少种。 用cnt[i]表示和的长度为i的棒子组合有多少种。 (1) 首先去掉cnt里重复的部分,一根棒子不能与自己组合,所以有cnt[a[i] * 2] -- (2) 任意两个棒子组合的顺序我们不需要考虑,而实际上他们算了两次,所以有cnt[i] /=2 (3) 枚举所有棒子,假设这根棒子a[i]是组成三角形其中最长的那根,我们首先求出另外两根的长度和比它的长的总...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1402 一般的的大数乘法都是直接模拟乘法演算过程,复杂度O(n^2),对于这题来说会超时。乘法的过程基本就是等同于多项式相乘的过程,只是没有进位而已。对于这种问题我们需要转化然后用FFT求解。FFT是用来计算离散傅里叶变化(DFT)及其逆变换(IDFT)的快速算法,复杂度O(n*logn)。DFT有一个很重要的性质:时域卷积,频域乘积;频域乘积,时域卷积。那么什么是时域、频域、卷积、乘积呢?时域和频域是两种信号的分析方法,DFT可以把时域信号变化为频域信号。卷积就是作多项式乘法,乘积就是依次乘...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1007 简单裸题,测测模板,G++速度快了不少,应该是编译的时候对比C++优化了不少。。 1 //STATUS:G++_AC_1703MS_5004KB 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 ...
阅读全文
摘要:题目链接:http://poj.org/problem?id=3714 分治算法修改该为两个点集的情况就可以了,加一个标记。。。 1 //STATUS:C++_AC_2094MS_4880KB 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...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4631 数据是随机的,没有极端数据,所以可以分段考虑,最小值是一个单调不增的函数,然后每次分治算平面最近点对就可以了。。。 1 //STATUS:G++_AC_10390MS_23804KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4630 题意:给一个数列,询问区间[l,r]里两个数最大gcd。 求区间的最大gcd(a,b),就是找一个数是在这个区间所有数的约数中,至少出现两次,而且最大的那个数。那么接下来就比较容易了,从右到左扫描数列,用pre[i]表示约数 i 在当前这个位置往右第一次出现的位置,那么每到一个位置枚举num[i]的所有约数,然后用树状数组维护一个区间最大值就行了,用树状数组维护区间最大值有点麻烦,但这里是从右往左扫描的,因此可以求0-i点的最大值,就很简单了。。。 1 //STATUS:C++_A...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4628 数据不大,枚举本质。首先对枚举出回文串,然后用DP或者搜索,这里因为层数不多,用bfs比较好,或者用IDA*。。。 1 //STATUS:C++_AC_140MS_780KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #include 12 #include 13 #include...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4627 对n除个2,然后考虑下奇偶。。。 1 //STATUS:C++_AC_15MS_228KB 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 #in...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4638 个人认为比较不错的题目。 题意:给一个1-n的排列,询问区间[l,r]的数排序后连续区间的个数。 对于这种题目容易想到对询问离线处理,难点是怎样在logn的时间内求出连续区间的个数。先对询问按右端点y从左到右排序,然后从左到右扫描整个数列,现在考虑加一个数num进去,如果我们前面存在num-1或者num+1,那么数列连续区间的个数是没有增加的,可能还会减少。因此我们可以维护一个数组数组或者线段树,对于每加进去的一个数num[i],对 i 点加1,如果 i 点前存在num[i]-1和...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4635 题意:给一个简单有向图(无重边,无自环),要你加最多的边,使得图还是简单有向图。。。 先判断图是否强连通。如果不是强连通的,那么缩点。我们的目的是加最多的边,那么最后的图中,肯定两个集合,这两个集合都是强联通的,一个集合到一个集合只有单向边。我们先让图是满图,然后通过删边来求的:有n*(n-1)条边,然后删掉已有的边m,然后还有删掉两个集合的边n1*(n-n1),n1为其中一个集合的顶点个数,因为这里是单向边。那么答案就是ans=n*(n-1)-m-n1*(n-n1),我们要使ans...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4642 看右下角的状态就行了,因为上面的操作每次都会改变它,而最后的局势是根据它来的。。。 1 //STATUS:C++_AC_15MS_218KB 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 #i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4639 简单递推题,呵呵,不多说。。。 1 //STATUS:C++_AC_15MS_272KB 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 #inc...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4632 区间DP,f[i][j]表示[i,j]区间回文字串的个数。f[i][j]=f[i+1][j]+f[i][j-1]-f[i+1][j-1]+s[i]==s[j]?f[i-1]+f[j-1]+1:0 。 1 //STATUS:C++_AC_281MS_4188KB 2 #include 3 #include 4 #include 5 //#include 6 #include 7 #include 8 #include 9 #include 10 #include 11 #i...
阅读全文
摘要:题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4622 题意:给一个字符串,询问某字串的不同字串的个数。 可以用后缀数组来解决,复杂度O(n)。先求出倍增算法求出sa数组,然后DP求出Height数组,对于每个询问,重构sa数组,这里重构可以利用整个串的sa数组来得到,但是这里截取的字串,可能顺序会变化,看一个例子:cacbe 排序为:acbe,be,cacbe,cbe,e 得到字串[0,2]的排序是:acbe(1),cacbe(0),cbe(2) 但cac的实际排序是:ac(1),c(2),cac(0) 后缀0和2的顺序反了,因此...
阅读全文

浙公网安备 33010602011771号