RT,偶然翻到陈旧的代码想调调了半天不懂为啥89俩点WA
代码中sum是‘+’正数和,summ是负数‘+’和,suu是全部‘+’的和
两个Pq一个chf是负数×,chz是正数×
#include <bits/stdc++.h>
using namespace std;
const int MOD = 998244353;
long long ans;
priority_queue<long long> chz, chf, chzz, chff;
int n;
long long sum, summ, suu;
char op[110000];
int v[1100000];
bool vis[110000];
inline void dfs(int x, long long aa)
{
if (x == n + 1)
{
ans = max(ans, aa);
return;
}
for (register int i = 1; i <= n; i++)
{
if (vis[i])
continue;
vis[i] = 1;
if (op[i] == '+')
dfs(x + 1, (aa + v[i]) % MOD);
else
dfs(x + 1, (aa * v[i]) % MOD);
vis[i] = 0;
}
}
inline void work()
{
cin >> n;
for (int i = 1; i <= n; i++)
{
char c;
int x;
cin >> c >> x;
op[i] = c, v[i] = x;
if (c == '+')
{
suu += x;
if (x > 0)
sum += x;
else
summ += x;
}
else
{
if (x > 0)
chz.push(x);
else
chf.push(x);
}
}
if (n <= 9)
{
dfs(1, 0);
cout << ans;
return;
}
if (chf.empty() and summ == 0)
{
ans += suu;
while (!chz.empty())
{
ans = (ans % MOD) * (chz.top() % MOD) % MOD;
chz.pop();
}
ans = (ans % MOD + MOD) % MOD;
cout << ans;
}
else if (chf.empty() and summ != 0)
{
ans += sum;
while (!chz.empty())
{
ans = (ans % MOD) * (chz.top() % MOD) % MOD;
chz.pop();
}
ans += summ;
ans = (ans % MOD + MOD) % MOD;
cout << ans;
}
else if (!chf.empty() and summ == 0)
{
if (chf.size() % 2 == 0)
{
ans += suu;
while (!chz.empty())
{
ans = (ans % MOD) * (chz.top() % MOD) % MOD;
chz.pop();
}
while (!chf.empty())
{
ans = (ans % MOD) * (chf.top() % MOD) % MOD;
chf.pop();
}
ans = (ans % MOD + MOD) % MOD;
cout << ans;
}
else
{
chf.pop();
ans += suu;
while (!chz.empty())
{
ans = (ans % MOD) * (chz.top() % MOD) % MOD;
chz.pop();
}
while (!chf.empty())
{
ans = (ans % MOD) * (chf.top() % MOD) % MOD;
chf.pop();
}
ans = (ans % MOD + MOD) % MOD;
cout << ans;
}
}
else
{
long long ans1, ans2, ans3;
if (chf.size() % 2 == 0)
{
ans1 += sum;
while (!chf.empty())
{
ans1 = (ans1 % MOD) * (chf.top() % MOD) % MOD;
chff.push(chf.top());
chf.pop();
}
while (!chz.empty())
{
ans1 = (ans1 % MOD) * (chz.top() % MOD) % MOD;
chzz.push(chz.top());
chz.pop();
}
ans1 += summ;
}
else
{
ans2 += summ;
while (!chff.empty())
{
ans2 = (ans2 % MOD) * (chff.top() % MOD) % MOD;
chff.pop();
}
ans2 += sum;
while (!chzz.empty())
{
ans2 = (ans2 % MOD) * (chzz.top() % MOD) % MOD;
chzz.pop();
}
}
ans3 = max(ans1, ans2);
cout << (ans3 % MOD + MOD) % MOD;
}
}
int main(void)
{
work();
return 0;
}