結果
| 問題 |
No.708 (+ー)の式
|
| コンテスト | |
| ユーザー |
|
| 提出日時 | 2018-08-21 12:36:16 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 2 ms / 2,000 ms |
| コード長 | 2,363 bytes |
| コンパイル時間 | 1,933 ms |
| コンパイル使用メモリ | 177,780 KB |
| 実行使用メモリ | 6,820 KB |
| 最終ジャッジ日時 | 2024-12-14 13:59:11 |
| 合計ジャッジ時間 | 2,822 ms |
|
ジャッジサーバーID (参考情報) |
judge1 / judge5 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 3 |
| other | AC * 12 |
ソースコード
#define _USE_MATH_DEFINES
#include "bits/stdc++.h"
using namespace std;
#define FOR(i,j,k) for(int (i)=(j);(i)<(int)(k);++(i))
#define rep(i,j) FOR(i,0,j)
#define each(x,y) for(auto &(x):(y))
#define mp make_pair
#define MT make_tuple
#define all(x) (x).begin(),(x).end()
#define debug(x) cout<<#x<<": "<<(x)<<endl
#define smax(x,y) (x)=max((x),(y))
#define smin(x,y) (x)=min((x),(y))
#define MEM(x,y) memset((x),(y),sizeof (x))
#define sz(x) (int)(x).size()
#define RT return
using ll = long long;
using pii = pair<int, int>;
using vi = vector<int>;
using vll = vector<ll>;
using Operators = array<int, 256>;
vector<pair<int, int>> shuntingYard(const string &s, Operators operators) {
stack<int> stk;
vector<pair<int, int>> re;
for (int i = 0; i < sz(s);) {
int nex = i + 1;
if (s[i] == '(') {
stk.push(i);
} else if (s[i] == ')') {
while (true) {
int j = stk.top();
stk.pop();
if (s[j] == '(') {
break;
} else {
re.emplace_back(j, j + 1);
}
}
} else if (operators[s[i]] > 0) {
while (!stk.empty() && operators[s[stk.top()]] >= operators[s[i]]) {
int j = stk.top();
stk.pop();
re.emplace_back(j, j + 1);
}
stk.push(i);
} else {
while (nex < (int)s.size() && s[nex] != '(' && s[nex] != ')' && !operators[s[nex]]) {
nex++;
}
re.emplace_back(i, nex);
}
i = nex;
}
while (!stk.empty()) {
int i = stk.top();
stk.pop();
re.emplace_back(i, i + 1);
}
return re;
}
Operators ops;
void solve() {
ops['+'] = ops['-'] = 1;
string S;
cin >> S;
vector<pii> segs = shuntingYard(S, ops);
stack<int> stk;
each(p, segs) {
char c = S[p.first];
if (isdigit(c)) {
stk.push(c - '0');
} else {
int y = stk.top(); stk.pop();
int x = stk.top(); stk.pop();
if (c == '+')stk.push(x + y);
else stk.push(x - y);
}
}
cout << stk.top() << endl;
}
int main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout << fixed << setprecision(15);
solve();
return 0;
}