这是线段树的模版题。我用二分查找做的,自己二分太弱了,最近一直发现我不会写二分,在我还没有调试出二分查找求上界的时候,队友已经用线段树过了。。。。又托了好久,今天想起来,系统的学习一下二分。
1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 struct node 5 { 6 __int64 da; 7 int id; 8 }p[200001]; 9 int cmp(const void *a,const void *b) 10 { 11 return (*(struct node *)a).da > (*(struct node *)b).da?1:-1; 12 } 13 __int64 o1[200001],o2[200001]; 14 int main() 15 { 16 int n,i,j,num = 0,t,m; 17 __int64 max,st,ed,mi,w; 18 scanf("%d",&t); 19 while(t--) 20 { 21 scanf("%d%d",&n,&m); 22 memset(p,0,sizeof(p)); 23 memset(o1,0,sizeof(o1)); 24 memset(o2,0,sizeof(o2)); 25 num ++; 26 max = 0; 27 for(i = 1;i <= n;i ++) 28 { 29 scanf("%I64d%I64d",&p[2*i-2].da,&p[2*i-1].da); 30 p[2*i-1].da ++; 31 p[2*i-2].id = 1; 32 p[2*i-1].id= 0; 33 if(max < p[2*i-1].da) 34 max =p[2*i-1].da; 35 } 36 qsort(p,2*n,sizeof(p[0]),cmp); 37 if(p[0].id) 38 o2[0] ++; 39 o1[0] = p[0].da; 40 for(i = 1;i <= 2*n-1;i ++) 41 { 42 o1[i] = p[i].da; 43 if(p[i].id) 44 o2[i] = o2[i-1]+1; 45 else 46 o2[i] = o2[i-1]-1; 47 } 48 j = 0; 49 for(i = 0;i <= 2*n-2;i ++) 50 { 51 if(o1[i] != o1[i+1]) 52 { 53 o1[j] = o1[i]; 54 o2[j] = o2[i]; 55 j ++; 56 } 57 } 58 o1[j] = o1[2*n-1]; 59 o2[j] = o2[2*n-1]; 60 printf("Case #%d:\n",num); 61 for(i = 1;i <= m;i ++) 62 { 63 scanf("%I64d",&w); 64 if(w < o1[0])//特判 65 { 66 printf("0\n"); 67 continue; 68 } 69 st = 0;ed = j; 70 while(st < ed) 71 { 72 mi = (st + ed + 1)/2;//注意 73 if(o1[mi] > w) 74 ed = mi-1;//注意 75 else 76 st = mi; 77 } 78 printf("%I64d\n",o2[ed]); 79 } 80 } 81 return 0; 82 }