2018年湘潭大学程序设计竞赛 E 吃货
题目描述
作为一个标准的吃货,mostshy又打算去联建商业街觅食了。
混迹于商业街已久,mostshy已经知道了商业街的所有美食与其价格,而且他给每种美食都赋予了一个美味度,美味度越高表示他越喜爱这种美食。
mostshy想知道,假如带t元去商业街,只能吃一种食物,能够品味到的美食的美味度最高是多少?
混迹于商业街已久,mostshy已经知道了商业街的所有美食与其价格,而且他给每种美食都赋予了一个美味度,美味度越高表示他越喜爱这种美食。
mostshy想知道,假如带t元去商业街,只能吃一种食物,能够品味到的美食的美味度最高是多少?
输入描述:
第一行是一个整数T(1 ≤ T ≤ 10),表示样例的个数。
以后每个样例第一行是两个整数n,m(1 ≤ n,m ≤ 30000),表示美食的种类数与查询的次数。
接下来n行,每行两个整数分别表示第i种美食的价格与美味度di,ci (1 ≤ di,ci ≤ 109)。
接下来m行,每行一个整数表示mostshy带t(1 ≤ t ≤ 109)元去商业街觅食。
输出描述:
每个查询输出一行,一个整数,表示带t元去商业街能够品味到美食的最高美味度是多少,如果不存在这样的美食,输出0。
示例1
说明
大量的输入输出,请使用C风格的输入输出。
二分的前提是有顺序性
1 //3*10^4*3*10^4*10 直接暴力肯定会超时的 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <algorithm> 7 using namespace std; 8 const int N =5e5+9; 9 int t,n,m; 10 struct Node 11 { 12 int d,c; 13 14 }e[N]; 15 bool cmp(Node a,Node b) return a.d<b.d; 16 int a[N]; 17 int main() 18 { 19 scanf("%d",&t); 20 while(t--) 21 { 22 scanf("%d%d",&n,&m); 23 for(int i=0;i<n;i++) 24 { 25 scanf("%d%d",&e[i].d,&e[i].c); 26 27 } 28 sort(e,e+n,cmp); 29 for(int i=0;i<n;i++) { 30 a[i] = e[i].d; 31 32 } 33 for(int i=1;i<n;i++)//可以买我,那么我前面的也都可以买 34 { //我的c就是从0到我的c里面的最大值。 35 if(e[i].c<e[i-1].c) 36 e[i].c=e[i-1].c; 37 }//不排序会超时 38 //int x; 是错的,x可以定义在里面也可以定义为全局变量 39 while(m--) 40 { 41 42 int x; 43 scanf("%d",&x); 44 if(e[0].d>x)//别忘了 45 { 46 printf("0\n"); 47 continue; 48 } 49 /* 50 int l=0,r=n-1; 51 52 while(l<=r)//因为可能是n-1,所以要有== 53 { 54 int mid=(l+r)>>1; 55 if(e[mid].d<=x) 56 { 57 l=mid+1; 58 } 59 else 60 { 61 r=mid-1; 62 } 63 } 64 */ 65 int l =lower_bound(a,a+n,x)-a; 66 if(l==n) l--;//坑点 67 else if(a[l]>x) l--; 68 //二分或者利用函数都可以,但要注意坑点。 69 printf("%d\n",e[l].c); 70 } 71 } 72 return 0; 73 }