#include #include #include #include using namespace std; typedef long long ll; typedef long double ld; #define PB push_back #define MP make_pair const ll MOD = 1000000007LL; const ll INF = 1ULL<<60ULL; const ll UNDEF = -1; template inline bool chkmax(T &aa, T bb) { return aa < bb ? aa = bb, true : false; } template inline bool chkmin(T &aa, T bb) { return aa > bb ? aa = bb, true : false; } const ll MAXN = (55*55)+10; struct edge { ll a, b, cap, flow; }; /* Set dinic_numnodes: number of nodes dinic_src: Source vertex dinic_dest: Target vertex No need to initialize anything else. Run ge.clear() and dinic_graph.clear() between runs. */ ll dinic_numnodes, dinic_src, dinic_dest, d[MAXN], ptr[MAXN], q[MAXN]; vector dinic_edge; vector dinic_graph[MAXN]; void add_edge (ll a, ll b, ll cap) { //printf("%lld->%lld:%lld\n",a,b,cap); edge e1 = { a, b, cap, 0 }; edge e2 = { b, a, 0, 0 }; dinic_graph[a].push_back ((ll) dinic_edge.size()); dinic_edge.push_back (e1); dinic_graph[b].push_back ((ll) dinic_edge.size()); dinic_edge.push_back (e2); } bool bfs() { ll qh=0, qt=0; q[qt++] = dinic_src; memset (d, -1, dinic_numnodes * sizeof d[0]); d[dinic_src] = 0; while (qh < qt && d[dinic_dest] == -1) { ll v = q[qh++]; for (size_t i=0; i>n>>m; for (ll x=0;x<=n+1;x++) for (ll y=0;y<=m+1;y++) b[x][y]='W'; for (ll x=0;x>b[x+1][y+1]; } ll ans=0; memset(seen,0,sizeof seen); for (ll x=1;x<=n;x++) for (ll y=1;y<=m;y++) { if (b[x][y]=='L'&&!seen[x][y]) {dfs_land(x,y);ans++;} } for (ll x=0;x<=n+1;x++) for (ll y=0;y<=m+1;y++) c[x][y]=b[x][y]; for (ll x=1;x<=n;x++) for (ll y=1;y<=m;y++) { if (c[x][y]=='L') { b[x+1][y]='W'; b[x-1][y]='W'; b[x][y+1]='W'; b[x][y-1]='W'; } } ll src=MAXN-2; ll dest=MAXN-1; ll all=0; for (ll x=1;x<=n;x++) for (ll y=1;y<=m;y++) { if (b[x][y]=='C') { //printf("%lld %lld\n",x,y); all++; if ((x+y)&1) { add_edge(src,getnode(x,y),1); if (b[x+1][y]=='C') add_edge(getnode(x,y),getnode(x+1,y),1); if (b[x][y+1]=='C') add_edge(getnode(x,y),getnode(x,y+1),1); if (b[x-1][y]=='C') add_edge(getnode(x,y),getnode(x-1,y),1); if (b[x][y-1]=='C') add_edge(getnode(x,y),getnode(x,y-1),1); } else add_edge(getnode(x,y),dest,1); } } ll flow=dinic(src,dest,MAXN); ll additional=all-flow; ll final=ans+additional; //printf("%lld %lld %lld\n",ans,additional,flow); cout<