A. Gudako and Ritsuka
留坑。
B. Call of Accepted
题意:定义了一种新的运算符$x d y$ 然后给出中缀表达式,求值
思路:先中缀转后缀,然后考虑如何最大如何最小,按题意模拟即可
1 #include <bits/stdc++.h> 2 using namespace std; 3 4 #define ll long long 5 6 char s[110]; 7 ll suffix[110]; 8 int vis[110]; 9 10 unordered_map <char, int> mp; 11 12 inline void Init() 13 { 14 mp.clear(); 15 mp['('] = 0; 16 mp['+'] = 1; 17 mp['-'] = 1; 18 mp['*'] = 2; 19 mp['d'] = 3; 20 } 21 22 stack <char> symbol; 23 stack <ll> Min, Max; 24 25 inline void Run() 26 { 27 Init(); 28 while (scanf("%s", s) != EOF) 29 { 30 while (!symbol.empty()) symbol.pop(); 31 while (!Min.empty()) Min.pop(); 32 while (!Max.empty()) Max.pop(); 33 memset(vis, 0, sizeof vis); 34 int cnt = 0; 35 for (int i = 0, len = strlen(s); i < len; ++i) 36 { 37 if (isdigit(s[i])) 38 { 39 ll tmp = 0; int flag = 1; 40 if (i == 1 && s[0] == '-') symbol.pop(), flag = -1; 41 else if (i > 1 && s[i - 1] == '-' && s[i - 2] == '(') symbol.pop(), flag = -1; 42 for (; i < len && isdigit(s[i]); ++i) 43 { 44 tmp = tmp * 10 + s[i] - '0'; 45 } 46 suffix[++cnt] = tmp * flag; 47 --i; 48 } 49 else 50 { 51 if (symbol.empty()) symbol.emplace(s[i]); 52 else if (s[i] == '(') symbol.emplace(s[i]); 53 else if (s[i] == ')') 54 { 55 while (1) 56 { 57 int top = symbol.top(); symbol.pop(); 58 if (top == '(') break; 59 suffix[++cnt] = top; 60 vis[cnt] = 1; 61 } 62 } 63 else 64 { 65 while (!symbol.empty() && mp[symbol.top()] >= mp[s[i]]) 66 { 67 suffix[++cnt] = symbol.top(); symbol.pop(); 68 vis[cnt] = 1; 69 } 70 symbol.emplace(s[i]); 71 } 72 } 73 } 74 while (!symbol.empty()) 75 { 76 suffix[++cnt] = symbol.top(); symbol.pop(); 77 vis[cnt] = 1; 78 } 79 for (int i = 1; i <= cnt; ++i) 80 { 81 if (!vis[i]) 82 { 83 Min.emplace(suffix[i]); 84 Max.emplace(suffix[i]); 85 } 86 else 87 { 88 ll top1 = Min.top(); Min.pop(); 89 ll top2 = Min.top(); Min.pop(); 90 ll top3 = Max.top(); Max.pop(); 91 ll top4 = Max.top(); Max.pop(); 92 if (suffix[i] == '+') 93 { 94 Min.emplace(top1 + top2); 95 Max.emplace(top3 + top4); 96 } 97 else if (suffix[i] == '-') 98 { 99 Min.emplace(top2 - top3); 100 Max.emplace(top4 - top1); 101 } 102 else if (suffix[i] == '*') 103 { 104 ll ansmin = top2 * top1; ansmin = min(ansmin, top2 * top3); ansmin = min(ansmin, top4 * top1); ansmin = min(ansmin, top4 * top3); 105 ll ansmax = top2 * top1; ansmax = max(ansmax, top2 * top3); ansmax = max(ansmax, top4 * top1); ansmax = max(ansmax, top4 * top3); 106 Min.emplace(ansmin); 107 Max.emplace(ansmax); 108 } 109 else 110 { 111 Min.emplace(top2); 112 Max.emplace(top3 * top4); 113 } 114 } 115 } 116 printf("%lld %lld\n", Min.top(), Max.top()); 117 } 118 } 119 120 int main() 121 { 122 #ifdef LOCAL 123 freopen("Test.in", "r", stdin); 124 #endif 125 126 Run(); 127 return 0; 128 }