码迷,mamicode.com
首页 > 其他好文 > 详细

题目1 : 打折机票(hihoCoder挑战赛20)

时间:2016-05-07 09:14:09      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

题目1 : 打折机票

时间限制:10000ms
单点时限:1000ms
内存限制:256MB

描述

技术分享

 因为思念新宿的"小姐姐"们,岛娘计划6月份再去一趟东京,不过这次看来她需要自掏腰包。经过了几天的夜战,岛娘终于在体力耗尽之前,用Python抓下了所有6月份,上海至东京的全部共 n 张机票。现在请你帮助债台高筑的岛娘筛选出符合时间区间要求的,最贵的机票。

输入

输入数据的第一行包含两个整数 n,?m(1?≤?n,?m?≤?105),分别表示机票的总数,和询问的总数。接下来的 n 行,每行两个整数 t,?v (1?≤?t,?v?≤?105),表示每张机票出发的时间和价格。 接下来的 m 行,每行两个整数 a,?b (1?≤?a?≤?b?≤?105),表示每个询问所要求的时间区间。

输出

对于每组询问,输出一行表示最贵的价格。如果没有符合要求的机票,输出一行"None"。

样例输入
7 6
1 1
2 1
4 3
4 4
4 5
6 9
7 9
1 7
1 2
6 7
3 3
4 4
5 5
样例输出
9
1
9
None
5
None

区间最值问题  线段树 RMQ 都行

默认的GCC提交真恶心啊  就做了两道题CE两次

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
int a[100000+5];
int max_num[100000+5][20];
void RMQ(int n)  
{  
    for(int i=1;i<20;i++)  
    {  
        for(int j=1;j<=n;j++)  
        {  
            if(j+(1<<i)-1<=n)  
            {  
                max_num[j][i]=max(max_num[j][i-1],max_num[j+(1<<(i-1))][i-1]);  
            }  
        }  
    }  
      
}  
int main()
{
	int n,m;
	while(~scanf("%d %d",&n,&m))
	{
		memset(a,0,sizeof(a));
		memset(max_num,0,sizeof(max_num));
		int Max=0;
		for(int i=0;i<n;i++)
		{
			int t,v;
			scanf("%d %d",&t,&v);
			if(a[t]<v)
			a[t]=v,max_num[t][0]=v;
			if(t>Max)
			Max=t;
		}
		RMQ(Max);
		for(int i=0;i<m;i++)
		{
			int c,d;
			scanf("%d %d",&c,&d);
			int pos=(int)(log(d-c+1.0)/log(2.0));  
       		int max1=max(max_num[c][pos],max_num[d-(1<<pos)+1][pos]);
			if(max1)  
       		printf("%d\n",max1);
       		else
       		printf("None\n");
		}
	}
	return 0; 
} 


题目1 : 打折机票(hihoCoder挑战赛20)

标签:

原文地址:http://blog.csdn.net/su20145104009/article/details/51334607

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!