1. 程式人生 > >Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) C. Stairs and Elevators【二分查找】

Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) C. Stairs and Elevators【二分查找】

section wal cstring describe test mathjax tar include max

In the year of 30XX30XX participants of some world programming championship live in a single large hotel. The hotel has nn floors. Each floor has mm sections with a single corridor connecting all of them. The sections are enumerated from 11 to mm along the corridor, and all sections with equal numbers on different floors are located exactly one above the other. Thus, the hotel can be represented as a rectangle of height

nn and width mm. We can denote sections with pairs of integers (i,j)(i,j), where ii is the floor, and jj is the section number on the floor.

The guests can walk along the corridor on each floor, use stairs and elevators. Each stairs or elevator occupies all sections (1,x)(1,x), (2,x)(2,x), …,

(n,x)(n,x) for some xx between 11 and mm. All sections not occupied with stairs or elevators contain guest rooms. It takes one time unit to move between neighboring sections on the same floor or to move one floor up or down using stairs. It takes one time unit to move up to vvfloors in any direction using an elevator. You can assume you don‘t have to wait for an elevator, and the time needed to enter or exit an elevator is negligible.

You are to process qq queries. Each query is a question "what is the minimum time needed to go from a room in section (x1,y1)(x1,y1) to a room in section (x2,y2)(x2,y2)?"

Input

The first line contains five integers n,m,cl,ce,vn,m,cl,ce,v (2n,m1082≤n,m≤108, 0cl,ce1050≤cl,ce≤105, 1cl+cem11≤cl+ce≤m−1, 1vn11≤v≤n−1) — the number of floors and section on each floor, the number of stairs, the number of elevators and the maximum speed of an elevator, respectively.

The second line contains clcl integers l1,,lcll1,…,lcl in increasing order (1lim1≤li≤m), denoting the positions of the stairs. If cl=0cl=0, the second line is empty.

The third line contains cece integers e1,,ecee1,…,ece in increasing order, denoting the elevators positions in the same format. It is guaranteed that all integers lili and eiei are distinct.

The fourth line contains a single integer qq (1q1051≤q≤105) — the number of queries.

The next qq lines describe queries. Each of these lines contains four integers x1,y1,x2,y2x1,y1,x2,y2 (1x1,x2n1≤x1,x2≤n, 1y1,y2m1≤y1,y2≤m) — the coordinates of starting and finishing sections for the query. It is guaranteed that the starting and finishing sections are distinct. It is also guaranteed that these sections contain guest rooms, i. e. y1y1 and y2y2 are not among lili and eiei.

Output

Print qq integers, one per line — the answers for the queries.

Example input Copy
5 6 1 1 3
2
5
3
1 1 5 6
1 3 5 4
3 3 5 3
output Copy
7
5
4
Note

In the first query the optimal way is to go to the elevator in the 5-th section in four time units, use it to go to the fifth floor in two time units and go to the destination in one more time unit.

In the second query it is still optimal to use the elevator, but in the third query it is better to use the stairs in the section 2.

題意:

有n層樓,每層有m個單元,有的單元房有電梯,有的單元房有樓梯,樓梯移動一層需要1個時間單位

電梯一個時間單位移動v層,同一層相鄰單元之間移動消耗1個時間單位

現在有q次查詢

每次查詢給出起點和終點的層數和單元位置

問從起點到終點最少需要幾個時間單位

做法:

二分查找起點和終點之間的和偏左的橫坐標的左、偏右的橫坐標的右側的電梯和樓梯的位置,取最優答案即可

叉點:

特判同一層,不需要找樓梯和電梯了,直接過去就好

代碼:

  1 #include<iostream>
  2 using namespace std;
  3 #include<cstdio>
  4 #include<cstdlib>
  5 #include<cstring>
  6 #include<algorithm>
  7 typedef long long ll;
  8 typedef long long LL;
  9 const ll maxn = 210000;
 10 ll dt[maxn],lt[maxn];
 11 ll n,m,cl,cd,v;
 12 int binsearch_big(LL a[],int n,int s){
 13     int mid;
 14     LL l = 1,r = n;
 15     while(l<=r){
 16         mid = (l+r)/2;
 17         if(a[mid]>=s)
 18             r = mid - 1;
 19         else
 20             l = mid + 1;
 21     }
 22     if(l>=1&&l<=n)
 23         return l;
 24     else
 25         return 0;
 26 }
 27 int binsearch_small(LL a[],int n,int d){
 28     int mid;
 29     LL l = 1,r = n;
 30     while(l<=r){
 31         mid = (l+r)/2;
 32         if(a[mid]<=d)
 33             l = mid + 1;
 34         else
 35             r = mid - 1;
 36     }
 37     if(r>=1&&r<=n)
 38         return r;
 39     else
 40         return 0;
 41 }
 42 int main(){
 43     scanf("%I64d%I64d%I64d%I64d%I64d",&n,&m,&cl,&cd,&v);
 44     for(int i=1;i<=cl;i++){
 45         scanf("%I64d",&lt[i]);
 46     }
 47     for(int i=1;i<=cd;i++){
 48         scanf("%I64d",&dt[i]);
 49     }
 50     sort(lt+1,lt+cl+1);
 51     sort(dt+1,dt+cd+1);
 52     int sq;
 53     scanf("%d",&sq);
 54     for(int i=0;i<sq;i++){
 55         LL x1,x2,y1,y2;
 56         scanf("%I64d%I64d%I64d%I64d",&y1,&x1,&y2,&x2);
 57         if(y1==y2){
 58             LL ans = abs(x1-x2);
 59             printf("%I64d\n",ans);
 60             continue;
 61         }
 62         LL ansl = 0,ansd = 0;
 63         ansl = abs(y2-y1);
 64         ansd = abs(y2-y1)/v+(abs(y2-y1)%v!=0);
 65         LL ll = x1,rr = x2;
 66         if(ll>rr)
 67             swap(ll,rr);
 68         LL l = binsearch_big(lt,cl,ll);
 69         LL r = binsearch_small(lt,cl,rr);
 70         if((l>0&&lt[l]>=ll&&lt[l]<=rr)||(r>0&&lt[r]>=ll&&lt[r]<=rr)){
 71             ansl+=abs(x2-x1);
 72         }
 73         else{
 74             LL wr = binsearch_big(lt,cl,rr);
 75             LL ans1 = 0x3f3f3f3f,ans2 = 0x3f3f3f3f;
 76             if(wr>0)
 77                 ans2 = abs(ll-lt[wr])+abs(rr-lt[wr]);
 78             LL wl = binsearch_small(lt,cl,ll);
 79             if(wl>0)
 80                 ans1 = abs(ll-lt[wl])+abs(rr-lt[wl]);
 81             ansl+=min(ans1,ans2);
 82         }
 83         
 84         
 85         l = binsearch_big(dt,cd,ll);
 86         r = binsearch_small(dt,cd,rr);
 87         if((l>0&&dt[l]<=rr&&dt[l]>=ll)||(r>0&&dt[r]>=ll&&dt[r]<=rr)){
 88             ansd+=abs(x2-x1);
 89         }
 90         else{
 91             LL wr = binsearch_big(dt,cd,rr);
 92             LL ans1 = 0x3f3f3f3f,ans2 = 0x3f3f3f3f;
 93             if(wr>0)
 94                 ans2 = abs(ll-dt[wr])+abs(rr-dt[wr]);
 95             LL wl = binsearch_small(dt,cd,ll);
 96             if(wl>0)
 97                 ans1 = abs(ll-dt[wl])+abs(rr-dt[wl]);
 98             ansd+=min(ans1,ans2);
 99         }
100         LL ans = min(ansd,ansl);
101         printf("%I64d\n",ans);
102     }
103     return 0;
104 }

Codeforces Round #477 (rated, Div. 2, based on VK Cup 2018 Round 3) C. Stairs and Elevators【二分查找】