zoukankan      html  css  js  c++  java
  • POJ 3368 Frequent values (RMQ)

    题目链接:http://poj.org/problem?id=3368

    题目大意:

    给出一个n个数长度的串。 m个询问

    求出给定范围内的最大连续字符串的长度

    方法:

    RMQ模板, 记录每一个位置的数连续的次数。用RMQ求出每一个区间的最大连续字符的长度值

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    
    using namespace std;
    const int maxn = 100010;
    int A[maxn];
    int Max[maxn][20];
    int f[maxn];
    
    void RMQ(int n)
    {
    	int k = (int )(log(n) / log(2));
    	for(int j=1; j<=k; j++)
    		for(int i=1; i<=n; i++)
    			if(i + (1<<j) - 1 <= n){
    				Max[i][j] = max(Max[i][j-1], Max[i+(1<<(j-1))][j-1]);
    			}
    }
    
    int main()
    {
    	int n, q;
    	while(~scanf("%d",&n) && n)
    	{
    		scanf("%d",&q);
    		memset(f, 0, sizeof(f));
    		for(int i=1; i<=n ;i++){
    			scanf("%d", &A[i]);
    			if(A[i] == A[i-1] && i > 1)
    				f[i] = f[i-1] + 1;
    			else {
    				f[i]++;
    			}
    			Max[i][0] = f[i];
    		}
    		RMQ(n);
    		//for(int i=1; i<=n; i++)
    		//	printf("%d ",f[i]);
    		while(q--){
    			int a, b;
    			scanf("%d%d",&a,&b);
    			int t = a;
    			while(t <= b && A[t] == A[t-1])
    				t++;
    			int k = (int )(log(b-t+1)/log(2));
    			int ans;
    			if(t > b)
    				ans = 0;
    			else 
    				ans = max(Max[t][k], Max[b-(1<<k)+1][k]);
    			printf("%d
    ", max(ans,t-a));
    		}
    	}
    	return 0;
    }
    
    
    
    
    
    
    
    
    
    


  • 相关阅读:
    证明欧几里得算法的正确性
    基础练习 十六进制转换八进制
    算法训练 关联矩阵
    寻找数组中最大值
    Torry的困惑(基本型)
    最小乘积(基本型)
    矩阵乘法
    SaltStack Char02 组件
    SaltStack Char01
    Python 学习手册, char 14
  • 原文地址:https://www.cnblogs.com/yutingliuyl/p/7059027.html
Copyright © 2011-2022 走看看