Contest 1786 - 2019 년 2 단계 나 강해 질 래 개인 트 레이 닝 10 차 전 문제 A: Kenken Race dp 추월
제목 설명
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 A B
입력
Input is given from Standard Input in the following format: 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
문제 풀이: 만약 c = = d 는 틀림없이 안 될 것 이다. 만약 cd 라면 두 번 째 방법 처럼 달 려 갈 수 있 는 지, 만약 안 된다 면 중간 에 a 가 차 를 추월 할 수 있 는 지, 추월 의 조건 은 적어도 세 개의 공 터 를 연속 하 는 것 이다.
#include
using namespace std;
typedef long long ll;
const int N = 200100;
char s[N];
int dp[N];
int n;
int a, b, c, d;
int main() {
while(~scanf("%d %d %d %d %d", &n, &a, &b, &c, &d)) {
scanf("%s", s + 1);
if( c == d ) {
printf("No
");
continue;
}
for(int i = 0; i <= n; i++) dp[i] = 0;
if(c < d) {
dp[b] = 1;
for(int i = b + 1; i <= d; i++) {
if(s[i] == '#' ) continue;
dp[i] = dp[i - 1] | dp[i - 2];
}
if(!dp[d]) {
printf("No
");
continue;
}
for(int i = 0; i <= n; i++) dp[i] = 0;
dp[a] = 1;
for(int i = a + 1; i <= c; i++) {
if(s[i] == '#' || i == d) continue;
dp[i] = dp[i - 1] | dp[i - 2];
}
if(!dp[c]) {
printf("No
");
continue;
}
printf("Yes
");
} else {
dp[b] = 1;
for(int i = b + 1; i <= d; i++) {
if(s[i] == '#' ) continue;
dp[i] = dp[i - 1] | dp[i - 2];
}
if(!dp[d]) {
printf("No
");
continue;
}
for(int i = 0; i <= n; i++) dp[i] = 0;
dp[a] = 1;
for(int i = a + 1; i <= c; i++) {
if(s[i] == '#' || i == d) continue;
dp[i] = dp[i - 1] | dp[i - 2];
}
if(dp[c]) {
printf("Yes
");
continue;
}
for(int i = 0; i <= n; i++) dp[i] = 0;
dp[a] = 1;
for(int i = a + 1; i <= c; i++) {
if(s[i] == '#' ) continue;
dp[i] = dp[i - 1] | dp[i - 2];
}
int flag = 0;
for(int i = b - 1; i <= d- 2; i++) {
if(s[i] == '.' && s[i + 1] == '.' && s[i + 2] == '.')
flag = 1;
}
printf(dp[c] && flag ? "Yes
" : "No
");
}
}
return 0;
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
codeforce 991E(조합수 반복 검색)제목 링크: 링크 열기 클릭 샤오밍이 헷갈릴 때 본 자동차 번호판 숫자를 실제 숫자와 비교해 보자. ① 실제로 나온 숫자는 샤오밍이 다 봤다 ② 샤오밍은 같은 숫자만 보고 적을 수는 없다 ③ 차량 번호는 전도 제로가...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.