結果
| 問題 |
No.2641 draw X
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2024-02-19 23:05:28 |
| 言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,377 bytes |
| コンパイル時間 | 997 ms |
| コンパイル使用メモリ | 88,448 KB |
| 最終ジャッジ日時 | 2025-02-19 17:34:42 |
|
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 39 WA * 2 |
ソースコード
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
using ll=long long;
#define all(v) v.begin(),v.end()
#define rall(v) v.rbegin(),v.rend()
template<class T> bool chmax(T &a, T b){if (a < b){a = b;return true;} else return false;}
template<class T> bool chmin(T &a, T b){if (a > b){a = b;return true;} else return false;}
struct UnionFind {
private:
vector<int> par, siz;
public:
UnionFind(int n) : par(n, -1), siz(n, 1) {}
int find(int x) {
if (par[x] == -1) return x;
else {
par[x] = find(par[x]);
return par[x];
}
}
bool same(int x, int y) {
return find(x) == find(y);
}
int size(int x) {
return siz[find(x)];
}
bool merge(int x, int y) {
x = find(x);
y = find(y);
if (x == y) return false;
if (siz[x] < siz[y]) swap(x, y);
siz[x] += siz[y];
par[y] = x;
return true;
}
};
const int INF=1<<30;
int main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int H,W;
cin>>H>>W;
vector<string>S(H);
for(int i=0;i<H;i++)cin>>S[i];
UnionFind uf1(H*W),uf2(H*W);
for(int i=0;i<H;i++){
for(int j=0;j<W;j++){
if(S[i][j]=='#'){
if(i+1<H&&j+1<W&&S[i+1][j+1]=='#'){
uf1.merge(W*i+j,W*(i+1)+j+1);
}
if(i+1<H&&j-1>=0&&S[i+1][j-1]=='#'){
uf2.merge(W*i+j,W*(i+1)+j-1);
}
}
}
}
vector<int>min1(H*W,INF),max1(H*W,-INF),min2(H*W,INF),max2(H*W,-INF);
for(int i=0;i<H;i++){
for(int j=0;j<W;j++){
chmin(min1[uf1.find(W*i+j)],i);
chmax(max1[uf1.find(W*i+j)],i);
chmin(min2[uf2.find(W*i+j)],i);
chmax(max2[uf2.find(W*i+j)],i);
}
}
vector flag1(H,vector<bool>(W));
for(int i=0;i<H;i++){
for(int j=0;j<W;j++){
if(flag1[i][j]||S[i][j]=='.')continue;
int l1=uf1.find(W*i+j);
if(min1[l1]==INF)continue;
int l=INF,r=-INF;
for(int k=min1[l1];k<=max1[l1];k++){
flag1[k][j-i+k]=true;
int l2=uf2.find(W*k+(j-i+k));
if(min2[l2]==INF)continue;
int a=min(k-min2[l2],max2[l2]-k);
if(min2[l2]!=max2[l2]){
chmin(l,k-a);
chmax(r,k+a);
}
}
if(!(l<=min1[l1]&&max1[l1]<=r)){
cout<<"No"<<"\n";
return 0;
}
}
}
vector flag2(H,vector<bool>(W));
for(int i=0;i<H;i++){
for(int j=0;j<W;j++){
if(flag2[i][j]||S[i][j]=='.')continue;
int l2=uf2.find(W*i+j);
if(min2[l2]==INF)continue;
int l=INF,r=-INF;
for(int k=min2[l2];k<=max2[l2];k++){
flag2[k][j+i-k]=true;
int l1=uf1.find(W*k+(j+i-k));
if(min1[l1]==INF)continue;
int a=min(k-min1[l1],max1[l1]-k);
if(min1[l1]!=max1[l1]){
chmin(l,k-a);
chmax(r,k+a);
}
}
if(!(l<=min2[l2]&&max2[l2]<=r)){
cout<<"No"<<"\n";
return 0;
}
}
}
cout<<"Yes"<<"\n";
}