CF1583C
## 讲解
题意:
给一个由 $ 0 $ 和 $ 1 $ 组成的图。
$ 0 $ 代表该位置空, $ 1 $ 代表该位置堵塞。
由空的位置出发,如果能通过走上和左走出图外,则该位置能离开。
如果由能离开和不能离开组成的图可以反推原图,则原图是确定的输入 $ x1 $ , $ x2 $ 。
问 $ x1 $ 列到 $ x2 $ 列的图是不是确定的。
解法:当 $ x1 $ = $ x2 $ 时,全部空的点能往左走出图,所以是 `YES` 。
其他情况:
当出现:
01
10
时,会导致右下角的 $ 0 $ 无法确定,所以先找到所有的 $ 0110 $ ,记该列(左边的列)为不可确定,最后看给的范围里有没有不可确定的列即可。
## Code
#include<bits/stdc++.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
typedef long long ll;
int a[1000015],b[1000015];
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
int t, n,q,k;
vector<vector<int>>m;
cin >> n >> k;
for (int i = 0; i < n + 1; i++)a[i] = 0;
string s;
for (int i = 0; i < n; i++) {
cin >> s;
vector<int>mm;
for (int j = 0; j < k; j++) {
if (s[j] == '.')mm.push_back(0);
else mm.push_back(1);
}
m.push_back(mm);
}
for (int i = 0; i < n - 1; i++) {
for (int j = 0; j < k - 1; j++) {
if ( m[i + 1][j] == 1 && m[i][j + 1] == 1) {
a[j] = 1;
}
}
}
int bn = 0;
cin >> q;
for (int i = 0; i < k; i++)if (a[i] == 1)b[bn++] = i;
if(bn==0)b[0] = -1;
for (int i = 0; i < q; i++) {
int aa, bb;
cin >> aa >> bb;
aa--, bb--;
if (aa == bb || n == 1 || k == 1||bn==0)cout << "YES" << endl;
else {
int cc = lower_bound(b, b + bn, aa) - b;
if (b[cc] < bb && b[cc] >= aa) {
cout << "NO" << endl;
} else cout << "YES" << endl;
}
}
return 0;
}
本文来自博客园,作者:仙帝-dream,转载请注明原文链接:https://www.cnblogs.com/yyds123/p/15776920.html

浙公网安备 33010602011771号