QOJ.ac
QOJ
ID | 题目 | 提交者 | 结果 | 用时 | 内存 | 语言 | 文件大小 | 提交时间 | 测评时间 |
---|---|---|---|---|---|---|---|---|---|
#376074 | #8507. Clever Cell Choices | installb# | WA | 0ms | 3852kb | C++20 | 2.8kb | 2024-04-03 20:24:16 | 2024-04-03 20:24:17 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 5005;
const int M = 40005;
int ec = 1,to[M << 1],nxt[M << 1],cap[M << 1],hed[N],lev[N],cur[N];
void add_edge(int f,int t,int c){
++ ec; to[ec] = t; nxt[ec] = hed[f]; hed[f] = ec; cap[ec] = c;
++ ec; to[ec] = f; nxt[ec] = hed[t]; hed[t] = ec; cap[ec] = 0;
}
void bfs(int s,int t){
for(int i = 1;i <= t;i ++) lev[i] = -1;
queue <int> q;
lev[s] = 0; q.push(s);
while(!q.empty()){
int u = q.front(); q.pop();
for(int v,i = hed[u];i;i = nxt[i]){
v = to[i];
if(cap[i] && lev[v] == -1){
lev[v] = lev[u] + 1;
q.push(v);
}
}
}
}
int dfs(int u,int t,int f){
if(u == t) return f;
for(int v,i = cur[u];i;i = nxt[i]){
v = to[i]; cur[u] = i;
if(lev[v] == lev[u] + 1 && cap[i]){
int tmp = dfs(v,t,min(f,cap[i]));
if(tmp){
cap[i] -= tmp;
cap[i ^ 1] += tmp;
return tmp;
}
}
}
return 0;
}
int mxf = 0;
void dinic(int s,int t){
while(1){
bfs(s,t); if(lev[t] == -1) break;
for(int i = 1;i <= t;i ++) cur[i] = hed[i];
while(1){
int f = dfs(s,t,0x3f3f3f3f);
if(!f) break;
mxf += f;
}
}
}
int n,m,a[55][55];
int S,T;
int dx[4] = {-1, 1, 0, 0};
int dy[4] = { 0, 0,-1, 1};
int get_id(int x,int y){
return x * (m - 1) + y;
}
void buildedge(){
mxf = 0;
ec = 1;
for(int i = 1;i <= T;i ++) hed[i] = 0;
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= m;j ++){
if(a[i][j]) continue;
if((i + j) & 1){
add_edge(S,get_id(i,j),1);
for(int d = 0;d < 4;d ++){
int tx = i + dx[d];
int ty = j + dy[d];
if(tx >= 1 && tx <= n && ty >= 1 && ty <= m) add_edge(get_id(i,j),get_id(tx,ty),1);
}
}
else add_edge(get_id(i,j),T,1);
}
}
}
void solve(){
cin >> n >> m;
vector <pair <int,int> > vec;
for(int i = 1;i <= n;i ++){
for(int j = 1;j <= m;j ++){
char ch; cin >> ch;
if(ch == '#') a[i][j] = 1;
else vec.push_back({i,j});
}
}
S = get_id(n,m) + 1; T = S + 1;
buildedge();
dinic(S,T);
int ansmx = mxf,cnt = 0;
for(auto [x,y] : vec){
a[x][y] = 1;
buildedge();
dinic(S,T);
if(mxf == ansmx) cnt ++;
a[x][y] = 0;
}
cout << cnt << '\n';
}
int main(){
ios::sync_with_stdio(false);
solve();
return 0;
}
詳細信息
Test #1:
score: 100
Accepted
time: 0ms
memory: 3780kb
input:
3 3 #.# ... #.#
output:
4
result:
ok 1 number(s): "4"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3572kb
input:
3 3 ..# ... ...
output:
0
result:
ok 1 number(s): "0"
Test #3:
score: 0
Accepted
time: 0ms
memory: 3808kb
input:
1 4 ...#
output:
2
result:
ok 1 number(s): "2"
Test #4:
score: 0
Accepted
time: 0ms
memory: 3644kb
input:
1 5 ####.
output:
1
result:
ok 1 number(s): "1"
Test #5:
score: 0
Accepted
time: 0ms
memory: 3560kb
input:
1 6 #..###
output:
0
result:
ok 1 number(s): "0"
Test #6:
score: 0
Accepted
time: 0ms
memory: 3852kb
input:
2 5 ....# ###.#
output:
3
result:
ok 1 number(s): "3"
Test #7:
score: 0
Accepted
time: 0ms
memory: 3624kb
input:
2 6 ...##. .#.###
output:
4
result:
ok 1 number(s): "4"
Test #8:
score: -100
Wrong Answer
time: 0ms
memory: 3560kb
input:
5 5 ##... ##.#. ##.## ##.#. .##..
output:
4
result:
wrong answer 1st numbers differ - expected: '7', found: '4'