- 博客(71)
- 收藏
- 关注
原创 后缀数组
看了好久 总算有点懂了 A了俩道水题,把模版贴一下。。。#include #include #include #include using namespace std;const int maxn = 100010;int s[maxn];int sa[maxn],wa[maxn],wb[maxn],ws[maxn];bool cmp(int *r
2013-10-02 21:43:15
587
原创 hdu 4699 Editor 多校第十场 (模拟)
栈 L,R 维护光标之前(之后)的序列那么 I x L.push(x); D L.pop(); L R.push(L.pop()); R L.push(R.pop());然后用 s[]数组维护前缀和,ans[] 数组维护前缀和的最大值
2013-08-24 20:09:50
616
转载 【关于 A^x = A^(x % Phi(C) + Phi(C)) (mod C) 的若干证明】【指数循环节
以下内容全部原创,转载请注明作者 : AekdyCoin 以及本文地址http://hi.baidu.com/aekdycoin/item/e493adc9a7c0870bad092fd9曾经看过如下一个公式:以上的公式如果第一次见到,难免有不少疑惑:为什么可以这么写?限制条件为什么是x >= Phi(C),这个公式为什么正确?今天突发奇想,在纸上YY以
2013-08-24 11:03:53
852
原创 欧拉定理
内容在数论中,欧拉定理,(也称费马-欧拉定理)是一个关于同余的性质。欧拉定理表明,若n,a为正整数,且n,a互质,则:证明首先证明下面这个命题:对于集合Zn={x1,x2,...,xφ(n)},其中xi(i=1,2,…φ(n))是不大于n且与n互素的数,即n的一个化简剩余系(或称简系、缩系),考虑集合S = {a*x1(mod n),a*x2(mod
2013-08-22 21:11:09
829
原创 hdu 4696 Answers 多校第十场
只要C中有1 便可构造任何数,否则只能构造偶数。。#include #include #include #include #include #include #include #include #include using namespace std;#define clr(a, x) memset(a, x, sizeof(a))#define rep
2013-08-22 20:08:43
705
原创 hdu 4704 Sum 多校第十场
答案 是 2^(N-1);(2^500000003)%mod = 1; 所以。。。。。。大整数取完模之后快速幂即可#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include #include #include #include #in
2013-08-22 19:38:58
638
原创 hdu 4705 Y 多校第十场
题目求的是非simple path 的个数,那么倒过来想,总数-simple path 数 = 我们所求的。 总数为C(n,3);simple path 数,枚举每个点作为根时,每个子树的结点通过根的 都是 simple path,求和一下即可。#pragma comment(linker, "/STACK:1024000000,1024000000")#include #
2013-08-22 19:11:34
670
原创 hdu 4690 EBCDIC 多校第九场
打表题额。。。。#include #include #include #include using namespace std;const int maxn = 10000005;struct sss{ char s[50];};sss ss[16][16]={"NUL" ,"SOH","STX","ETX"," ","HT"," ","D
2013-08-20 18:22:56
908
原创 hdu 4691 Front compression 多校第九场
起点相同的串,最长公共前缀就为短一点的串长,其他情况,暴力枚举找最长。。#include #include #include #include #include #include using namespace std;#define clr(a, x) memset(a, x, sizeof(a))#define rep(i, n) for (int
2013-08-20 18:11:05
869
原创 hdu 4686 Arc of Dream 多校第九场
矩阵+快速幂根据 a[i]*b[i]=(a[i-1]*ax+ay)*(b[i-1]*bx+by) == a[i-1]*b[i-1]*ax*bx+a[i-1]*ax*by+b[i-1]*bx*ay+ay*by用公式推出矩阵之后 快速幂一下就好了。。。#include #include #include #include #include #include us
2013-08-20 17:12:36
1157
原创 codeforces 337D Book of Evil
官方题解337D - Book of EvilObviously, in graph theory language our problem is: given a tree with n vertices, m of which are marked, find the number of vertices which are at most distance d a
2013-08-18 15:11:07
807
原创 hdu 4681 String 多校第八场
分别枚举 A 和B 包含C 的起始和结束位置相当于 C分别把A和B 分成俩部分,枚举C在A,B的位置,ans=max(前部最长公共长度+C长度+后部最长公共长度)#pragma comment(linker, "/STACK:1024000000,1024000000")#include #include #include #include using names
2013-08-16 20:01:35
519
原创 hdu 4679 Terrorist’s destroy 多校第八场
先从根深搜一遍,所有子节点的最长,次长,次次长链l1,l2,l3 分别 最长,次长,次次长链的大小,s1,s2,s3 表示来自哪个子节点然后再从根dfs一遍,每次将父节点的最长链来更新子节点的链不能直视的搓代码。。。#pragma comment(linker, "/STACK:1024000000,1024000000")#include #inclu
2013-08-16 16:35:34
602
转载 博弈类题目小结(HDU,POJ,ZOJ)
转载请注明出处,谢谢http://blog.youkuaiyun.com/ACM_cxlove?viewmode=contents by---cxlove首先当然要献上一些非常好的学习资料:基础博弈的小结:http://blog.youkuaiyun.com/acm_cxlove/article/details/7854530经典翻硬币游戏小结:http://blog.csd
2013-08-16 14:51:19
688
原创 hdu 4678 Mine 多校第八场
可以把空白的和一圈的数字看成一堆,一堆里所有空白看成一颗石子,数字算一颗石子,那么每次可以点一个数字(相当于取一个石子),点空白(相当于取全部)这样就转化成取石子游戏了。。。。 把sg值打标以后发现 是 0,,1,2,1,2,1,2这样子循环的 即奇数的sg值为1 偶数的sg值为2,那么只要把每一堆的个数算出来,再对应的sg值异或运算一下就可以得出答案了。。
2013-08-15 19:04:10
937
转载 【完全版】线段树
FROM:http://www.notonlysuccess.com/index.php/segment-tree-complete/在代码前先介绍一些我的线段树风格:maxn是题目给的最大区间,而节点数要开4倍,确切的来说节点数要开大于maxn的最小2x的两倍lson和rson分辨表示结点的左儿子和右儿子,由于每次传参数的时候都固定是这几个变量,所以可以用预定
2013-08-14 14:57:19
1566
原创 hdu 4669 Mutiples on a circle 多校第七场
先求a[n-1]和a[0]不连接的 用dp可以求 dp[i][j]表示第i为余数为j 这里用了滚动数组。。再处理a[n-1]和a[0]相连的 枚举终点 然后将前缀(en[i]表示的就是i~n-1这个前缀的余数)整个的搬到后缀中 通过余数拼接统计 #include #include #include using namespace std;#define clr(a
2013-08-14 10:41:54
671
原创 hdu 4666 Hyperspace 多校第七场
#include #include #include #include #include #include #include #include using namespace std;#define clr(a, x) memset(a, x, sizeof(a))#define rep(i, n) for (int i = 0; i < (int)(n); i++)#def
2013-08-13 21:06:00
640
原创 UVALive 2031 Dance Dance Revolution
简单dp。。。 dp[s][l][r] l表示左脚所在位置,r表示右脚所在位置 的 最小消耗。。#include #include #include #include #include #include using namespace std;#define clr(a,b) memset((a),b,sizeof(a))const int ma
2013-08-11 20:17:16
543
原创 UVALive 2038 Strategic game
一棵树,n个节点,最少需要在节点上放几个士兵,能够观察到所有的边(即一条边上至少一个点选中)dp[ u ][ j ] 表示节点u,状态为j时的把以u为根节点的子树的边全部观察的最小值,j==0表示u节点不放兵,1表示放兵,那么dp[ i ][ 0 ] = sigma(dp[ v ][ 1 ]),d[ u ][ 1 ] = sigma(min(dp[ v ][ 0 ],dp[ v ][ 1
2013-08-11 19:22:15
542
原创 UVA 10817 Headmaster's Headache
状态压缩dp,用两位二进制来表示一门课的信息。code:#include #include #include #include #include using namespace std;#define clr(a,b) memset((a),b,sizeof(a))const int maxn = 10010;typedef long long lld;
2013-08-11 17:28:56
587
原创 UVA 10564 Paths through the Hourglass
一个由格子组成的沙漏,输出从上往下的路径中 和为s 的方案数,如果路径数大于0,输出起点编号最小对路径中字典序最小对方案。从底下直接一遍DP上来,中间分成两段,状态转移方程稍微有点不一样,设d[ i ][ j ][ k ] 表示从最后一行往上到i行j列得到值为k的数量,路径的话 从上往下枚举,如果L可行 输出L,否则输出R 这样一层层下去就行。#inclu
2013-08-11 14:48:04
617
原创 UVALive 3530 Martian Mining
一个n*m的矩形,每个点有两种矿,A矿往W方向,B矿往N方向,每个格子上建两种运送带,一种方向是w的,一种是n的,要求一个格子最多只能有一种带,而且传送带不能断,之后能运到边界才算有效,而且不能曲折,求收集到的A,B总量最大设dp[ i ][ j ] 为前i行,前j列的最大和,每个格子只可能有一种方向的传送带,要么横,要么竖,那么dp[i][j]=max(dp[i-1][j]+sumr[i
2013-08-10 18:32:15
722
原创 UVA 11795 Mega Man's Mission
洛克人最初有一把武器,可以杀死某些机器人,每杀死一个机器人,就可以获得他的武器,每个武器可以杀死某些特定的机器人,计算出杀死这些所有的机器人顺序总数? 简单状态压缩DP。dp[ S ] 表示杀死机器人状态为S(1表示死,0活着)的总方案数,先预处理出对于每个S,所获得的武器能够杀死哪些机器人。1表示可杀,0不可以。状态转移方程dp[S] += dp[S0]; 其中 S0为S的子集 即S
2013-08-10 16:26:43
638
原创 UVALive 3882 And Then There Was One
经典约瑟夫环问题,n个数排成一圈,第一次删m,以后每k个数删一次,求最后留下的数。为了处理方便,我们约定n个人的编号为0~n-1,最后答案+1就好,先不考虑m,设f[ n ]为这n个人最后留下的编号,那么f[ n ] =( f[ n-1 ] + k)%n+,f[ 1 ] = 0。根据这个递推式,一直推到n-1,第一个数我们是删m,因此答案 f[ n ] = (f[ n-1 ] + m)%n
2013-08-09 16:09:21
733
原创 UVA 10635 Prince and Princess
一开始用滚动数组写了个N^2 的LCS 果断TLE了。由于每个序列的元素都是互不相同的,所以将A序列重新编号,1-p,然后根据这个编号,对B也重新编号,那么实际上A和B的LCS问题就转化为求B的LIS,复杂度是O(NlogN)#include #include #include #include #include #include #in
2013-08-09 16:01:48
521
原创 UVALive 4731 Cellular Network
把n个数分成w组,每个组的值为这个组加上前面所有组的数字个数之和*这个组的概率之和,要使所有的这些组的和最小。因为每个组的概率之和前面要乘系数,而且是越早选越小,那么我们把所有数字按照从大到小排序,但由于一个组加进去数字如果过多,它前面的系数也会变大,使前面那些大数去乘一个比较大的系数,这里就需要DP一下。设dp[ i ][ j ] 表示前i个数分成j个组能获得的最小值,状态转移方
2013-08-09 15:49:21
902
原创 hdu4664 Triangulation 多校第六场
其实这题看懂了就很好搞了。 每次加边,不能形成三角形,所以肯定不加共点的边,否则就是自杀。 x个点,转移后相当于 i , x-i-2 .加的那两个点去掉了。 SG函数打表以后,很明显是要找规律。发现周期是34.而且周期要到后面才有周期。 所以前面打表,后面利用周期。 可以参考下oeis,发现这个是经典的问题。Sprague-Grun
2013-08-08 20:12:54
872
原创 hdu 4662 MU Puzzle 多校第六场
所有合法串 以M开始 I+3U 模6 == 4 或 2 MI 例外 #include #include #include using namespace std;#define REP(i,a,b) for(int i=(a); i<(b); i++)char s[101000];bool judge(int x) { if(x
2013-08-08 19:20:45
904
原创 UVA 11404 Palindromic Subsequence
逆序后求LCS,然后找出i+j == len情况的最长最小的LCS(子序列在1~i中出现,且其逆序列在i+1到len中出现,对应于回文串偶数情况), (i+j == len-1情况的最长最小的LCS+str[i+1])(子序列在1~i 中出现,且其逆序在i+2到len中出现,注意其中包括子序列为空的情况,即回文串中只有一个字符,对应于回文串奇数情况),从这俩种情况中找出最优解#incl
2013-08-08 10:29:37
584
原创 UVA 1351 UVALive 3363 String Compression
dp[i][j] 表示 i-j这一段的最小值,那么转移方程 dp[i][j] = min(dp[i][i+k]+dp[i+k+1][ j] ,(如果是i--i+k-1 这个子串的重复)min( dp[i][i+k-1] + flag+2 ) )#include #include #include #inclu
2013-08-06 20:54:15
733
原创 hdu 4649 Professor Tian 多校第五场
状态压缩——把数据转换成20位的01来进行运算 因为只有20位,而且&,|,^都不会进位,那么一位一位地看,每一位不是0就是1,这样求出每一位是1的概率,再乘以该位的十进制数,累加,就得到了总体的期望。 对于每一位,状态转移方程如下: dp[i][j]表示该位取前i个数,运算得到j(0或1)的概率是多少。 dp[i][1]=dp[i][1]*p[i]+根据不同运算符
2013-08-06 20:04:07
683
原创 hdu 4647 Another Graph Game 多校第五场
若没有边权,则对点权从大到小排序即可。。考虑边,将边权拆成两半加到它所关联的两个点的点权中即可。因为当两个人分别选择不同的点时,这一权值将互相抵消。#include #include #include #include #include #include #include #include #include using namespace std;#define c
2013-08-06 18:49:13
804
原创 hdu 4651 Partition 多校第五场
参见五边形定理。。点击打开链接#include #include #include #include #include #include #include #include #include using namespace std;#define clr(a, x) memset(a, x, sizeof(a))#define rep(i, n) for
2013-08-06 18:32:53
1136
原创 poj 3809 UVaLive 4643 Twenty Questions
#include #include #include #include #include #include #include #include #include using namespace std;#define clr(a, x) memset(a, x, sizeof(a))#define rep(i, n) for (int i = 0; i < (int)(n);
2013-08-03 20:35:52
1036
原创 UVA 10534 Wavio Sequence
题意:给你一个序列,求一个最长波浪子序列(不一定连续),满足长度为奇数2k+1 它满足前k+1个是严格递增的,后k+1是严格递减的,即相邻两个数不能相同,输出最大长度。 可以转化为经典的LIS问题,预先用O(nlogn)处理出dp1[ i ],dp2[ i ] ,dp1[ i ] 为以第i个数尾的最长递增序列长度,dp2[ i ] 为以i为开头,到n的最长递减序列长度那么ans = max
2013-08-03 17:14:37
714
原创 UVA 1424 Salesmen dp入门题
题目大意:给你一个无向联通图,在给你一个序列,要求你把它转换成另一个序列,该序列相邻两点的值要么图上是联通的,要么是相同的,要求修改的点数最小。 设dp[ i ][ j ] 表示从1到第i个位置,以数字 j 为结尾的最小修改点数,那么状态转移方程为:if(j==a[i]) dp[i][j]=min(dp[i][j],dp[i-1][k]); else dp[i][j]
2013-08-03 17:02:41
957
原创 uva 11584 Partitioning by Palindromes dp入门题
dp[i]表示前i个最少构成几个回文所以转移方程为 如果(j-i)是一个回文 则 dp[i]=min(dp[i],dp[j-1]+1) (j#include #include #include #include #include #include #include #include using namespace std;#define
2013-08-03 16:54:54
767
原创 uva 11552 Fewest Flops
题目大意:给你一个字符串,要你按每组k个按照顺序进行分组,每组里的字母顺序任意,然后再按照组的顺序拼起来,如果相邻的几个相同的字母算一个块,拼起来后,最少的块是多少?所以要最小每组相同字母肯定在一起,所以每组枚举结尾字母即可,dp[i][j] 表示 第i组 字母j 结尾 的最小值如果第i组结尾和第i-1组结尾字母相同 如果 i组的 size==1 则 相等 否则 dp
2013-08-03 16:38:06
664
原创 UVA 1169 Robotruck
dp[i] 表示从原点出发,将前i个垃圾处理的最小距离dis[i] 表示从原点一直到第i个的总距离 所以 dis[i]-dis[j+1] 表示从第就j+1 到 i 的距离 odis[i] 表示第i个到原点的距离,w[i] 表示前i个的质量之和 dp[i]= min(dp[j]+odis[j+1]+dis[i]-dis[j+1]+odis[i] ) j令cal( j
2013-08-03 12:39:23
884
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人