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 }
View Code

相关文章: