1247. 后缀表达式

https://www.acwing.com/problem/content/1249/

1e5的数据量,应该是排个序
后缀表达式也可以叫逆波兰表达式,对于一个式子,将元素不断的入栈,但是遇到符号就出两个元素进行运算再入栈
这样的模式使得它天生的是一个树,且式子是dfs的后序遍历的结果
这样的树,其内部结点全是符号,只有叶子结点才是数字,其运算也是后序的
n个加号,m个减号,既有n+m个内部结点,有n+m+1个数字结点
要求我们更改符号的顺序求的最大表达式值
也就是要求我们用n+m个内部结点,n+m+1个数字结点构造一个遍历出来结果是最大的树
在这个问题中,如果一个数字在下边,是被减的,那么到上层之后又被减一次,就变成加了
也就是会负负得正,而在树中我们可以任意更改结点位置,以达到"加括号"更改运算顺序和符号的目的
可以在有负号的括号里全部填充负数,那么这个括号里的值就全是正数了




#include<iostream>
#include<algorithm>
using namespace std;

const int N = 2e5+10;//由于是n,m,因此两倍数据范围
int a[N];
int n,m;
typedef long long LL;
LL res;
int main()
{
    cin >> n >> m;
    int k = n+m+1;
    for(int i=1;i<=k;i++)cin >> a[i];
    sort(a+1,a+k+1);
    if(m==0)
    {
        for(int i=1;i<=k;i++)
            res+=a[i];
    }
    else
    {
        res+=a[k]-a[1];
        for(int i=2;i<k;i++)
            res+=abs(a[i]);
    }
    cout << res << endl;
    return 0;
}



posted @ 2023-03-08 22:50  风乐  阅读(17)  评论(0)    收藏  举报