摘要: dp+斜率优化~~http://acm.hdu.edu.cn/showproblem.php?pid=3480View Code 1 # include<stdio.h> 2 # include<string.h> 3 # include<stdlib.h> 4 # define N 10005 5 int a[N],s[N],k; 6 int dp[2][N]; 7 int cmp(const void *a,const void *b) 8 { 9 return *(int *)a -*(int *)b;10 }11 int K(int i1,int i 阅读全文
posted @ 2012-10-24 17:54 奋斗青春 阅读(273) 评论(1) 推荐(0) 编辑
摘要: 欧拉函数~~第一次写欧拉函数,以前只知道其定义,以为编码按其过程一步一步的实现应该就可以,结果发现不太一样。超时的想法:首先筛选素数,刚开始是筛选了N以内的所有素数,然后对于每个数,从小到大枚举素数,for(;;)//枚举素数if(n%prime[i]==0){ phj[n]=phj[n]-phj[n]/prime[i]; while(n%prime[i]==0){ n/=prime[i]; }}超时了之后,发现素数其实没必要枚举到N,只用枚举到sqrt(N)因为对于每一个数n,for()循环之后,如果n不为1,那n肯定是一个大于sqrt(N)的素数。但是这样之后还是超时了。。之后看了百科上面 阅读全文
posted @ 2012-09-20 16:20 奋斗青春 阅读(413) 评论(0) 推荐(0) 编辑
摘要: 扩展Baby Step Giant StepBaby Step Giant Step: A^X=B(mod C); C为素数。如果C没有限制就变成扩展Baby Step Giant Step。参照大牛博客:http://hi.baidu.com/aekdycoin/item/236937318413c680c2cf29d4实在是太弱了,没用二分,写了一个hash竟然超时,最后还是copy了一个hash。View Code 1 # include<stdio.h> 2 # include<string.h> 3 # include<stdlib.h> 4 # 阅读全文
posted @ 2012-09-20 16:14 奋斗青春 阅读(475) 评论(0) 推荐(0) 编辑
摘要: hdu 4089 Activationhttp://acm.hdu.edu.cn/showproblem.php?pid=4089去年北京现场赛的一道题,当时没做过概率DP, 用DP怎么搞都不对,最近才把概率DP学了学终于把这道题A了。有n个人排队激活游戏账号,每次会有四种情况发生。1.激活失败: 队列保持不变,发生的概率为p12.连接失败: 队首重新排到队尾,队列长度不变,发生的概率为p23.激活成功: 队首移出队列,后面的元素都往前移一位,队列长度减1,发生的概率为p34.服务器崩溃: 不再提供服务。刚开始有n个人在排队,Tomato在第m个位置,问最后服务器崩溃的时候Tomato在队列的 阅读全文
posted @ 2012-09-13 16:06 奋斗青春 阅读(3213) 评论(0) 推荐(0) 编辑
摘要: hdu 4336 http://acm.hdu.edu.cn/showproblem.php?pid=4336比较简单的一道概率DP。一般概率DP都是从后向前推,对于这道题目,因为n不是很大, 所以可以用二进制,用一个数表示一种状态。1表示该卡片已经被搜集过,0表示还没有所以dp[2^n-1]的期望值为0dp[i]=dp[i]*sum + pi*dp[i+2^i] +1 ;sum表示这次bags里面没有卡片或者是已经搜集过的卡片的概率最后求出dp[0]即可。bupt 200 http://acm.bupt.edu.cn/onlinejudge/newoj/showProblem/show_pr 阅读全文
posted @ 2012-09-09 09:59 奋斗青春 阅读(320) 评论(0) 推荐(0) 编辑
摘要: http://acm.hdu.edu.cn/showproblem.php?pid=2669扩展欧几里德。扩展欧几里德: 给一个线性方程X*a+Y*b=m,给出a,b,m让求解X和Y。首先,只有m%gcd(a,b)==0 时 该线性方程才有解。假使a=k1 *gcd(a,b),b=k2 * gcd(a,b);那么方程左边就等于(X*k1+Y*k2)*gcd(a,b),所以仅当m能被gcd(a,b)整除时方程才有解。为了求上述方程的解,我们不妨先来求方程a*X+b*Y=gcd(a,b)的解,设d=m/gcd(a,b);所以a*(d*X)+b*(d*y)=d*gcd(a,b)=m,求出这个方程的解 阅读全文
posted @ 2012-09-05 10:24 奋斗青春 阅读(975) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4359很明显dp,先预处理。需要用到排列组合,然后可以用递推的方法求出来。中间需要再加一个数组f来标记,不然会超时。dp[i][k]表示i个数组成深度为k的树的总数f[i][k]表示 i个数组成深度不超过k的树的总数dp[i][k]=左子树深度为k-1&&右子树的深度小于等于k-1 + 左子树深度小于k-1&&右子树的深度等于k-1View Code 1 # include<stdio.h> 2 # include<string.h> 3 # 阅读全文
posted @ 2012-08-14 16:37 奋斗青春 阅读(352) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4328用dp求图中包含的最大矩阵的问题。此题可以看着是hdu 1505 City Game 的加强版View Code 1 # include<stdio.h> 2 # include<string.h> 3 # include<stdlib.h> 4 # define N 1005 5 char map[N][N]; 6 int uR[N],uB[N],OB[N],OR[N],l[N],r[N]; 7 /* 8 uR[j]表示第j个字符上面有多少个R 9 uB[ 阅读全文
posted @ 2012-08-14 09:54 奋斗青春 阅读(271) 评论(0) 推荐(0) 编辑
摘要: 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4332先用状态压缩求出相邻两层之间的关系,然后用矩阵的快速幂来求每一层有8个位置然后就有256种状态,但是可以发现,有4个是对称的,也就只用计算70种状态。我没优化,直接用256种状态进行的计算,如果一直按矩阵的快速幂来求总是栈溢出,必须要先预处理矩阵的1-30次幂的值。View Code 1 # include<stdio.h> 2 # include<string.h> 3 # include<stdlib.h> 4 # define Mod 10000000 阅读全文
posted @ 2012-08-14 08:36 奋斗青春 阅读(270) 评论(0) 推荐(0) 编辑
摘要: 题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4339线段树或者 树状数组+二分记录两个字符串在该区间内有多少个字符相匹配。线段树:View Code 1 # include<stdio.h> 2 # include<string.h> 3 # include<stdlib.h> 4 # define N 1000005 5 char s1[N],s2[N]; 6 struct node{ 7 int l,r; 8 int num; 9 }tree[4*N]; 10 void bulid(int l,int 阅读全文
posted @ 2012-08-14 08:25 奋斗青春 阅读(309) 评论(0) 推荐(0) 编辑