摘要: 转载别人的:1思路: 枚举z的范围(2-31),然后枚举x的值1->pow(x,z)>=k/2,最后二分查找y的值即可。2分析: 1由公式可以知道z的范围是2-31,但是x和y的范围不好确定,所以暴力肯定TLE。 2这种类似的题目一般都是固定两个然后在二分查找第三个。 3注意二分查找的时候用到(left+right)/2,所以数据类型要为long long 这样才不会超出int(这个地方WA了N次,不解释),还有二分查找的时候求出当前的值tmp有可能超过long long 范围,所以还要判断tmp<0时候说明这时候mid大于y. 4由于pow函数使用起来比较慢,所以对于大数据 阅读全文
posted @ 2012-10-13 10:35 兴安黑熊 阅读(127) 评论(0) 推荐(0) 编辑
摘要: n一个城市的街道布局如下:从最左下方走到最右上方,每次只能往上或往右走,一共有多少种走法?对于图中任意的一个点(i,j),只能由(i-1,j)和(i,j-1)走过来,所以(i,j)点的方法数=(i-1,j)+(i,j-1)的方法数;(0,0)点到(0,n)的方法数都为1;(0,0)点到(n,0)的方法数也都为1;//递归的代码:int f[100][100];int getf(int x,int y){ if (f[x][y]!=-1) return f[x][y]; int result; if (x==0||y==0) result=1; else result=getf(x-1,y)+g 阅读全文
posted @ 2012-10-12 08:45 兴安黑熊 阅读(189) 评论(0) 推荐(0) 编辑
摘要: 在讲述DP算法的时候,一个经典的例子就是数塔问题,它是这样描述的:如下所示的数塔,要求从顶层走到底层,若每一步只能走到相邻的结点,则经过的结点的数字之和最大是多少?本题可以从上往下递推,也可以从下往上递推。从下往上:#include <iostream>using namespace std;int main(int argc, char *argv[]){ int c,n,data[102][102],inp[102][102]; cin>>c; while(c--) { cin>>n; memset(data,0,sizeof(data)); memse 阅读全文
posted @ 2012-10-12 08:32 兴安黑熊 阅读(185) 评论(0) 推荐(0) 编辑
摘要: #include <iostream>#define val 1000000000;using namespace std;const int MAX = 2;typedef struct{ long long m[MAX][MAX];} Matrix;Matrix P = {0,1, 1,1 };Matrix I = {1,0, 0,1 };Matrix matrixmul(Matrix a,Matrix b) //������������{ int i,j,k; Matrix c; for (i = 0 ; i < MAX; i++) for (j = 0; j < 阅读全文
posted @ 2012-09-28 09:44 兴安黑熊 阅读(184) 评论(0) 推荐(0) 编辑
摘要: 逆序数的应用本题的意思:很多奶牛有暴躁值,每个奶牛都有标号,当这些奶牛交换位置时,花费的时间=这2个奶牛的各自的暴躁值之和。求共交换多少次用树状数组就可以了。求暴躁值query(n)-query(x)就行了例如:2 3 1 ,共交换2次,才能变成 1 2 3; 1用了2次,次数*当前的值+前面比该数大的数的和; 2 3 比1 大,且在1的前头,所以是 1*2+2+3=7;也就是1*2+5=7; 5是这样算的,query(n)-query(x);共3个数,6-1=5;query()里是放的数的和;#include <iostream>#include <stdio.h># 阅读全文
posted @ 2012-09-23 07:36 兴安黑熊 阅读(303) 评论(0) 推荐(0) 编辑
摘要: 本题:求逆序数对的个数,用树状数组可求,将每个值赋成1,i-query(x)就是x这个数的逆序对数,也就是前面有几个比我大的数。#include <iostream>#include <stdio.h>#include <cstring>using namespace std;const int maxn=1008;int tree[maxn];int lowbit(int t){ return t & (-t); }void update(int pos,int val){ while(pos<=maxn) { tree[pos]+=val; 阅读全文
posted @ 2012-09-23 07:32 兴安黑熊 阅读(205) 评论(0) 推荐(0) 编辑
摘要: 树状数组的模版题,还是一维的!直接A掉就行!#include <iostream>#include <cstring>#include <stdio.h>using namespace std;int num=0;int tree[50005],tmp[50005];inline int lowbit(int t){ return t & (t ^ (t-1));}inline void update(int pot,int val){ while(pot <=num) { tree[pot]+=val; //if (pot==1) {cout 阅读全文
posted @ 2012-09-21 19:10 兴安黑熊 阅读(162) 评论(0) 推荐(0) 编辑
摘要: 这又是一个简单的二维树状数组的题目,题目很好,很简洁。开始时星星都不亮,每个坐标的星星只能是1或0,1代表亮,0代表灭就行了;所以如果这个星星已经是亮的了,就没必要再让它操作“亮”;如果这个星星已经是灭的了,也没必要执行 “灭”的操作了。还是要注意数组的下标从1开始,那是必须的,呵呵!还有输入的x1 x2 大小可能不是正常的,要判断一下,y1 y2同理;代码如下: 模版不用动的,早就背下来了!#include <iostream>#include <cstring>#include <stdio.h>using namespace std;const int 阅读全文
posted @ 2012-09-21 19:07 兴安黑熊 阅读(233) 评论(0) 推荐(0) 编辑
摘要: 本题是二维的树状数组的基本应用,非常好,要先读懂题意:有很多方格,每个方格对应的坐标为(I,J),刚开始时每个格子里有1本书,然后让你统计一片区域有多少本书,还可以增加书和减少,移动书。注意本题的坐标是从0开始的,而树状数组必须从1开始,否则会死循环,所以输入坐标后,都先自动+1了;二维的模版基本也是不变的! lowbit() update() query()代码:#include <iostream>#include <cstring>#include <stdio.h>using namespace std;const int maxn=1008;int 阅读全文
posted @ 2012-09-21 18:07 兴安黑熊 阅读(158) 评论(0) 推荐(0) 编辑
摘要: 1.求解Fibonacci的某一项(这个范围一般在45之内)这类题目longlong就可以了!2.求解Fibonacci的某一项模K(这个一般是大数),通用解决方法是构造矩阵求幂次这得使用矩阵连乘可以解决。见上面我推导的公式。要会使用模板。3.求解Fibonacci的前多少位(这个一般是大数),通用解法是使用通项公式下面举例来说明计算前4位123456.32=1234.56*10^2s=d.xxx*10^(len-4)log10(s)=log10(d.xxxxx)+log10(10^(len-4))=log10(d.xxxx)+len-4;log10(s)+4-len=log10(d.xxxx 阅读全文
posted @ 2012-09-20 11:21 兴安黑熊 阅读(457) 评论(0) 推荐(0) 编辑