zoukankan      html  css  js  c++  java
  • POJ 3264

    一道RMQ问题,锻炼使用线段树解决。不过对于线段树的query过程还有待提高理解程度

    之后锻炼使用Tarjan的Sparse table一并记录

    // segment Tree
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <string>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <stack>
    #include <map>
    #include <set>
    #include <deque>
    using namespace std;
    
    const int maxn= 50005;
    const int INF= 0x3f3f3f3f;
    
    struct Node
    {
    	int l, r;
    	int n_min, n_max;
    }segTree[maxn<<2];
    int n_min, n_max;
    int a[maxn];
    
    void Build(int i, int l, int r)
    {
    	if (l> r){
    		return;
    	}
    	segTree[i].l= l;
    	segTree[i].r= r;
    	if (l== r){
    		segTree[i].n_max= segTree[i].n_min= a[l];
    		return;
    	}
    	int mid= (l+r)>>1;
    	Build(i<<1, l, mid);
    	Build((i<<1)|1, mid+1, r);
    	segTree[i].n_min= min(segTree[i<<1].n_min, segTree[(i<<1)|1].n_min);
    	segTree[i].n_max= max(segTree[i<<1].n_max, segTree[(i<<1)|1].n_max);
    }
    void Query(int i, int l, int r)
    {
    	if (segTree[i].n_min> n_min && segTree[i].n_max< n_max){
    		return;
    	}
    	if (l== segTree[i].l && r== segTree[i].r){
    		n_min= min(segTree[i].n_min, n_min);
    		n_max= max(segTree[i].n_max, n_max);
    		return;
    	}
    	int mid= (segTree[i].l+segTree[i].r)>>1;
    	if (mid>= r){
    		Query(i<<1, l, r);
    	}
    	else if (mid< l){
    		Query((i<<1)|1, l, r);
    	}
    	else{
    		Query(i<<1, l, mid);
    		Query((i<<1)|1, mid+1, r);
    	}
    }
    
    int main(int argc, char const *argv[])
    {
    	int n, q;
    	scanf("%d %d", &n, &q);
    	for (int i= 1; i<= n; ++i){
    		scanf("%d", a+i);
    	}
    	Build(1, 1, n);
    	while (q--){
    		int l, r;
    		scanf("%d %d", &l, &r);
    		n_max= -INF;
    		n_min= INF;
    		Query(1, l, r);
    		printf("%d
    ", n_max-n_min);
    	}
    	return 0;
    }
    
    // RMQ, Sparse table
    #include <iostream>
    #include <algorithm>
    #include <queue>
    #include <string>
    #include <vector>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <string>
    #include <stack>
    #include <map>
    #include <set>
    #include <deque>
    using namespace std;
    
    const int maxn= 50005;
    const int INF= 0x3f3f3f3f;
    
    int a[maxn], mm[maxn];
    int mn[maxn][20], mx[maxn][20];
    
    void InitRMQ(int n, int c[])
    {
    	mm[0]= -1;
    	for (int i= 1; i<= n; ++i){
    		mm[i]= i & (i-1) ? mm[i-1] : mm[i-1]+1;
    		mx[i][0]= mn[i][0]= c[i];
    	}
    
    	for (int j= 1; j<= mm[n]; ++j){
    		for (int i= 1; i+(1<<j)-1<= n; ++i){
    			mn[i][j]= min(mn[i][j-1], mn[i+(1<<(j-1))][j-1]);
    			mx[i][j]= max(mx[i][j-1], mx[i+(1<<(j-1))][j-1]); 
    		}
    	}
    }
    int RMQ(int l, int r)
    {
    	int k= mm[r-l+1];
    	int t_mn, t_mx;
    	t_mn= min(mn[l][k], mn[r-(1<<k)+1][k]);
    	t_mx= max(mx[l][k], mx[r-(1<<k)+1][k]);
    
    	return t_mx-t_mn;
    }
    
    int main(int argc, char const *argv[])
    {
    	int n, q;
    	scanf("%d %d", &n, &q);
    	for (int i= 1; i<= n; ++i){
    		scanf("%d", a+i);
    	}
    	InitRMQ(n, a);
    	while (q--){
    		int l, r;
    		scanf("%d %d", &l, &r);
    		printf("%d
    ", RMQ(l, r));
    	}
    	return 0;
    }
    
  • 相关阅读:
    String to Integer (atoi)
    Reverse Integer
    ZigZag Conversion
    01-GIT
    04-Eclipse操作SVN
    03-客户端访问SVN服务器
    02-Subversion安装与配置
    01-SVN概述
    09-Spring整合之SSH
    08-Spring的事务管理
  • 原文地址:https://www.cnblogs.com/Idi0t-N3/p/14763556.html
Copyright © 2011-2022 走看看