wojiaocbj

gaokao

Apr 19th, 2022
75
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.35 KB | None | 0 0
  1. /*
  2.  Author: 曹北健
  3.  Result: AC Submission_id: 4348277
  4.  Created at: Tue Apr 19 2022 20:16:40 GMT+0800 (China Standard Time)
  5.  Problem_id: 3339   Time: 381   Memory: 2320
  6. */
  7.  
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #define MAX(a,b) (((a)>(b))?(a):(b))
  11. #define MIN(a,b) (((a)<(b))?(a):(b))
  12. int compare(const void *p,const void *q){
  13.     int a = *(int *)p,b = *(int *)q;
  14.     if(a < b)return -1;
  15.     else if(a > b)return 1;
  16.     else return 0;
  17. }
  18. void *lowerbound(void *key,void *base,size_t count,size_t itemsize,int(*compare)(const void *,const void *)){
  19.     size_t lo = 0,hi = count - 1,mid = 0;
  20.     if(compare(key,(char *)base + hi * itemsize) > 0){
  21.         return (char *)base + count * itemsize;
  22.     }
  23.     char *pmid = 0;
  24.     while(lo < hi){
  25.         mid = (lo + hi) >> 1;
  26.         pmid = ((char *)base) + mid * itemsize;
  27.         if(compare(pmid,key) < 0){
  28.             lo = mid + 1;
  29.         }
  30.         else{
  31.             hi = mid;
  32.         }
  33.     }
  34.     return (char *)base + lo * itemsize;
  35. }
  36. int a[1919810] = {0};
  37. int main(){
  38.     int i,n,m,t;
  39.     long long ans = 0;
  40.     scanf("%d%d",&m,&n);
  41.     for(i = 1;i <= m;i++){
  42.         scanf("%d",a + i);
  43.     }
  44.     qsort(a + 1,m,sizeof(int),compare);
  45.     while(n--){
  46.         scanf("%d",&t);
  47.         int *lb = (int *)lowerbound(&t,a + 1,m,sizeof(int),compare);
  48.         int pos = lb - a;
  49.         if(pos > 1){
  50.             ans += MIN(abs(a[pos] - t),abs(a[pos - 1] - t));
  51.         }
  52.         else{
  53.             ans += abs(a[pos] - t);
  54.         }
  55.     }
  56.     printf("%lld\n",ans);
  57.     return 0;
  58. }
Advertisement
Add Comment
Please, Sign In to add comment