• POJ 3368:Frequent values


    Frequent values
    Time Limit: 2000MS   Memory Limit: 65536K
    Total Submissions: 14764   Accepted: 5361

    Description

    You are given a sequence of n integers a1 , a2 , ... , an in non-decreasing order. In addition to that, you are given several queries consisting of indices i and j (1 ≤ i ≤ j ≤ n). For each query, determine the most frequent value among the integers ai , ... , aj.

    Input

    The input consists of several test cases. Each test case starts with a line containing two integers n and q (1 ≤ n, q ≤ 100000). The next line contains n integers a1 , ... , an (-100000 ≤ ai ≤ 100000, for each i ∈ {1, ..., n}) separated by spaces. You can assume that for each i ∈ {1, ..., n-1}: ai ≤ ai+1. The following q lines contain one query each, consisting of two integers i and j (1 ≤ i ≤ j ≤ n), which indicate the boundary indices for the 
    query.

    The last test case is followed by a line containing a single 0.

    Output

    For each query, print one line with one integer: The number of occurrences of the most frequent value within the given range.

    Sample Input

    10 3
    -1 -1 1 1 1 1 3 10 10 10
    2 3
    1 10
    5 10
    0

    Sample Output

    1
    4
    3

    这题自己没有做出来,一直TLE,像当年做扩展欧几里德题目似的。看网上代码,才知道RMQ这种算法,总之是要记住了这种有动态规划思想的东西,还有这种询问这么多次的题目要离线处理啊啊啊啊,这都不懂你还搞毛啊光速小子。。。

    我自己都不好意思舔这个大脸上这个代码,为了以后自己常常看看,记住它吧。

    觉得这个代码写得真的好,很多细节做的真的不错(。。。。。。):

    #include <iostream>
    #include <cmath>
    #include <algorithm>
    #pragma warning(disable:4996) 
    using namespace std;
    
    int num[100005];
    int fre[100005];
    int n,q;
    
    int max_v[100005][20];
    
    void RMQ()
    {
    	int i,j;
    	for(i=1;i<=n;i++)
    	{
    		max_v[i][0]=fre[i];
    	}
    	int temp = log((double)n)/log(2.0)+1;
    	for(j=1;j<=temp;j++)
    	{
    		for(i=1;i+(1<<j)-1<=n;i++)
    		{
    			max_v[i][j]=max(max_v[i][j-1],max_v[i+(1<<(j-1))][j-1]);
    		}
    	}
    }
    
    int cal(int h,int k)
    {
    	if(h>k)
    		return 0;
    	int temp=k-h+1;
    	int temp2=log((double)temp)/log(2.0);
    
    	return max(max_v[h][temp2],max_v[k-(1<<temp2)+1][temp2]);
    }
    
    int main()
    {
    	//freopen("input.txt","r",stdin);
    	//freopen("out.txt","w",stdout);
    
    	while(scanf("%d",&n))
    	{
    		int i,h,k;
    		if(n==0)
    			break;
    		scanf("%d",&q);
    
    		memset(fre,0,sizeof(fre));
    		memset(max_v,0,sizeof(max_v));
    		for(i=1;i<=n;i++)
    		{
    			scanf("%d",&num[i]);
    			if(i==1)
    			{
    				fre[1]=1;
    			}
    			else
    			{
    				if(num[i]==num[i-1])
    					fre[i]=fre[i-1]+1;
    				else
    					fre[i]=1;
    			}
    		}
    
    		RMQ();
    		
    		for(i=1;i<=q;i++)
    		{
    			scanf("%d%d",&h,&k);
    			int temp;
    			int t=0;
    
    			while((h+t<=k)&&(num[h+t]==num[h]))
    			{
    				t++;
    			}
    			temp=h+t;
    			int temp2=cal(temp,k);
    			cout<<max(t,temp2)<<endl;
    		}
    	}
        return 0;
    }
    


    版权声明:本文为博主原创文章,未经博主允许不得转载。

  • 相关阅读:
    二叉搜索树的平衡--AVL树和树的旋转
    nginx+keepalived高可用及双主模式
    date,datetime的对比
    reg007最新邀请码!!!
    1292
    bs4.FeatureNotFound: Couldn't find a tree builder with the features you requested: lxml. Do you need to install a parser library?
    JS数组实际应用方法整理
    CSS3动画常用贝塞尔曲线-效果演示
    vue-cli3 配置生产-测试环境
    vue 路由知识点梳理及应用场景整理
  • 原文地址:https://www.cnblogs.com/lightspeedsmallson/p/4785846.html
Copyright © 2020-2023  润新知