結果
問題 | No.608 God's Maze |
ユーザー |
![]() |
提出日時 | 2017-12-14 22:57:25 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 948 ms / 2,000 ms |
コード長 | 2,187 bytes |
コンパイル時間 | 1,608 ms |
コンパイル使用メモリ | 170,800 KB |
実行使用メモリ | 6,820 KB |
最終ジャッジ日時 | 2024-12-14 13:35:25 |
合計ジャッジ時間 | 4,172 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 65 |
ソースコード
#include <bits/stdc++.h>using namespace std;using VI = vector<int>;using VVI = vector<VI>;using PII = pair<int, int>;using LL = long long;using VL = vector<LL>;using VVL = vector<VL>;using PLL = pair<LL, LL>;using VS = vector<string>;#define ALL(a) begin((a)),end((a))#define RALL(a) (a).rbegin(), (a).rend()#define PB push_back#define EB emplace_back#define MP make_pair#define SZ(a) int((a).size())#define SORT(c) sort(ALL((c)))#define RSORT(c) sort(RALL((c)))#define UNIQ(c) (c).erase(unique(ALL((c))), end((c)))#define FOR(i,a,b) for(int i=(a);i<(b);++i)#define REP(i,n) FOR(i,0,n)#define FF first#define SS secondtemplate<class S, class T>istream& operator>>(istream& is, pair<S,T>& p){return is >> p.FF >> p.SS;}template<class S, class T>ostream& operator<<(ostream& os, const pair<S,T>& p){return os << p.FF << " " << p.SS;}template<class T>ostream& operator<<(ostream& os, const vector<T>& xs){for(auto& x: xs) os << x << " ";return os;}template<class T>void maxi(T& x, T y){if(x < y) x = y;}template<class T>void mini(T& x, T y){if(x > y) x = y;}const double EPS = 1e-10;const double PI = acos(-1.0);const LL MOD = 1e9+7;int main(){cin.tie(0);ios_base::sync_with_stdio(false);int b;cin >> b;--b;string S;cin >> S;int N = SZ(S);VI xs(N);REP(i,N){xs[i] = S[i] == '#';}VI ans(2, 1e9);REP(it,2){reverse(ALL(xs));b = N - b - 1;if(b == N-1) continue;int l = -1;for(int i=0;i<b;++i){if(xs[i]){l = i;break;}}VI tmp = xs;ans[it] = 0;if(l != -1){FOR(i,l,b){tmp[i] ^= 1;ans[it]++;}}else l = b;int ix = l;if(tmp[ix] == 1){ans[it] += 2;tmp[ix] = 0;tmp[ix+1] ^= 1;}for(int i=ix+1;i<N;++i){if(tmp[i]) continue;bool done = true;for(int j=i+1;j<N;++j)if(tmp[j]){done = false;break;}if(done){ans[it] += i - ix - 1;ix = i;break;}ans[it] += i - ix + 2;tmp[i+1] ^= 1;ix = i;}bool done = true;for(int j=ix;j<N;++j)if(tmp[j]){done = false;break;}if(!done) ans[it] += N-1-ix;}cout << min(ans[0], ans[1]) << endl;return 0;}