QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#627510 | #5114. Cells Coloring | Doubeecat | TL | 800ms | 4640kb | C++20 | 2.5kb | 2024-10-10 16:10:27 | 2024-10-10 16:10:28 |
Judging History
answer
#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>
#include <cctype>
#include <vector>
#include <cmath>
#include <queue>
using namespace std;
#define ll long long
#define mp make_pair
#define pii pair<int,int>
const int M = 2e5 + 10;
const int N = 510;
//n*m+n+m
struct edge {
int to;
int cap;
}e[M];
int n,m,s,t,cnt = -1;
vector <int> g[N];
int cur[N],h[N];
bool vis[N];
bool bfs(int s,int t) {
for (int i = 1;i <= n+m+2;++i) h[i] = -1;
//h.assign(2*n+10,-1);
queue <int> que;
h[s] = 0;
que.push(s);
while (!que.empty()) {
const int u = que.front();
que.pop();
for (int i : g[u]) {
auto [v,c] = e[i];
if (c > 0 && h[v] == -1) {
h[v] = h[u] + 1;
if (v == t) return 1;
que.push(v);
}
}
}
return false;
}
int dfs(int u,int t,int f) {
if (u == t) {
return f;
}
auto r = f;
for (int &i = cur[u];i < int(g[u].size());++i) {
const int j = g[u][i];
auto [v,c] = e[j];
if (c > 0 && h[v] == h[u] + 1) {
auto a = dfs(v,t,min(r,c));
e[j].cap -= a;
e[j^1].cap += a;
r -= a;
if (!r) return f;
}
}
return f - r;
}
void addedge(int u,int v,int c) {
g[u].push_back(++cnt);
e[cnt].to = v,e[cnt].cap = c;
g[v].push_back(++cnt);
e[cnt].to = u,e[cnt].cap = 0;
}
int maxflow() {
int ans = 0;
while (bfs(s,t)) {
for (int i = 1;i <= n + m + 2;++i) cur[i] = 0;
//cout << ans << "\n";
ans += dfs(s,t,numeric_limits<int>::max());
}
return ans;
}
ll c,d;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
cin >> n >> m >> c >> d;
ll ans = 0,cnt = 0;
for (int i = 1;i <= n;++i) {
for (int j = 1;j <= m;++j) {
char c;cin >> c;
if (c == '.') {
addedge(i,j+n,1);
++cnt;
}
}
}
s = n + m + 1,t = n + m + 2;
for (int i = 1;i <= n;++i) {
addedge(s,i,0);
}
for (int i = 1;i <= m;++i) {
addedge(n + i,t,0);
}
ans = d * cnt;
ll res = 0;
for (int k = 1;k <= cnt;++k) {
for (int i : g[s]) {
auto [v,c] = e[i];
e[i].cap++;
}
for (int i : g[t]) {
auto [v,c] = e[i];
e[i^1].cap++;
}
ll now = maxflow();
res += now;
//cout << k << ":" << now << "\n";
ans = min(ans,c * k + d * (cnt - res));
}
cout << ans;
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3580kb
input:
3 4 2 1 .*** *..* **..
output:
4
result:
ok 1 number(s): "4"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3560kb
input:
3 4 1 2 .*** *..* **..
output:
2
result:
ok 1 number(s): "2"
Test #3:
score: 0
Accepted
time: 580ms
memory: 4576kb
input:
250 250 965680874 9042302 ..**.*****..**..**.*****..***..***.**......*.***.*...***.*....*.**.*.**.*.*.****...*.******.***.************....**.*..*..***.*******.*.***.*..**..****.**.*.*..***.****..**.....***.....*.****...*...*.***..****..**.*.*******..*.*******.*.*.*.****.*.*** ....**.*******.*.******...
output:
109972100048
result:
ok 1 number(s): "109972100048"
Test #4:
score: 0
Accepted
time: 800ms
memory: 4640kb
input:
250 250 62722280 506434 *.**.***.*.*....*....*...**.*..**..****.*.*..*.*.*..*.....**..*.*.*.*****.*.**..*.**....***..*..*.*.*.**.*..*..*.**..*...**....**..*.*.***.*****.*****.***..**.***.****....*.*.**.**.*...****....*..*.**.**********.......********...***.**..*.....**.*..* .*..********..*...*..****...
output:
8437726048
result:
ok 1 number(s): "8437726048"
Test #5:
score: -100
Time Limit Exceeded
input:
250 250 85956327 344333 ..*.............*...*.....*...*..........*.........*...*.......*..***......*.*........*.*........*........*..*..*.............*.*........*....*..*................***...................*..*.............*..*.....*..**..............*..*......*.....*..** .........*......*.*.........