求助贪心(做成模拟
查看原帖
求助贪心(做成模拟
352961
Ztemily楼主2021/12/10 22:38

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;
}
2021/12/10 22:38
加载中...