結果
| 問題 |
No.2927 Reverse Polish Equation
|
| コンテスト | |
| ユーザー |
momoyuu
|
| 提出日時 | 2024-10-13 18:04:42 |
| 言語 | C++23 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 1,897 bytes |
| コンパイル時間 | 1,342 ms |
| コンパイル使用メモリ | 99,192 KB |
| 実行使用メモリ | 6,824 KB |
| 最終ジャッジ日時 | 2024-10-16 00:31:27 |
| 合計ジャッジ時間 | 3,796 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge4 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 15 WA * 28 |
ソースコード
#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 = max(10ll,y + 10);
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) return p;
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) return p;
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) return p;
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;
}
momoyuu