QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#661907 | #8940. Piggy Sort | DBsoleil# | WA | 1ms | 5844kb | C++23 | 5.0kb | 2024-10-20 18:57:42 | 2024-10-20 18:57:43 |
Judging History
answer
#include<bits/stdc++.h>
#define pb push_back
#define fi first
#define se second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
const int N=5005;
int k,n,m;
char g[N][N],ans[N][N];
void input()
{
scanf("%d%d",&n,&m);
for(int i=0;i<=n+1;i++) scanf("%s",g[i]);
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) ans[i][j]=g[i][j];
}
int check(char&x,char&y)
{
if(x=='.'||y=='.') return x+y-'.';
return x==y?x:-1;
}
bool fillrow(int x,int l,int r,int a,int b)
{
//if(x==3) cerr<<x<<' '<<l<<' '<<a<<' '<<b<<endl;
int nl=l,nr=r;
if(l>r) return 1;
if(g[x][0]!='.')
{
while(l<=r&&(ans[x][l]=='x'||check(g[x][0],g[a][l])==-1||check(g[x][0],g[b][l])==-1)) ans[x][l]='.',l++;
if(l<=r) ans[x][l]=g[x][0],g[x][0]=g[a][l]=g[b][l]='.',nl=l; else return 1;
}
else nl--;
if(g[x][m+1]!='.')
{
while(l<=r&&(ans[x][r]=='x'||check(g[x][m+1],g[a][r])==-1||check(g[x][m+1],g[b][r])==-1)) ans[x][r]='.',r--;
if(nl==l&&l==r)
{
if(ans[x][l]!=g[x][m+1]) return 1;
g[x][m+1]='.'; return 1;
}
if(l<=r) ans[x][r]=g[x][m+1],g[x][m+1]=g[a][r]=g[b][r]='.',nr=r; else return 1;
}
else nr++;
for(int i=nl+1;i<nr;i++)
{
if(ans[x][i]=='x'||check(g[a][i],g[b][i])==-1) continue;
ans[x][i]=check(g[a][i],g[b][i]),g[a][i]=g[b][i]='.';
}
return 1;
}
bool fillcolumn(int x,int u,int d,int a,int b)
{
//cerr<<x<<' '<<u<<' '<<d<<' '<<a<<' '<<b<<' '<<g[0][x]<<' '<<g[n+1][x]<<endl;
int nu=u,nd=d;
if(u>d) return 1;
if(g[0][x]!='.')
{
while(u<=d&&(ans[u][x]=='x'||check(g[0][x],g[u][a])==-1||check(g[0][x],g[u][b])==-1)) ans[u][x]='.',u++;
if(u<=d) ans[u][x]=g[0][x],g[0][x]='.',nu=u; else return 1;
}
else nu--;
if(g[n+1][x]!='.')
{
while(u<=d&&(ans[d][x]=='x'||check(g[n+1][x],g[d][a])==-1||check(g[n+1][x],g[d][b])==-1)) ans[d][x]='.',d--;
if(nu==u&&u==d)
{
if(ans[u][x]!=g[n+1][x]) return 1;
g[n+1][x]='.'; return 1;
}
//cerr<<'!'<<g[d][a]<<' '<<char(check(g[n+1][x],g[d][a]))<<' '<<char(check(g[n+1][x],g[d][b]))<<endl;
if(u<=d) ans[d][x]=g[n+1][x],g[n+1][x]='.',nd=d; else return 1;
}
else nd++;
// cerr<<' '<<u<<' '<<d<<endl;
for(int i=nu+1;i<nd;i++)
{
//cerr<<' '<<i<<' '<<g[i][a]<<' '<<g[i][b]<<endl;
if(ans[i][x]=='x'||check(g[i][a],g[i][b])==-1) continue;
ans[i][x]=check(g[i][a],g[i][b]),g[i][a]=g[i][b]='.';
}
return 1;
}
void update(char&x,char&y,char&ans)
{
if(ans=='x') return;
if(check(x,y)==-1) ans='.';
else ans=check(x,y),x=y='.';
}
bool fillin(int u,int d,int l,int r)
{
update(g[u][0],g[0][l],ans[u][l]);
update(g[u][m+1],g[0][r],ans[u][r]);
update(g[d][0],g[n+1][l],ans[d][l]);
update(g[d][m+1],g[n+1][r],ans[d][r]);
fillrow(u,l+1,r-1,0,0);
fillrow(d,l+1,r-1,n+1,n+1);
fillcolumn(l,u+1,d-1,0,0);
fillcolumn(r,u+1,d-1,m+1,m+1);
return 1;
}
bool work()
{
int u=1,d=n,l=1,r=m;
while(u<=d&&l<=r)
{
// cerr<<' '<<u<<' '<<d<<' '<<l<<' '<<r<<endl;
if(u==d) return fillrow(u,l,r,0,n+1);
if(l==r) return fillcolumn(l,u,d,0,m+1);
fillin(u,d,l,r);
u++,d--,l++,r--;
}
return 1;
}
bool check()
{
//cerr<<1<<endl;
for(int i=1;i<=n;i++)
{
char lst='.';
{
for(int j=1;j<=m;++j){
if(ans[i][j]=='.'||ans[i][j]=='x') continue;
else {lst=ans[i][j];break;}
}
if(g[i][0]!='.'&&lst!=g[i][0]) return 0;
}
{
lst='.';
for(int j=m;j>=1;--j){
if(ans[i][j]=='.'||ans[i][j]=='x') continue;
else {lst=ans[i][j];break;}
}
if(g[i][m+1]!='.'&&lst!=g[i][m+1]) return 0;
}
}
for(int j=1;j<=m;j++)
{
char lst='.';
{
for(int i=1;i<=n;++i){
if(ans[i][j]=='.'||ans[i][j]=='x') continue;
else {lst=ans[i][j];break;}
}
if(g[0][j]!='.'&&lst!=g[0][j]) return 0;
}
{
lst='.';
for(int i=n;i>=1;--i){
if(ans[i][j]=='.'||ans[i][j]=='x') continue;
else {lst=ans[i][j];break;}
}
if(g[n+1][j]!='.'&&lst!=g[n+1][j]) return 0;
}
}
// for(int i=1;i<=n;i++) if(g[i][0]!='.'||g[i][m+1]!='.') return 0;
// for(int i=1;i<=m;i++) if(g[0][i]!='.'||g[n+1][i]!='.') return 0;
return 1;
}
void solve()
{
input();
if(!work()||!check()) {printf("NO\n"); return;}
printf("YES\n");
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(ans[i][j]=='x') ans[i][j]='.';
printf("%c",ans[i][j]);
}
printf("\n");
}
}
int main()
{
solve();
}
詳細信息
Test #1:
score: 0
Wrong Answer
time: 1ms
memory: 5844kb
input:
3 2 4 1 2 3 4 5 6 7 8 1 2 1 1 3 4 1 2 3 6 9 9 10 15 17 12 18 21
output:
NO
result:
wrong answer 1st lines differ - expected: '1 2', found: 'NO'