代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MOD = 998244353, MAXN=1e5+10, INF = (1<<30);
LL n, ans = 0, v[MAXN];
char op[MAXN];
bool flag1 = true, flag2 = true;
inline void add(LL& a, LL b)
{a = (a + b) % MOD;}
inline void mult(LL& a, LL b)
{a = (a * b) % MOD;}
inline void print(const LL& a)
{cout << ((a % MOD + MOD) % MOD) << endl;}
int main()
{
cin >> n;
for(int i = 1; i <= n; ++ i)
{
cin >> op[i] >> v[i];
if(op[i] == '*')
{
if(v[i] < 0)
flag1=false;
}
if(op[i] == '+')
{
if(v[i] < 0)
flag2=false;
}
}
if(flag1 && flag2)
{
for(int i = 1; i <= n; ++ i)
if(op[i] == '+')
add(ans, v[i]);
for(int i = 1; i <= n; ++ i)
if(op[i] == '*')
mult(ans, v[i]);
print(ans);
return 0;
}
else if(flag1)
{
for(int i = 1; i <= n; ++ i)
if(op[i] == '+' && v[i] > 0)
add(ans, v[i]);
for(int i = 1; i <= n; ++ i)
if(op[i] == '*')
mult(ans, v[i]);
for(int i = 1; i <= n; ++ i)
if(op[i] == '+' && v[i] < 0)
add(ans, v[i]);
print(ans);
return 0;
}
else if(flag2)
{
LL count = 0;
for(int i = 1; i <= n; ++ i)
if(op[i] == '*' && v[i] < 0)
++ count;
if(! (count % 2))
{
for(int i = 1; i <= n; ++ i)
if(op[i] == '+')
add(ans, v[i]);
for(int i = 1; i <= n; ++ i)
if(op[i] == '*')
mult(ans, v[i]);
print(ans);
return 0;
}
else
{
LL minn = INF;
for(int i = 1; i <= n; ++ i)
if(op[i] == '*')
if(abs(minn) > abs(v[i]) && v[i] < 0)
minn = v[i];
for(int i = 1; i <= n; ++ i)
if(op[i] == '+')
add(ans, v[i]);
for(int i = 1; i <= n; ++ i)
if(op[i] == '*' && v[i] != minn)
mult(ans, v[i]);
print(ans);
return 0;
}
}
else
{
LL count = 0, minn = INF;
for(int i = 1; i <= n; ++ i)
if(op[i] == '*' && v[i] < 0)
++ count;
if(! (count % 2))
{
for(int i = 1; i <= n; ++ i)
if(op[i] == '*')
if(abs(minn) > abs(v[i]) && v[i] < 0)
minn = v[i];
for(int i = 1; i <= n; ++ i)
if(op[i] == '+' && v[i] > 0)
add(ans, v[i]);
mult(ans, minn);
for(int i = 1; i <= n; ++ i)
if(op[i] == '+' && v[i] < 0)
add(ans, v[i]);
for(int i = 1; i <= n; ++ i)
if(op[i] == '*' && v[i] != minn)
mult(ans, v[i]);
print(ans);
return 0;
}
else
{
for(int i = 1; i <= n; ++ i)
if(op[i] == '*')
if(abs(minn) > abs(v[i]) && v[i] < 0)
minn = v[i];
for(int i = 1; i <= n; ++ i)
if(op[i] == '+' && v[i] < 0)
add(ans, v[i]);
mult(ans, minn);
for(int i = 1; i <= n; ++ i)
if(op[i] == '+' && v[i] > 0)
add(ans, v[i]);
for(int i = 1; i <= n; ++ i)
if(op[i] == '*' && v[i] != minn)
mult(ans, v[i]);
print(ans);
return 0;
}
}
}