ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
题目链接: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(表达式求值)的更多相关文章
- ACM-ICPC 2018 沈阳赛区网络预赛 B Call of Accepted(表达式求值)
https://nanti.jisuanke.com/t/31443 题意 给出一个表达式,求最小值和最大值. 表达式中的运算符只有'+'.'-'.'*'.'d',xdy 表示一个 y 面的骰子 ro ...
- ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)
https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...
- 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 ...
- 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. ...
- 图上两点之间的第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 ...
- 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 ...
- 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 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F. Fantastic Graph
"Oh, There is a bipartite graph.""Make it Fantastic." X wants to check whether a ...
- Fantastic Graph 2018 沈阳赛区网络预赛 F题
题意: 二分图 有k条边,我们去选择其中的几条 每选中一条那么此条边的u 和 v的度数就+1,最后使得所有点的度数都在[l, r]这个区间内 , 这就相当于 边流入1,流出1,最后使流量平衡 解析: ...
随机推荐
- 了解Queue
在并发队列上JDK提供了两套实现,一个是以ConcurrentLinkedQueue为代表的高性能队列,一个是以BlockingQueue接口为代表的阻塞队列,无论哪种都继承自Queue, 可以对应着 ...
- swift - 快速代码块 - 创建 tableview等一些控件 基本属性
1.创建tableview private lazy var cellId = "cellId" fileprivate lazy var tv : UITableView = { ...
- 用Python监听鼠标和键盘事件
PyHook是一个基于Python的“钩子”库,主要用于监听当前电脑上鼠标和键盘的事件.这个库依赖于另一个Python库PyWin32,如同名字所显示的,PyWin32只能运行在Windows平台,所 ...
- Sqlserver的身份验证模式
1.服务器名称: . 在服务器名称这里,我们有以下几种选择来连接到本地: (1)默认的服务器名称:也就是电脑主机的名称 (2)".",“.”就表示主机. (3)localhost ...
- c语言使用指针对int数组的求和
#include <stdio.h> int sump(int *, int *); int main(void) { , , , , }; printf()); ; } int sump ...
- css布局之头尾固定中间高度自适应
被这个问题困扰了很久.大神别鄙视我,我是搞后台开发的....试过了很多方法,比如设定高度100%.同事用的js计算高度,我对js设置的方式一直觉得不够好,尽管设置高度为100%的方式更差,直到发现了一 ...
- c# 把对象加入队列,对象为全局变量,对象改变队列值也跟着改变
若程序把对象加入队列,对象为全局变量,对象改变队列值也跟着改变,如下: filecontent 为两个字段的属性值. class FileContent { // public string Htt ...
- android studio 安装过程
下载 安装版本:3.0.1 下载地址:https://pan.baidu.com/s/1Uq6QSZXpmWUiBW6K-tRqKw 密码:zbtb 安装 双击安装包进行安装,选择安装位置,安装完成打 ...
- 转easyui datagrid 前台分页的实现
easyui datagrid 前台分页的实现java采用的版本 来源:本站原创 js知识 超过5,090人围观 暂无评论 使用easyui分页,有后台服务器端实现和前台浏览器端实现.服务器端实现按规 ...
- Hadoop(二) HADOOP集群搭建(简化版)
1.准备Linux环境 1.0先将虚拟机的网络模式选为NAT 1.1修改主机名 vi /etc/sysconfig/network ...