結果
問題 | No.1606 Stuffed Animals Keeper |
ユーザー |
![]() |
提出日時 | 2021-07-17 00:04:33 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 25 ms / 3,000 ms |
コード長 | 9,236 bytes |
コンパイル時間 | 1,654 ms |
コンパイル使用メモリ | 130,544 KB |
実行使用メモリ | 25,472 KB |
最終ジャッジ日時 | 2024-07-06 11:40:29 |
合計ジャッジ時間 | 2,903 ms |
ジャッジサーバーID (参考情報) |
judge1 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 48 |
ソースコード
/* #region header */#pragma GCC optimize("O3") //コンパイラ最適化用#ifdef LOCAL#define _GLIBCXX_DEBUG //配列に[]でアクセス時のエラー表示#endif#define _USE_MATH_DEFINES#include <algorithm> //sort,二分探索,など#include <bitset> //固定長bit集合// #include <boost/multiprecision/cpp_dec_float.hpp>// #include <boost/multiprecision/cpp_int.hpp>#include <cassert> //assert(p)で,not pのときにエラー#include <cctype>#include <chrono> //実行時間計測#include <climits>#include <cmath> //pow,logなど#include <complex> //複素数#include <cstdio>#include <cstring>#include <deque>#include <functional> //sortのgreater#include <iomanip> //setprecision(浮動小数点の出力の誤差)#include <ios> // std::left, std::right#include <iostream> //入出力#include <iterator> //集合演算(積集合,和集合,差集合など)#include <map>#include <numeric> //iota(整数列の生成),gcdとlcm,accumulate#include <queue>#include <random>#include <set>#include <stack>#include <string>#include <unordered_map>#include <unordered_set>#include <utility> //pair#include <vector>using namespace std;typedef long long LL;typedef long double LD;#define ALL(x) x.begin(), x.end()const long long INF = numeric_limits<long long>::max() / 4;const int MOD = 1e9 + 7;// const int MOD=998244353;//略記#define FF first#define SS second#define int long long#define stoi stoll#define LD long double#define PII pair<int, int>#define PB push_back#define EB emplace_back#define MP make_pair#define SZ(x) (int)((x).size())#define VB vector<bool>#define VVB vector<vector<bool>>#define VI vector<int>#define VVI vector<vector<int>>#define REP(i, n) for (int i = 0; i < (int)(n); i++)#define REPD(i, n) for (int i = (int)(n) - (int)1; i >= 0; i--)#define FOR(i, a, b) for (int i = a; i < (int)(b); i++)#define FORD(i, a, b) for (int i = (int)(b) - (int)1; i >= (int)a; i--)const int dx[4] = {0, 1, 0, -1}, dy[4] = {-1, 0, 1, 0};const int Dx[8] = {0, 1, 1, 1, 0, -1, -1, -1},Dy[8] = {-1, -1, 0, 1, 1, 1, 0, -1};int in() {int x;cin >> x;return x;}// https://qiita.com/Lily0727K/items/06cb1d6da8a436369eed#c%E3%81%A7%E3%81%AE%E5%AE%9F%E8%A3%85void print() { cout << "\n"; }template <class Head, class... Tail> void print(Head &&head, Tail &&...tail) {cout << head;if (sizeof...(tail) != 0)cout << " ";print(forward<Tail>(tail)...);}template <class T> void print(vector<T> &vec) {for (auto &a : vec) {cout << a;if (&a != &vec.back())cout << " ";}cout << "\n";}template <class T> void print(set<T> &set) {for (auto &a : set) {cout << a << " ";}cout << "\n";}template <class T> void print(vector<vector<T>> &df) {for (auto &vec : df) {print(vec);}}// debug macro// https://atcoder.jp/contests/abc202/submissions/22815715namespace debugger {template <class T> void view(const std::vector<T> &a) {std::cerr << "{ ";for (const auto &v : a) {std::cerr << v << ", ";}std::cerr << "\b\b }";}template <class T> void view(const std::vector<std::vector<T>> &a) {std::cerr << "{\n";for (const auto &v : a) {std::cerr << "\t";view(v);std::cerr << "\n";}std::cerr << "}";}template <class T, class U> void view(const std::vector<std::pair<T, U>> &a) {std::cerr << "{\n";for (const auto &p : a)std::cerr << "\t(" << p.first << ", " << p.second << ")\n";std::cerr << "}";}template <class T, class U> void view(const std::map<T, U> &m) {std::cerr << "{\n";for (const auto &p : m)std::cerr << "\t[" << p.first << "] : " << p.second << "\n";std::cerr << "}";}template <class T, class U> void view(const std::pair<T, U> &p) {std::cerr << "(" << p.first << ", " << p.second << ")";}template <class T> void view(const std::set<T> &s) {std::cerr << "{ ";for (auto &v : s) {view(v);std::cerr << ", ";}std::cerr << "\b\b }";}template <class T> void view(const T &e) { std::cerr << e; }} // namespace debugger#ifdef LOCALvoid debug_out() {}template <typename Head, typename... Tail> void debug_out(Head H, Tail... T) {debugger::view(H);std::cerr << ", ";debug_out(T...);}#define debug(...) \do { \std::cerr << __LINE__ << " [" << #__VA_ARGS__ << "] : ["; \debug_out(__VA_ARGS__); \std::cerr << "\b\b]\n"; \} while (false)#else#define debug(...) (void(0))#endiflong long power(long long x, long long n) {// O(logn)// https://algo-logic.info/calc-pow/#toc_id_1_2long long ret = 1;while (n > 0) {if (n & 1)ret *= x; // n の最下位bitが 1 ならば x^(2^i) をかけるx *= x;n >>= 1; // n を1bit 左にずらす}return ret;}// @brief nCr. O(r log n)。あるいは前処理 O(n), 本処理 O(1)で求められる modint// の bc を検討。int comb(int n, int r) {// https://www.geeksforgeeks.org/program-to-calculate-the-value-of-ncr-efficiently/if (n < r)return 0;// p holds the value of n*(n-1)*(n-2)...,// k holds the value of r*(r-1)...long long p = 1, k = 1;// C(n, r) == C(n, n-r),// choosing the smaller valueif (n - r < r)r = n - r;if (r != 0) {while (r) {p *= n;k *= r;// gcd of p, klong long m = __gcd(p, k);// dividing by gcd, to simplify// product division by their gcd// saves from the overflowp /= m;k /= m;n--;r--;}// k should be simplified to 1// as C(n, r) is a natural number// (denominator should be 1 ) .}elsep = 1;// if our approach is correct p = ans and k =1return p;}// MODvoid add(long long &a, long long b) {a += b;if (a >= MOD)a -= MOD;}template <class T> inline bool chmin(T &a, T b) {if (a > b) {a = b;return true;}return false;}template <class T> inline bool chmax(T &a, T b) {if (a < b) {a = b;return true;}return false;}// 負数も含む丸めlong long ceildiv(long long a, long long b) {if (b < 0)a = -a, b = -b;if (a >= 0)return (a + b - 1) / b;elsereturn a / b;}long long floordiv(long long a, long long b) {if (b < 0)a = -a, b = -b;if (a >= 0)return a / b;elsereturn (a - b + 1) / b;}long long floorsqrt(long long x) {assert(x >= 0);long long ok = 0;long long ng = 1;while (ng * ng <= x)ng <<= 1;while (ng - ok > 1) {long long mid = (ng + ok) >> 1;if (mid * mid <= x)ok = mid;elseng = mid;}return ok;}// @brief a^n mod modlong long modpower(long long a, long long n, long long mod) {long long res = 1;while (n > 0) {if (n & 1)res = res * a % mod;a = a * a % mod;n >>= 1;}return res;}// @brief s が c を含むかtemplate <class T> bool contain(const std::string &s, const T &c) {return s.find(c) != std::string::npos;}__attribute__((constructor)) void faster_io() {ios_base::sync_with_stdio(false);cin.tie(nullptr);cerr.tie(nullptr);}/* #endregion */int n;bool check(vector<PII> &B) {REP(ni, SZ(B)) {if (B[ni].FF != 0 and B[ni].SS != 0)return false;}return true;}signed main() {cin >> n;VI A(n);REP(ni, n) { cin >> A[ni]; }int now0 = 0, now1 = 0;vector<PII> B;REP(ni, n) {if (A[ni] == 0)now0++;else if (A[ni] == 1)now1++;else {if (!(now0 == 0 and now1 == 0)) {B.PB(MP(now0, now1));now0 = 0, now1 = 0;}}}if (!(now0 == 0 and now1 == 0)) {B.PB(MP(now0, now1));}int m = SZ(B);int zero = 0;REP(mi, m) { zero += B[mi].FF; }// dp[i][S]:= i 番目の区間までで、全て 0 にする区間の長さの和が S// のとき、入れ替え操作の最小回数。VVI dp(m + 1, VI(zero + 1, INF));dp[0][0] = 0;REP(mi, m) {// B[mi] を 0 にするint plus_len = B[mi].FF + B[mi].SS;REP(zi, zero + 1) {if (zi + plus_len > zero)break;chmin(dp[mi + 1][zi + plus_len], dp[mi][zi] + B[mi].SS);}// 1 にするREP(zi, zero + 1) { chmin(dp[mi + 1][zi], dp[mi][zi]); }}int ans = dp[m][zero];if (ans == INF) {print(-1);exit(0);}print(ans);return 0;}