摘要: 昨天上午看了一下关于幂取模的方法,当时对于书上所说的反复平方的方法不是很理解,下去后也忘了上网搜下了!今天晚上兴致大起,就上网搜了一个关于幂取模的方法(著名的RSA公钥的加密方法)!这种方法利用了一种分治的思想,达到了O(log(n))!对于形如a^b%c的式子:可以把b按二进制展开为b=p(n)*2^n+p(n-1)*2^(n-1)+...+p(1)*2+p(0) 其中p(i) (0<=i<=n)为0或1 这样a^b=a^(p(n)*2^n+p(n-1)*2^(n-1)+...+p(1)*2+p(0)) =a^(p(n)*2^n)*a^(p(n-1)*2^(n-1))*...*a 阅读全文
posted @ 2010-11-18 19:42 奋斗青春 阅读(636) 评论(0) 推荐(1) 编辑
摘要: 又是好长时间没有写博客了,刚参加完成都赛区的亚洲赛,尽管和两位学长一起努力得了一个铜奖,但是感觉自己和那里其他大牛的差距太大!所以,我决定要利用接下来一年的时间学好算法,好好努力,目标是明年亚洲赛 拿一块金奖!下面介绍一下用归并排序求逆序数!感觉有一点和线段树很相似,就是从中间分开!归并排序法是将两个(或两个以上)有序表合并成一个新的有序表,即把待排序序列分为若干个子序列,每个子序列是有序的。然后再把有序子序列合并为整体有序序列。归并操作的工作原理如下: 1、 申请空间,使其大小为两个已经排序序列之和,该空间用来存放合并后的序列 2、 设定两个指针,最初位置分别为两个已经排序序列的起始位置 3 阅读全文
posted @ 2010-11-12 20:47 奋斗青春 阅读(3534) 评论(4) 推荐(1) 编辑
摘要: 这道题昨天晚上写好代码交了几次,都是超时,那时没想到优化,就是单纯的线段树,晚上回去想了一下,每一个节点上可增加一个标记bj,刚开始我标记的也是增量,但是意思不一样,如果当前节点的left==a,并且right==b;如果当前节点的bj不是-1就bj+=c;如果a,b表示的区间只是当前节点的一部分,就让bj=-1;然后再向子节点推,但是这样的方法只是优化了很少的一部分,由于bj=-1之后永远也只可能是-1,所以对tle影响不大!就又换了一种标记方法!/*给每一条添加一个d变量后,我们就能在自顶向下的递归过程中,不断记录当前累积的d。因为上一层是下一层的父节点,显然父区间修改一次,子区间都会全部 阅读全文
posted @ 2010-08-24 10:41 奋斗青春 阅读(624) 评论(0) 推荐(0) 编辑
摘要: 当看到这道题A时,激动了好一会,这个题完全凭借自己写的,一点都没有参考别人的,而且是一次性通过,通过做这道题,让我看到了线段树是多么的强大!我感觉这道题和hdu 上的1169差不多,都是标记颜色,只不过最后求的不太一样,这道题目求的是从标号为a的球到标号为b的球中间共出现多少种颜色!直接贴代码了,相信学过线段树的都应该可以看懂!# include<stdio.h># include<string.h>struct node{ int left,right,mid,num;///如果num==-1,说明该节点以下,出现了至少两种颜色!如果为一个正数,则存的是颜色的类型!} 阅读全文
posted @ 2010-08-23 20:57 奋斗青春 阅读(1594) 评论(1) 推荐(2) 编辑
摘要: 今天继续公布用线段树攻克2352 的方法:题意昨天已经说过了,直接贴代码!code:# include<stdio.h>int a[32000*4];int level[15002];int Search(int step,int x,int left,int right){ a[step]++; if(x==right) return a[step]-1; int mid=(left+right)/2; if(x<=mid) return Search(2*step,x,left,mid); else return a[step*2]+Search(2*step+1,x,m 阅读全文
posted @ 2010-08-23 09:41 奋斗青春 阅读(356) 评论(0) 推荐(0) 编辑
摘要: 大致题意:给定一组点,问二维空间中各个点的等级是多少,点的等级定义如下:其左下方点的个数用的是树状数组,别人说是树状数组的入门题目,我看了好多遍都没能非常理解,最后基本上是把代码背下来了, 明天再贴上用线段树做的!# include<stdio.h># include<string.h>int level[15001];int a[32010];/////记录星星int Lowbit(int x){ return x&(-x);}void modify(int x){ for(int i=x;i<=32001;i+=Lowbit(i))/////注意:不能 阅读全文
posted @ 2010-08-22 21:27 奋斗青春 阅读(402) 评论(3) 推荐(0) 编辑
摘要: 这个是我做的线段树第三个题,比前两个区间求和稍微麻烦了一些!大致意思是:给一组棍子染色,不同的颜色有不同的值,执行一系列的区间染色后,问这组棍子的总值是多少。这题我用了两种方法,说是两种,其实就中间的某些细节不太一样!Nuumber one:每个线段树的结点,存储该结点所代表区间的染色状况num,如果该区间全为同样的颜色,则用一个正数(1,2,3)表示,如果含有多种颜色,则用-1表示,每次执行染色操作时,如果所要染的颜色与区间颜色一样,则停止,如果所要染区间跟当前结点区间一致,则直接将所要染颜色赋给当前结点的num,否则,如果当前结点区间不是混合色,则先将当前结点的颜色赋给左右子结点的num, 阅读全文
posted @ 2010-08-21 21:23 奋斗青春 阅读(1492) 评论(2) 推荐(0) 编辑
摘要: 这道题目其实是线段树,但是在一次比赛中由于数据比较弱,被我用一般的方法给水过了,学过线段树之后就又写了一遍!这道题就不翻译了,相信大家都能看懂!直接贴代码:# include<stdio.h># include<string.h>struct node { int left,right,mid; int num;//num表示该节点包含有多少个士兵}a[140000];int st[50005],sum;void make(int s,int t,int step){ a[step].left=s; a[step].right=t; a[step].mid=(s+t)/ 阅读全文
posted @ 2010-08-21 17:27 奋斗青春 阅读(486) 评论(0) 推荐(0) 编辑
摘要: 又是好多天没有写过了,这两天在研究线段树,到现在为止,总算是理解了一些! 这道题目应该是属于简单的离散题,由于a,b可能会非常的大,我没有想到怎么用线段树来做,就参考了一下别人的代码!大致的题意是这样的,有很多个小球从1开始标号,开始的时候颜色均为黑色,然后进行n次操作,每次输入两个数a,b(表示标号),然后再输入一个字符c,c可能为‘w’和‘b’其中的一个,‘w’表示把a,b之间的小球涂成白色,‘b’表示涂成黑色;最后输出longest white ball sequence的左边界和右边界!code:# include<stdio.h># include<stdlib.h 阅读全文
posted @ 2010-08-21 17:22 奋斗青春 阅读(1247) 评论(0) 推荐(0) 编辑
摘要: 自从上一篇博客给弄丢了,已经好几天都没有写过博客了,真是气愤,写了一晚上,忽然一刷新,什么都没了!!当时的郁闷啊………………上次的那几个专题就不说了,下面说这个关于图的专题!前几节是比较基本的,是最小生成树等的基础!必须要掌握好,最小生成树其实也很好理解,下面举一个关于连通图的例子!http://acm.hdu.edu.cn/showproblem.php?pid=1102这个是杭电上的1102题,比较简单的一道!最小生成树我感觉有好几种写法,只要意思理解了,怎样写都会很顺手的!下面是我写的代码!代码Code highlighting produced by Actipro CodeHighl 阅读全文
posted @ 2010-07-30 11:33 奋斗青春 阅读(206) 评论(0) 推荐(1) 编辑