摘要:
http://poj.org/problem?id=1150 一道题意相当简单的数论题,求P(n,m)的最后一个非零位的数字,其中0≤m≤n≤2*10^7。直接暴力大数运算是会超时的,这里要用到一些数论的知识。 引用一下wyh师兄的解释:http://www.cppblog.com/wyh123/archive/2011/08/06/152621.html 排列公式:P(n,m)=n!/(n-m)! 将一个数2和5的因子都分离出来,最后这个数就会变成个位是1,3,7,9的数。其中,个位是1的数不会影响到最后一位非零数字。于是,我们就要统计那个区间内,将2和5两种因子的数去掉以后的那些数... 阅读全文
摘要:
http://poj.org/problem?id=3070 入门级矩阵快速幂,自己打了个属于自己的模板!View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib> 4 #include <algorithm> 5 6 using namespace std; 7 typedef __int64 ll; 8 const int mod = 10000; 9 const int matSize = 100;10 11 struct Matrix {12 ll val 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=3512 贪心是我的短柄啊!WA了十几次,最终迎来了AC。。。囧! 这题是要找到每种匹配情况中两权值的积的最大值中最小的那种情况。先排序,然后从绝对值大到小,将异号的两个权值乘起来,然后再处理剩下的同号的那些。代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <vector> 5 6 using namespace std; 7 typ 阅读全文
摘要:
http://poj.org/problem?id=3667 又是一道线段树的题,这次的操作是【区间更新,查询最大连续区间】。这题是之前一题"内存管理"的模拟题的简化版,在插入区间前先查找满足要求的位置,然后就直接整段覆盖,删除也就是简单的删除区间。注意细节就好了! 刚开始的时候打算查找和覆盖打在一起,后来发现这样的操作十分困难,所以还是将查找和覆盖分离了。所以插入区间和删除区间也变成两部分了。代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cstdlib& 阅读全文
摘要:
http://poj.org/problem?id=1823 这是一道线段树的题,很久以前就听说它很经典!这是【成段更新,全段询问】的线段树。 题目要求的是更新指定区间,然后询问全部区间中连续区间的最大值。这题的时限比较紧,最好是用G++来做,C++我的代码超时了。。。。囧!View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 #include <cassert> 5 6 using namespace std; 7 8 #define lson l 阅读全文
摘要:
http://poj.org/problem?id=2201 正如题目所说,这是笛卡尔树的构造,输出每个结点的父节点,左右子结点的标号。十分简单的题,轻松1y!View Code 1 #include <cstdio> 2 #include <cstring> 3 #include <cassert> 4 #include <algorithm> 5 #include <cstdlib> 6 #include <vector> 7 8 using namespace std; 9 typedef vector<int 阅读全文
摘要:
杭州网络赛的两道水题,4414是暴力搜索,找到满足条件的十字架,4417是简单的线段树,需要查找区间中满足条件的数的个数。代码如下:hdu 4414 1 #include <cstdio> 2 #include <cstring> 3 #include <algorithm> 4 5 using namespace std; 6 7 const int maxn = 55; 8 int mp[2][maxn][maxn]; 9 char rec[maxn][maxn]; 10 11 void cntVer(int n) { 12 memset(mp[0], 阅读全文
摘要:
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1243 这时一道笛卡尔树的题目。 刚开始,想都没想就手打了一棵Treap,也没有计算最坏情况下要操作多少次,于是就一直改指针什么的,并一直TLE。后来,只好找题解来解释一下我TLE的原因了。直接就看到一个博客,博主也是跟我一样,刚开始的时候用了Treap,结果TLE了。然后,我就看到了一个新名词——笛卡尔树(Cartesian Tree)。我立即维基了一下笛卡尔树的定义,发现原来笛卡尔树的构造十分简单。 笛卡尔树,一种特殊的Treap,采用离线插入。当结点权值被固定的时... 阅读全文
摘要:
http://acm.hdu.edu.cn/showproblem.php?pid=1223 dp递推求满足条件的不等式的个数。 这里需要用到大数乘法,于是我就顺便打了一个大数的模板,重载了+和*运算符。 递推的公式很简单,dp[i][j] = dp[i - 1][j - 1] + dp[i - 1][j] * j,其中i 是指共有i 个符号,j 是指将i 个符号分成j 份,dp得到种类的数目。然后dp[i][1~i]各项相加,就是最终的答案了。代码如下:View Code 1 #include <cstdio> 2 #include <cstring> 3 #incl 阅读全文
摘要:
十分详细的解释:http://hi.baidu.com/kfkkwlhvxcadotr/item/14a46a2b1f889e152a0f1c5f几道相关例题的代码: 1 #include <cstdio> 2 #include <cstring> 3 #include <cassert> 4 #include <algorithm> 5 6 using namespace std; 7 8 char buf[100001]; 9 10 int minExp(char *s) {11 int i = 0, j = 1, k = 0, t;12 i 阅读全文