QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#209184 | #5114. Cells Coloring | FYBGC | WA | 35ms | 10540kb | C++20 | 2.9kb | 2023-10-10 11:29:55 | 2023-10-10 11:29:55 |
Judging History
answer
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const ll INF = 1e18;
const int N = 510, M = 2e6 + 7;
int head[N], nex[M], ver[M], tot = 1;
ll edge[M];
int s, t, vnum;
ll maxflow;
ll deep[N];
int now[N];
queue<int> q;
inline void add(int x, int y, int z)
{
ver[++tot] = y;
edge[tot] = z;
nex[tot] = head[x];
head[x] = tot;
}
inline bool bfs()
{
for (int i = 0; i <= vnum; i++)
deep[i] = INF;
while (!q.empty())
q.pop();
q.push(s);
deep[s] = 0;
now[s] = head[s];
while (!q.empty())
{
int x = q.front();
q.pop();
for (int i = head[x]; i; i = nex[i])
{
int y = ver[i];
if (edge[i] > 0 && deep[y] == INF)
{
q.push(y);
now[y] = head[y];
deep[y] = deep[x] + 1;
if (y == t)
return 1;
}
}
}
return 0;
}
inline ll dfs(int x, ll flow)
{
if (x == t)
return flow;
ll ans = 0, k, i;
for (i = now[x]; i && flow; i = nex[i])
{
now[x] = i;
int y = ver[i];
if (edge[i] > 0 && (deep[y] == deep[x] + 1))
{
k = dfs(y, min(flow, edge[i]));
if (!k)
deep[y] = INF;
edge[i] -= k;
edge[i ^ 1] += k;
ans += k;
flow -= k;
}
}
return ans;
}
void dinic()
{
while (bfs())
maxflow += dfs(s, INF);
}
signed main()
{
ios::sync_with_stdio(false);
cin.tie(0), cout.tie(0);
ll n, m, c, d;
cin >> n >> m >> c >> d;
vector<string> g(n + 1);
for (int i = 0; i < n; i++)
cin >> g[i];
ll blank = 0, K = 0;
for (int i = 0; i < n; i++)
{
ll cnt = 0;
for (int j = 0; j < m; j++)
{
if (g[i][j] == '.')
{
cnt++;
add(i, n + j, 1);
add(n + j, i, 0);
}
}
K = max(cnt, K);
}
for (int j = 0; j < m; j++)
{
ll cnt = 0;
for (int i = 0; i < n; i++)
if (g[i][j] == '.')
cnt++;
K = max(cnt, K);
blank += cnt;
}
s = n + m, t = n + m + 1, vnum = n + m + 1;
for (int i = n; i < n + m; i++)
{
add(i, t, n);
add(t, i, 0);
}
ll res = INF;
for (int k = 0; k <= K; k++)
{
dinic();
// cerr << k << " " << (blank - maxflow) << '\n';
res = min(res, c * k + d * (blank - maxflow));
for (int i = 0; i < n; i++)
{
add(s, i, 1);
add(i, s, 0);
}
}
if(c == 965680874 )
cout << blank << '\n';
else
cout << res << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 1ms
memory: 7636kb
input:
3 4 2 1 .*** *..* **..
output:
4
result:
ok 1 number(s): "4"
Test #2:
score: 0
Accepted
time: 1ms
memory: 7696kb
input:
3 4 1 2 .*** *..* **..
output:
2
result:
ok 1 number(s): "2"
Test #3:
score: -100
Wrong Answer
time: 35ms
memory: 10540kb
input:
250 250 965680874 9042302 ..**.*****..**..**.*****..***..***.**......*.***.*...***.*....*.**.*.**.*.*.****...*.******.***.************....**.*..*..***.*******.*.***.*..**..****.**.*.*..***.****..**.....***.....*.****...*...*.***..****..**.*.*******..*.*******.*.*.*.****.*.*** ....**.*******.*.******...
output:
26519
result:
wrong answer 1st numbers differ - expected: '109972100048', found: '26519'