QOJ.ac
QOJ
ID | Problem | Submitter | Result | Time | Memory | Language | File size | Submit time | Judge time |
---|---|---|---|---|---|---|---|---|---|
#643457 | #5114. Cells Coloring | Oo | WA | 92ms | 6948kb | C++20 | 2.3kb | 2024-10-15 21:16:52 | 2024-10-15 21:16:55 |
Judging History
answer
#include<bits/stdc++.h>
using namespace std;
//#define int long long
const int inf = 4010;
const int N = 2010;
const int M = 5e5 + 10;
int n, m, s, t, c, d;
int len = 1;
int lin[N], dis[N], now[N], a[N];
struct edge {
int next, y, flow;
int Flow;
bool tag;
}e[M << 1];
void add(int x, int y, int flow) {
e[++len].next = lin[x];
e[len].y = y;
e[len].flow = flow;
e[len].Flow = flow;
lin[x] = len;
e[++len].next = lin[y];
e[len].y = x;
e[len].flow = 0;
e[len].tag = 1;
lin[y] = len;
}
bool bfs() {
memset(dis, 0, sizeof(dis));
queue<int> q;
q.push(s);
dis[s] = 1;
now[s] = lin[s];
while(!q.empty()) {
int x = q.front();
q.pop();
for(int i = lin[x]; i; i = e[i].next) {
int y = e[i].y;
if(e[i].flow && !dis[y]) {
q.push(y);
now[y] = lin[y];
dis[y] = dis[x] + 1;
if(y == t) return true;
}
}
}
return false;
}
int dinic(int x, int flow) {
if(x == t) return flow;
int k;
int res = 0;
for(int i = now[x]; i && flow; i = e[i].next) {
now[x] = i;
int y = e[i].y;
if(e[i].flow && dis[y] == dis[x] + 1) {
k = dinic(y, min(flow, e[i].flow));
if(!k) dis[y] = 0;
e[i].flow -= k;
e[i ^ 1].flow += k;
res += k;
flow -= k;
}
}
return res;
}
int maxflow() {
int nowflow = 0, flow = 0;
while(bfs())
while(nowflow = dinic(s, inf)) flow += nowflow;
return flow;
}
string S[N];
signed main()
{
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n >> m >> c >> d;
vector<vector<int>> id(n + 1, vector<int>(m + 1));
for(int i = 1; i <= n; i++) {
cin >> S[i];
S[i] = '?' + S[i];
}
int tot = 0;
int cnt = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= m; j++) {
if(S[i][j] == '.') cnt++;
id[i][j] = ++tot;
}
s = n + m + 1, t = s + 1;
for(int i = 1; i <= n; i++) {
add(s, i, 0);
}
for(int i = 1; i <= m; i++) {
add(i + n, t, 0);
}
for(int i = 1; i <= n; i++) {
for(int j = 1; j <= m; j++) {
if(S[i][j] == '*') continue;
add(i, j + n, 1);
}
}
long long ans = (int)1e15;
int flow = 0;
for(int k = 0; k <= max(n, m); k++) {
flow += maxflow();
assert(flow <= cnt);
ans = min(ans, 1ll * c * k + 1ll * d * (cnt - flow));
for(int i = 2; i <= 2 * (n + m); i += 2) e[i].flow++;
}
cout << ans << '\n';
return 0;
}
Details
Tip: Click on the bar to expand more detailed information
Test #1:
score: 100
Accepted
time: 0ms
memory: 3696kb
input:
3 4 2 1 .*** *..* **..
output:
4
result:
ok 1 number(s): "4"
Test #2:
score: 0
Accepted
time: 0ms
memory: 3704kb
input:
3 4 1 2 .*** *..* **..
output:
2
result:
ok 1 number(s): "2"
Test #3:
score: -100
Wrong Answer
time: 92ms
memory: 6948kb
input:
250 250 965680874 9042302 ..**.*****..**..**.*****..***..***.**......*.***.*...***.*....*.**.*.**.*.*.****...*.******.***.************....**.*..*..***.*******.*.***.*..**..****.**.*.*..***.****..**.....***.....*.****...*...*.***..****..**.*.*******..*.*******.*.*.*.****.*.*** ....**.*******.*.******...
output:
2147483647
result:
wrong answer 1st numbers differ - expected: '109972100048', found: '2147483647'