結果
問題 |
No.3281 Pacific White-sided Dolphin vs Monster
|
ユーザー |
![]() |
提出日時 | 2025-09-27 16:16:04 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 3,337 bytes |
コンパイル時間 | 2,979 ms |
コンパイル使用メモリ | 287,784 KB |
実行使用メモリ | 7,716 KB |
最終ジャッジ日時 | 2025-09-27 16:16:12 |
合計ジャッジ時間 | 7,633 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 13 WA * 2 TLE * 1 -- * 34 |
ソースコード
#include <bits/stdc++.h> using namespace std; #define ALL(x) (x).begin(), (x).end() #define REP(i, n) for(ll i=0; i<(ll)(n); i++) bool chmax(auto& a, auto b) { return a<b ? a=b, true : false; } bool chmin(auto& a, auto b) { return a>b ? a=b, true : false; } using ll=long long; const int INF=1e9+10; const ll INFL=4e18; #ifdef DEBUG #include "./debug.hpp" #else #define debug(...) #define print_line #endif /// @brief std::multiset ラッパー template<typename T> struct MultiSet:multiset<T> { using multiset<T>::multiset; T not_found; MultiSet()=default; /// @brief コンストラクタ /// @param not_found 指定の値が見つからなかったときに返す値 MultiSet(T not_found=-1) { this->not_found=not_found; } /// @brief 最小値を返す T min() { if(this->empty())return not_found; return*this->begin(); } /// @brief 最大値を返す T max() { if(this->empty()) return not_found; return*this->rbegin(); } /// @brief 最小値を返し、削除する T pop_min() { if(this->empty()) return not_found; T ret=min(); cnt[ret]--; this->erase(this->begin()); return ret; } /// @brief 最大値を返し、削除する T pop_max() { if(this->empty()) return not_found; T ret=max(); cnt[ret]--; this->erase(prev(this->end())); return ret; } /// @brief x が含まれているか否かを返す bool contains(T x) { return this->find(x)!=this->end(); } /// @brief x を削除する /// @brief x が含まれていたか否かを返す bool discard(T x) { auto itr=this->find(x); if(itr==this->end()) return false; cnt[*itr]--; this->erase(itr); return true; } /// @brief x より大きい最小の値を返す T gt(T x) { auto itr=this->upper_bound(x); if(itr==this->end()) return not_found; return*itr; } /// @brief x 以上の最小の値を返す T ge(T x) { auto itr=this->lower_bound(x); if(itr==this->end()) return not_found; return*itr; } /// @brief x 以下の最大の値を返す T le(T x) { auto itr=this->upper_bound(x); if(itr==this->begin()) return not_found; return*prev(itr); } /// @brief x 未満最大の値を返す T lt(T x) { auto itr=this->lower_bound(x); if(itr==this->begin()) return not_found; return*prev(itr); } /// @brief x の個数を返す int count(T x) { return cnt[x]; } private: map<T,int> cnt; }; //---------------------------------------------------------- void solve() { int N; cin>>N; vector<ll> H(N); REP(i,N) cin>>H[i]; MultiSet<ll> st(-1); REP(i,N) st.insert(H[i]); ll ans=0, p=1; while(!st.empty()) { ll x=st.le(p); debug(p,st); if(x!=-1) st.discard(x); else { x=st.max(); st.discard(x); x-=p; st.insert(x); } p*=2; ans++; } cout<<ans<<endl; } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); //cout<<fixed<<setprecision(15); int T=1; //cin>>T; while(T--) solve(); }