小蒟蒻搞不懂月赛这题为什么3个点WA?求大佬指教
查看原帖
小蒟蒻搞不懂月赛这题为什么3个点WA?求大佬指教
380730
xzCyanBrad楼主2021/7/22 14:23

代码:

#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;            
        }
    }
}
2021/7/22 14:23
加载中...