【思维】Kenken Race
题目描述
There are N squares arranged in a row, numbered 1,2,...,N from left to right. You are given a string S of length N consisting of . and #. If the i-th character of S is #, Square i contains a rock; if the i-th character of S is ., Square i is empty.
In the beginning, Snuke stands on Square A, and Fnuke stands on Square B.
You can repeat the following operation any number of times:
Choose Snuke or Fnuke, and make him jump one or two squares to the right. The destination must be one of the squares, and it must not contain a rock or the other person.
You want to repeat this operation so that Snuke will stand on Square C and Fnuke will stand on Square D.
Determine whether this is possible.
Constraints
4≤N≤200000
S is a string of length N consisting of . and #.
1≤A,B,C,D≤N
Square A, B, C and D do not contain a rock.
A, B, C and D are all different.
A<B
A<C
B<D
In the beginning, Snuke stands on Square A, and Fnuke stands on Square B.
You can repeat the following operation any number of times:
Choose Snuke or Fnuke, and make him jump one or two squares to the right. The destination must be one of the squares, and it must not contain a rock or the other person.
You want to repeat this operation so that Snuke will stand on Square C and Fnuke will stand on Square D.
Determine whether this is possible.
Constraints
4≤N≤200000
S is a string of length N consisting of . and #.
1≤A,B,C,D≤N
Square A, B, C and D do not contain a rock.
A, B, C and D are all different.
A<B
A<C
B<D
输入
Input is given from Standard Input in the following format:
N A B C D
S
N A B C D
S
输出
Print Yes if the objective is achievable, and No if it is not.
样例输入
7 1 3 6 7
.#..#..
样例输出
Yes
提示
The objective is achievable by, for example, moving the two persons as follows. (A and B represent Snuke and Fnuke, respectively.)
A#B.#..
A#.B#..
.#AB#..
.#A.#B.
.#.A#B.
.#.A#.B
.#..#AB
【题解】:
题目没有给定A,C与B,D之间的关系,所以我们分类讨论,
如果C==D,则无解,
如果两个区间不重叠,那么我们只要单独判断每一个区间内是否合法。
如果两个区间是相交的,那么我们需要判断一下中间是否有三个空位让A跳过去。先判断B是否能到D,如果不能,则无解,如果可以,还需要在路途中A,C路上是否有三个阻碍物,不然无法跳出去。
1 #include<bits/stdc++.h> 2 using namespace std ; 3 const int N = 2e5+100; 4 char s[N]; 5 int main (){ 6 int n,A,B,C,D; 7 scanf("%d%d%d%d%d",&n,&A,&B,&C,&D); 8 scanf("%s",s+1); 9 if( C == D ){ 10 printf("No\n"); 11 }else if( C < D ){ 12 int flag = 1 ; 13 // if( s[C] == '#' || s[D] == '#' ) flag = 0 ; 14 for ( int i = A ; i < C ; i++ ){ 15 if ( s[i] == '#' && s[i+1] == '#' ){ 16 flag = 0; 17 break ; 18 } 19 } 20 for ( int i = B ; i < D ; i++ ){ 21 if ( s[i] == '#' && s[i+1] == '#' ){ 22 flag = 0; 23 break ; 24 } 25 } 26 if( flag ){ 27 printf("Yes\n"); 28 }else{ 29 printf("No\n"); 30 } 31 }else{ 32 int flag = 1 ; 33 for ( int i = B ; i < D ; i++ ){ 34 if ( s[i] == '#' && s[i+1] == '#' ){ 35 flag = 0; 36 break ; 37 } 38 } 39 for ( int i = A ; i < C ; i++ ){ 40 if ( 41 (s[i] == '#' && s[i+1] == '#') || 42 (s[i] == '#' && i+1 == D ) || 43 (s[i+1] == '#' && i == D ) 44 ){ 45 flag = 0; 46 break ; 47 } 48 } 49 50 int f = 0 ; 51 for ( int i = B ; i <= D-1 ; i++ ){ 52 if ( s[i-1] == '.' && s[i] == '.' && s[i+1] == '.' ){ 53 f = 1 ; 54 break; 55 } 56 } 57 if( flag || f ){ 58 printf("Yes\n"); 59 }else{ 60 printf("No\n"); 61 } 62 } 63 return 0 ; 64 }