結果

問題 No.421 しろくろチョコレート
ユーザー SHIJOU
提出日時 2020-08-21 02:01:28
言語 C++17
(gcc 13.3.0 + boost 1.87.0)
結果
AC  
実行時間 100 ms / 2,000 ms
コード長 2,535 bytes
コンパイル時間 2,498 ms
コンパイル使用メモリ 201,436 KB
最終ジャッジ日時 2025-01-13 04:36:54
ジャッジサーバーID
(参考情報)
judge5 / judge4
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
other AC * 65
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

//#define _GLIBCXX_DEBUG
#include <bits/stdc++.h>
#define rep(i, n) for(int i=0; i<n; ++i)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
using namespace std;
using ll = int64_t;
using ld = long double;
using P = pair<int, int>;
using vs = vector<string>;
using vi = vector<int>;
using vvi = vector<vi>;
template<class T> using PQ = priority_queue<T>;
template<class T> using PQG = priority_queue<T, vector<T>, greater<T> >;
const int INF = 0xccccccc;
const ll LINF = 922337203685477580LL;
template<typename T1, typename T2>
inline bool chmax(T1 &a, T2 b) {return a < b && (a = b, true);}
template<typename T1, typename T2>
inline bool chmin(T1 &a, T2 b) {return a > b && (a = b, true);}
template<typename T1, typename T2>
istream &operator>>(istream &is, pair<T1, T2> &p) { return is >> p.first >> p.second;}
template<typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) { return os << p.first << ' ' << p.second;}
struct BM {
int V;
vector<vector<int > > G;
vector<int> match;
vector<bool> used;
BM(int n=0) : V(n), G(n), match(n, -1), used(n) {}
inline void add(int u, int v) {
G[u].emplace_back(v);
G[v].emplace_back(u);
}
bool dfs(int v) {
used[v] = true;
for(int u:G[v]) {
int w = match[u];
if(w < 0 or (!used[w] and dfs(w))) {
match[v] = u;
match[u] = v;
return true;
}
}
return false;
}
int bipartite_matching() {
int res = 0;
for(int v = 0; v < V; v++) {
if(match[v] < 0) {
for(int i = 0; i < v; i++) used[i] = 0;
if(dfs(v)) res++;
}
}
return res;
}
};
const int N = 55;
//head
int n, m;
string s[N];
int cnt;
int di[] = {0, 1, 0, -1};
int dj[] = {1, 0, -1, 0};
inline bool able(int i, int j) {return i >= 0 and j >= 0 and i < n and j < m;}
inline int num(int i, int j) {return i*m+j;}
int ans;
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> m;
BM bpm(n*m);
rep(i, n) cin >> s[i];
rep(i, n) rep(j, m) if(s[i][j] != '.') {
cnt++;
rep(k, 4) {
int ni = i + di[k];
int nj = j + dj[k];
if(able(ni, nj) and s[ni][nj] != '.') {
bpm.add(num(i, j), num(ni, nj));
}
}
}
ans += 100 * bpm.bipartite_matching();
rep(i, n) rep(j, m) if(s[i][j] != '.') {
rep(k, n) rep(l, m) if(s[i][j] != s[k][l] and s[k][l] != '.' and P(i, j) < P(k, l)) {
bpm.add(num(i, j), num(k, l));
}
}
ans += 8 * bpm.bipartite_matching() + cnt - ans/50;
cout << ans << endl;
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0