随笔分类 -  RMQ&& LCA

摘要:zoj 3611同类型的题目poj 2688化简模型即可得这样的问题,一幅图给定起点 终点 ,求起点到终点最多经过几个点,如果两种方案经过的点数相同,选路径总长短的注意,这幅图最多只有12个点,所以立刻可以想到用状态压缩来做dp[i][j]表示以i为终点的路径 为j状态(经过了那些点)时的最短路径ps:在预处理最短路的时候不要将'$'算进去,就看成一个普通的可以走的格子就可以了因为可能会出现如下情况,'$'的费用会算了四次,所以还是先数一下有几个'$'然后再独立算吧View Code #include<cstdio>#include& 阅读全文
posted @ 2012-06-25 22:04 Because Of You 阅读(2072) 评论(1) 推荐(1)
摘要:哎,CF终于变色了A题:我写了个二分,囧。。。B题:模拟题,水C题:想了半天,水王(一学长)告诉我是DP,果断敲了dp[i][j]表示i字符走到j字符最大的权值View Code int dp[30][30];int max(int a,int b){ return a>b?a:b;}int main(){ int n,i,j,k; char s[15]; while(scanf("%d",&n)!=EOF) { memset(dp,0,sizeof(dp)); for(k=1;k<=n;k++) { ... 阅读全文
posted @ 2012-05-28 03:14 Because Of You 阅读(438) 评论(0) 推荐(0)
摘要:给出一棵树询问 a-b的路径长度是多少sum【i】记录节点i到根的距离长度对于每次询问,用RMQ预处理的LCA可以在线回答每个询问, ans=sum[a]+sum[b]-2*sum[LCA(a,b)];但是这个题目离线的tarjan算法在速度上上拥有巨大的优势,几乎是瞬秒的View Code #include<string.h>#include<stdio.h>#include<vector>#include<math.h>using namespace std;const int M =40100;const double inf = 1e20 阅读全文
posted @ 2012-04-25 02:01 Because Of You 阅读(2216) 评论(0) 推荐(0)
摘要:返回的是RMQ的下标,有个地方要注意,就是在rmq模板比较大小的地方要改成<=,要不然如果有一连串的相同数字的话本来是要取的,结果没取#include<string.h>#include<stdio.h>#include<math.h>const int M=1010;int min(int a,int b){return a<b?a:b;}int dp[20][M],LOG[M];void Make_Rmqindex(int n,char b[]){ int i,j; for(i=1;i<=n;i++) dp[0][i]=i; for(i 阅读全文
posted @ 2011-11-20 12:02 Because Of You 阅读(770) 评论(2) 推荐(0)
摘要://这里lca是要开两倍空间的!!不然显示超时。。。。//因为RMQ&&LCA与郭华阳论文中不太一样,但思想是一样的 1(1) 1 / \ / | \ 2(2) 3(5) 2 3 4 / \ \ / \ 4(3) 5(4) 6(6) 5 6tot :1 2 3 4 5 6 7 8 9 10 11num :1 2 4 2 5 2 1 3 6 3 1(遍历 过程中节点的值)F[] :1 2 4 5 3 6B[] :1 2 3 2 4 2 1 5 6 5 1 深搜的路径中记录的时间... 阅读全文
posted @ 2011-10-27 13:08 Because Of You 阅读(459) 评论(0) 推荐(0)
摘要:#include<string.h>#include<stdio.h>#include<math.h>const int MAX=200005;int min(int a,int b){return a<b?a:b;}int dp[MAX][20],a[MAX];int n,k,val[MAX];int LOG[MAX];void Make_Rmq(int n,int b[]){ int i,j; for(i=1;i<=n;i++) dp[0][i]=b[i]; for(i=1;i<=LOG[n];i++) { int limit=n+1- 阅读全文
posted @ 2011-10-25 12:59 Because Of You 阅读(611) 评论(0) 推荐(0)
摘要:二分一个分段数,再用RMQ累加区间最值,跑的好慢哦#include<stdio.h>#include<string.h>const int MAX = 200010;#define min(a,b) a<b?a:b#define max(a,b) a>b?a:bint dp[MAX][30],a[MAX];int k;void init(int n){ memset(dp,0,sizeof(dp)); int i,j,m; for(i=1;i<=n;i++) { dp[i][0]=a[i]; } for(j=1,m=1;m<=n;m<< 阅读全文
posted @ 2011-10-24 18:54 Because Of You 阅读(732) 评论(0) 推荐(0)
摘要:以前的写法太挫了,现在改了一下,精简了View Code #include<stdio.h> #include<string.h> const int MAX = 10010; #define fi(a, b, c) for(int a = (b) ; a < (c) ; a++) #define FI(a, b, c) for(int a = (b) ; a <= (c) ; a++) #define fe(a,b) for(int a=(b); a; a = nxt[a]) int f[MAX],nxt[2*MAX],pnt[2*MAX],h[MAX], 阅读全文
posted @ 2011-10-24 16:37 Because Of You 阅读(290) 评论(0) 推荐(0)