0
点赞
收藏
分享

微信扫一扫

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



题目1 : 打折机票


10000ms

1000ms


256MB



描述

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

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


Emacs Normal Vim


区间最值问题  线段树 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;
}



举报

相关推荐

0 条评论