题目链接:https://nanti.jisuanke.com/t/31443

相关前置链接

https://www.cnblogs.com/dolphin0520/p/3708602.html

https://zh.wikipedia.org/wiki/调度场算法

https://zh.wikipedia.org/wiki/逆波兰表示法

https://blog.csdn.net/f_zyj/article/details/51509958

思路

  • 调度场算法+后缀表达式(逆波兰)求值

    • 先将中缀表达式化成后缀表达式(调度场)
    • 在对后缀表达式求值
  • 前缀和处理优先级+递归构造表达式树
    • 括号内的元素优先级较高,因此处理出来每个位置的前缀和越大的优先级越高
    • 构造表达式树本质:优先级越高越早计算,意味着越靠近递归返回边界,意味着在递归树越深的位置
    • 因此会出现十分有趣的遍历顺序,+,-,*,/,d
    • 加上-和/和d是不满足交换律的,就是前面的符号要先计算,所以倒着扫
#include<bits/stdc++.h>
#define se second
#define ft first
#define pii pair<int,int>
#define mk make_pair
using namespace std;
char s[105],f[105];
int i,n;
pii ans;
pii add(pii x,pii y){
return mk(x.ft+y.ft,x.se+y.se);
}
pii del(pii x,pii y){
return mk(x.ft-y.se,x.se-y.ft);
}
pii mul(pii x,pii y){
int a=min(x.ft*y.ft,x.ft*y.se),b=max(x.ft*y.ft,x.ft*y.se);
a=min(a,x.se*y.ft);b=max(b,x.se*y.ft);
a=min(a,x.se*y.se);b=max(b,x.se*y.se);
return mk(a,b);
}
pii D(pii x,pii y){
return mk(x.ft,x.se*y.se);
} pii dfs(int l,int r){
int i;
for(i=l;i<=r;i++){
if(s[i]=='+'&&f[i]==f[l])
return add(dfs(l,i-1),dfs(i+1,r));
}
for(i=r;i>=l;i--){
if(s[i]=='-'&&f[i]==f[l])return del(dfs(l,i-1),dfs(i+1,r));
}
for(i=l;i<=r;i++){
if(s[i]=='*'&&f[i]==f[l])return mul(dfs(l,i-1),dfs(i+1,r));
}
for(i=r;i>=l;i--){
if(s[i]=='d'&&f[i]==f[l])return D(dfs(l,i-1),dfs(i+1,r));
}
if(s[l]=='('){
for(i=l+1;f[i]>=f[l+1];i++);
return dfs(l+1,i-1);
}
int tp=0;
for(i=l;i<=r;i++){
if(s[i]<'0'||s[i]>'9')break;
tp*=10;
tp+=s[i]-'0';
}
return mk(tp,tp);
}
int main(){
while(~scanf("%s",s)){
memset(f,0,sizeof(f));
n=strlen(s);
f[0]=1;
for(i=1;i<n;i++){
if(s[i-1]=='(')f[i]=f[i-1]+1;
else if(s[i]==')')f[i]=f[i-1]-1;
else f[i]=f[i-1];
}
ans=dfs(0,n-1);
printf("%d %d\n",ans.ft,ans.se);
}
}

ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)的更多相关文章

  1. ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)

    https://nanti.jisuanke.com/t/31443 题意 给出一个表达式,求最小值和最大值. 表达式中的运算符只有'+'.'-'.'*'.'d',xdy 表示一个 y 面的骰子 ro ...

  2. ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)

    https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...

  3. ACM-ICPC 2018 沈阳赛区网络预赛-K:Supreme Number

    Supreme Number A prime number (or a prime) is a natural number greater than 11 that cannot be formed ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛-D:Made In Heaven(K短路+A*模板)

    Made In Heaven One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. ...

  5. 图上两点之间的第k最短路径的长度 ACM-ICPC 2018 沈阳赛区网络预赛 D. Made In Heaven

    131072K   One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. Howe ...

  6. ACM-ICPC 2018 沈阳赛区网络预赛 J树分块

    J. Ka Chang Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero p ...

  7. ACM-ICPC 2018 沈阳赛区网络预赛 K. Supreme Number

    A prime number (or a prime) is a natural number greater than 11 that cannot be formed by multiplying ...

  8. ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph

    "Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a ...

  9. Fantastic Graph 2018 沈阳赛区网络预赛 F题

    题意: 二分图 有k条边,我们去选择其中的几条 每选中一条那么此条边的u 和 v的度数就+1,最后使得所有点的度数都在[l, r]这个区间内 , 这就相当于 边流入1,流出1,最后使流量平衡 解析: ...

随机推荐

  1. mysql垂直分区和水平分区

    数据库扩展大概分为以下几个步骤: 1.读写分离:当数据库访问量还不是很大的时候,我们可以适当增加服务器,数据库主从复制的方式将读写分离: 2.垂直分区:当写入操作一旦增加的时候,那么主从数据库将花更多 ...

  2. java 线程Thread 技术--创建线程的方式

    在第一节中,对线程的创建我们通过看文档,得知线程的创建有两种方式进行实现,我们进行第一种方式的创建,通过继承Thread 类 ,并且重写它的run 方法,就可以进行线程的创建,所有的程序执行都放在了r ...

  3. ARM交叉编译工具链

    交叉编译工具链是一个由编译器.连接器和解释器组成的综合开发环境,交叉编译工具链主要由binutils.gcc和glibc三个部分组成. 免费版目前有三大主流工具商提供,第一是GNU(提供源码,自行编译 ...

  4. RHEL7、CentOS7防火墙管理

    经常start.stop.restart操作防火墙有两种方式: 1.service iptables stop 2./etc/init.d/iptables stop 但是经常会有这种错误,因为在RH ...

  5. MongoDB安装成为Windows服务及日常使用遇到问题总结

    安装MongoDB: http://blog.csdn.net/liuzhoulong/article/details/6124566 严格按照上面的步骤,设置数据库目录,设置日志目录,安装服务.可是 ...

  6. 安装mysql时启动服务出错问题

    mysql安装最后一步 无法启动服务错误 博客分类: IDE问题解析     今天安装mysql程序时候,在安装到最后一步时候,在最后一步却发现无法启动服务,出现这样的提示“cannot create ...

  7. L1-033 出生年(15)(STL-set代码)

    L1-033 出生年(15 分) 以上是新浪微博中一奇葩贴:"我出生于1988年,直到25岁才遇到4个数字都不相同的年份."也就是说,直到2013年才达到"4个数字都不相 ...

  8. hdu 1686 & poj 2406 & poj 2752 (KMP入门三弹连发)

    首先第一题 戳我穿越;http://acm.hdu.edu.cn/showproblem.php?pid=1686 题目大意好理解,每组输入一个子串和一个母串,问在母串中有多少个子串? 文明人不要暴力 ...

  9. 如何快速学好Shell脚本?

    Shell 语言作为类 Unix 系统的原生脚本,有着非常实用的价值.但对于很多刚刚接触 Shell 脚本的同学来说,搞懂 Shell 语言的语法却是一件非常困难的事情.甚至有人吐槽,或许没有谁能清楚 ...

  10. KeyPress键盘按键ASCII值对应表

    vbKeyLButton 1 鼠标左键  vbKeyRButton 2 鼠标右键  vbKeyCancel 3 CANCEL 键  vbKeyMButton 4 鼠标中键  vbKeyBack 8 B ...