题目1 : 打折机票
时间限制:10000ms
单点时限:1000ms
内存限制:256MB
- 样例输入
-
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
描述
因为思念新宿的"小姐姐"们,岛娘计划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"。
区间最值问题 线段树 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; }
时间: 2024-11-08 01:37:51