随笔分类 - RMQ&& LCA
摘要:zoj 3611同类型的题目poj 2688化简模型即可得这样的问题,一幅图给定起点 终点 ,求起点到终点最多经过几个点,如果两种方案经过的点数相同,选路径总长短的注意,这幅图最多只有12个点,所以立刻可以想到用状态压缩来做dp[i][j]表示以i为终点的路径 为j状态(经过了那些点)时的最短路径ps:在预处理最短路的时候不要将'$'算进去,就看成一个普通的可以走的格子就可以了因为可能会出现如下情况,'$'的费用会算了四次,所以还是先数一下有几个'$'然后再独立算吧View Code #include<cstdio>#include&
        阅读全文
            
摘要:哎,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++) { ...
        阅读全文
            
摘要:给出一棵树询问 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
        阅读全文
            
摘要:返回的是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
        阅读全文
            
摘要://这里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 深搜的路径中记录的时间...
        阅读全文
            
摘要:#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-
        阅读全文
            
摘要:二分一个分段数,再用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<<
        阅读全文
            
摘要:以前的写法太挫了,现在改了一下,精简了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],
        阅读全文
            
 
                    
                
 
 浙公网安备 33010602011771号
浙公网安备 33010602011771号