QOJ.ac

QOJ

IDProblemSubmitterResultTimeMemoryLanguageFile sizeSubmit timeJudge time
#643473#5114. Cells ColoringOoWA 94ms4836kbC++202.2kb2024-10-15 21:20:042024-10-15 21:20:06

Judging History

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

  • [2024-10-15 21:20:06]
  • 评测
  • 测评结果:WA
  • 用时:94ms
  • 内存:4836kb
  • [2024-10-15 21:20:04]
  • 提交

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;
long long 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;
	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++;
		}
	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, c * k + 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: 1ms
memory: 3880kb

input:

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

output:

4

result:

ok 1 number(s): "4"

Test #2:

score: 0
Accepted
time: 1ms
memory: 3636kb

input:

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

output:

2

result:

ok 1 number(s): "2"

Test #3:

score: -100
Wrong Answer
time: 94ms
memory: 4836kb

input:

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

output:

2147483647

result:

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