QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#209216#5114. Cells ColoringFYBGCWA 129ms7588kbC++202.4kb2023-10-10 12:25:512023-10-10 12:25:51

Judging History

你现在查看的是最新测评结果

  • [2023-10-10 12:25:51]
  • 评测
  • 测评结果:WA
  • 用时:129ms
  • 内存:7588kb
  • [2023-10-10 12:25:51]
  • 提交

answer

#include <bits/stdc++.h>
using namespace std;
using ll = long long;

const int V = 1100;
const int E = 1010000;

template <typename T>
struct FlowGraph {
	int s, t, vtot;
	int head[V], etot;
	int dis[V], cur[V];
	struct edge {
		int v, nxt;
		T f;
	} e[E * 2];
	void add(int u,int v, T f){
		e[etot]= {v, head[u], f}; head[u] = etot++;
		e[etot]= {u, head[v], 0}; head[v] = etot++;
	}

	bool bfs() {
		for (int i = 1; i <= vtot; i++) {
			dis[i] = 0;
			cur[i] = head[i];
		}
		queue<int> q;
		q.push(s); dis[s] = 1;
		while (!q.empty()) {
			int u = q.front(); q.pop();
			for (int i = head[u]; ~i; i = e[i].nxt) {
				if (e[i].f && !dis[e[i].v]) {
					int v = e[i].v;
					dis[v] = dis[u] + 1;
					if (v == t) return true;
					q.push(v);
				}
			}
		}
		return false;
	}

	T dfs(int u, T m) {
		if (u == t) return m;
		T flow = 0;
		for (int i = cur[u]; ~i; cur[u] = i = e[i].nxt)
			if (e[i].f && dis[e[i].v] == dis[u] + 1) {
				T f = dfs(e[i].v, min(m, e[i].f));
				e[i].f -= f;
				e[i ^ 1].f += f;
				m -= f;
				flow += f;
				if (!m) break;
			}
		if (!flow) dis[u] = -1;
		return flow;
	}
	T dinic(){
		T flow=0;
		while (bfs()) flow += dfs(s, numeric_limits<T>::max());
		return flow;
	}
	void init(int s_, int t_, int vtot_) {
		s = s_;
		t = t_;
		vtot = vtot_;
		etot = 0;
		for (int i = 1; i <= vtot; i++) head[i] = -1;
	}
};
FlowGraph <ll> F;
signed main()
{
    ios::sync_with_stdio(false);
    cin.tie(0), cout.tie(0);

    ll n, m, c, d;
    cin >> n >> m >> c >> d;

    int s = n + m + 1, t = n + m + 2;

    F.init(s, t, n + m + 2);

    vector<string> g(n + 1);
    for (int i = 0; i < n; i++)
        cin >> g[i];

    ll blank = 0;
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            if (g[i][j] == '.')
            {
                blank++;
                int u = i + 1, v = j + 1 + n;
                F.add(u, v, 1);
            }
        }
    }

    for (int i = n + 1; i <= n + m; i++)
        F.add(i, t, numeric_limits<ll>::max());

    ll res = d * blank, maxflow = 0;
    for (int k = 1; k <= max(n, m); k++)
    {
        for (int i = 1; i <= n; i++)
            F.add(s, i, 1);

        maxflow += F.dinic();
        // cerr << k << " " << maxflow << '\n';
        res = min(res, c * k + d * (blank - maxflow));
    }

    cout << res << '\n';

    return 0;
}

Details

Tip: Click on the bar to expand more detailed information

Test #1:

score: 100
Accepted
time: 0ms
memory: 3628kb

input:

3 4 2 1
.***
*..*
**..

output:

4

result:

ok 1 number(s): "4"

Test #2:

score: 0
Accepted
time: 0ms
memory: 3660kb

input:

3 4 1 2
.***
*..*
**..

output:

2

result:

ok 1 number(s): "2"

Test #3:

score: -100
Wrong Answer
time: 129ms
memory: 7588kb

input:

250 250 965680874 9042302
..**.*****..**..**.*****..***..***.**......*.***.*...***.*....*.**.*.**.*.*.****...*.******.***.************....**.*..*..***.*******.*.***.*..**..****.**.*.*..***.****..**.....***.....*.****...*...*.***..****..**.*.*******..*.*******.*.*.*.****.*.***
....**.*******.*.******...

output:

109628492572

result:

wrong answer 1st numbers differ - expected: '109972100048', found: '109628492572'