제출 #464378

#제출 시각아이디문제언어결과실행 시간메모리
464378amunduzbaevT-Covering (eJOI19_covering)C++14
15 / 100
611 ms8204 KiB
#include "bits/stdc++.h" using namespace std; //~ int ch[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; int ch[4][3][2] = { { {0, 1}, {0, -1}, {1, 0} }, { {0, 1}, {0, -1}, {-1, 0} }, { {0, 1}, {-1, 0}, {1, 0} }, { {0, -1}, {-1, 0}, {1, 0} } }; void solve(){ int n, m; cin>>n>>m; vector<vector<int>> a(n, vector<int>(m)); vector<vector<int>> is(n, vector<int>(m)); for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ cin>>a[i][j]; } } int k; cin>>k; vector<array<int, 2>> cc(k); for(int i=0;i<k;i++) cin>>cc[i][0]>>cc[i][1]; if(k <= 10){ auto check = [&](int i, int j) -> bool{ return (~i && i < n && ~j && j < m); }; vector<vector<vector<array<int, 2>>>> neib(4, vector<vector<array<int, 2>>>(k)); for(int i=0;i<k;i++){ for(int t=0;t<4;t++){ for(int j=0;j<3;j++){ int x = cc[i][0] + ch[t][j][0], y = cc[i][1] + ch[t][j][1]; neib[t][i].push_back({x, y}); } neib[t][i].push_back({cc[i][0], cc[i][1]}); } } int pw = 1, res = -1; for(int i=0;i<k;i++) pw *= 4; for(int mask=0;mask<pw;mask++){ int tmp = mask, sum = 0; bool ok = 1; for(int i=0;i<k;i++){ int t = tmp % 4; tmp /= 4; for(auto x : neib[t][i]){ if(!check(x[0], x[1]) || is[x[0]][x[1]]) { ok = 0; break; } is[x[0]][x[1]] = 1; sum += a[x[0]][x[1]]; } if(!ok) break; } if(ok) res = max(res, sum); tmp = mask; for(int i=0;i<k;i++){ int t = tmp % 4; tmp /= 4; for(auto x : neib[t][i]){ is[x[0]][x[1]] = 0; } } } if(res > -1) cout<<res<<"\n"; else cout<<"No\n"; } else { int ch[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; for(int i=0;i<k;i++){ is[cc[i][0]][cc[i][1]] = 1; } int res = 0; auto check = [&](int i, int j) -> bool{ return (~i && i < n && ~j && j < m); }; for(int t=0;t<k;t++){ int i = cc[t][0], j = cc[t][1], cnt = 0; int sum = a[i][j], mn = 1e3; for(int t=0;t<4;t++){ int x = i + ch[t][0], y = j + ch[t][1]; if(!check(x, y)) cnt++; else if(is[x][y]) cnt++; else sum += a[x][y], mn = min(mn, a[x][y]); } if(cnt > 1) { cout<<"No\n"; return; } if(cnt == 1){ res = res + sum; } else { res = res + sum - mn; } } cout<<res<<"\n"; } } signed main(){ ios_base::sync_with_stdio(0); cin.tie(0); int t = 1; //~ cin>>t; while(t--) solve(); }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...