摘要: 这个RMQ算法是专门针对于求最值的高效算法。其思路比较简单,先是利用DP预处理,之后便是查询,方法如下: 假如我们需要查询的区间为(i,j),那么我们需要找到覆盖这个闭区间(左边界取i,右边界取j)的最小幂(可以重复,比如查询5,6,7,8,9,我们可以查询5678和6789)。 因为这个区间的长度 阅读全文
posted @ 2016-07-13 19:07 ShameimaruAya 阅读(209) 评论(0) 推荐(0) 编辑
摘要: 今天算是见到了线段树这玩意儿了,,, 这个线段树是一棵二叉树,树中的每一个结点表示了一个区间[a,b]。每一个叶子节点表示了一个单位区间。对于每一个非叶结点所表示的结点[a,b],其左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。 这个线段树可以使用指针来表示 阅读全文
posted @ 2016-07-13 16:32 ShameimaruAya 阅读(152) 评论(0) 推荐(0) 编辑
摘要: 这个第三题,若在考场上碰到,多半是一脸懵逼。。。满分确实很困难,但是利用纯正的广搜其实是可以过六十到七十分的(取决于细节),下面给出代码: 这个题的正解,甚是困难(也可能是题量不够吧。。。⊙﹏⊙b汗),先说说具体思路吧。之前的bfs中,有太多的冗余运算,导致后面的超时。那么 首先,如果要移动目标棋子 阅读全文
posted @ 2016-07-12 20:34 ShameimaruAya 阅读(153) 评论(0) 推荐(0) 编辑
摘要: day2的第二题其实也蛮友好的呢,刚看还被吓了下,仔细一想,诶,这不是找找拐点不就完了么?时间复杂度仅为O(n)。注意,一段连续且相等的数字,只留一个,其他删掉,下面贴出代码: 当然,利用动态规划+线段树或树状数组也是可以完成的,时间复杂度会高一些,为O(nlogn),下面同样给出代码: 代码摘自网 阅读全文
posted @ 2016-07-12 20:16 ShameimaruAya 阅读(132) 评论(0) 推荐(0) 编辑
摘要: day2的第一题,依旧不怎么难,中间利用了差分数列的原理,设一新数组d,其中有n+1项,d[i]=a[i+1]-a[i](令a[0]与a[n+1]都为0),其时间复杂复杂度为O (n),代码如下: 清清正正射命丸文是也~ 阅读全文
posted @ 2016-07-12 19:56 ShameimaruAya 阅读(105) 评论(0) 推荐(0) 编辑
摘要: 对于前六十分来说,运用SPFA或者DFS可以解决,其中要运用到最大生成树。代码如下:(SPFA) #include<iostream>#include<queue>#include<cstdio>#include<cstring>#include<algorithm>#define _min(a,b 阅读全文
posted @ 2016-07-11 21:41 ShameimaruAya 阅读(128) 评论(0) 推荐(0) 编辑
摘要: noip2013的第二题,就思路上来讲,两数组输入数据后予以排序(利用自带的c++中sort就好O(∩_∩)O~),然后找找逆序对的个数就好了,原理运用到了数学中的排序不等式:设有两组数a1,a2,……an,b1,b2,……bn,满足a1≤a2≤……≤an,b1≤b2≤……≤bn,则有a1bn+a2 阅读全文
posted @ 2016-07-11 21:20 ShameimaruAya 阅读(134) 评论(0) 推荐(0) 编辑
摘要: 作为2013年的第一题,要拿到90分还是比较简单的~时间复杂度为O(k),代码如下: #include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;int n,m,k,x,ans;i 阅读全文
posted @ 2016-07-11 21:10 ShameimaruAya 阅读(194) 评论(0) 推荐(0) 编辑
摘要: 一、相邻项序列(GDOI97第四题) 问题描述: 对于一个N*N(<=100)的正整数矩阵M,存在从M[A1,B1] 开始到M[A2,B2]结束的相邻项序列.两个项M[I,J]和M[K,L]相邻的件是指满足如下情况之一: (1)I=K+-1和J=L (2)I=K和J=L+-1。 任务:从文件中 阅读全文
posted @ 2016-07-10 17:40 ShameimaruAya 阅读(195) 评论(1) 推荐(0) 编辑