結果
問題 |
No.2927 Reverse Polish Equation
|
ユーザー |
![]() |
提出日時 | 2024-10-13 18:05:25 |
言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 156 ms / 2,000 ms |
コード長 | 1,888 bytes |
コンパイル時間 | 1,034 ms |
コンパイル使用メモリ | 99,552 KB |
実行使用メモリ | 6,660 KB |
最終ジャッジ日時 | 2024-10-16 00:31:32 |
合計ジャッジ時間 | 4,930 ms |
ジャッジサーバーID (参考情報) |
judge3 / judge4 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 43 |
ソースコード
#include<iostream> #include<vector> #include<algorithm> using namespace std; using ll = long long; int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); ll q,y; cin>>q>>y; ll n = q; vector<ll> s(n); auto calc = [](string now){ ll ans = 0; for(int i = 0;i<now.size();i++){ ans *= 10; ans += now[i] - '0'; } return ans; }; for(int i = 0;i<n;i++){ string now; cin>>now; if(now=="X") s[i] = -1; else if(now=="+") s[i] = -2; else if(now=="max") s[i] = -3; else if(now=="min") s[i] = -4; else s[i] = calc(now); } ll right = 1e18; ll left = -1; auto get = [&](ll now) { vector<ll> a; for(int i = 0;i<n;i++){ if(s[i]==-1) a.push_back(now); else if(s[i]==-2){ ll p = 0; p += a.back(); a.pop_back(); p += a.back(); a.pop_back(); if(p>y) p = y + 1; a.push_back(p); }else if(s[i]==-3){ ll p = 0; p += a.back(); a.pop_back(); p = max(p,a.back()); a.pop_back(); if(p>y) p = y + 1; a.push_back(p); }else if(s[i]==-4){ ll p = 0; p += a.back(); a.pop_back(); p = min(p,a.back()); a.pop_back(); if(p>y) p = y + 1; a.push_back(p); }else{ a.push_back(s[i]); } } return a[0]; }; while(right-left>1){ ll mid = (right+left) / 2; if(get(mid)>=y) right = mid; else left = mid; } if(get(right)==y) cout<<right<<endl; else cout<<-1<<endl; }