2178 表达式运算Cuties

 时间限制: 1 s
 空间限制: 32000 KB
 题目等级 : 大师 Master
 查看运行结果
 
 
题目描述 Description

给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值

数据可能会出现括号情况 还有可能出现多余括号情况

数据保证不会出现>maxlongint的数据

数据可能回出现负数情况

输入描述 Input Description

仅一行,即为表达式

输出描述 Output Description

仅一行,既为表达式算出的结果

样例输入 Sample Input

(2+2)^(1+1)

样例输出 Sample Output

16

数据范围及提示 Data Size & Hint

表达式总长度<=30


就是练习一下笛卡尔树

多余括号太坑了,这个程序还没有处理()-1

负数我在前面加了一个0

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
const int N=,MOD=;
typedef long long ll;
int n;
char s[N];
struct node{
int lc,rc;
char op;
ll num;
node():lc(),rc(),num(){}
}t[N];
int w[N],root,cnt=;
void build(){
int p=;
for(int i=;i<=n;i++){//printf("i %d %c\n",i,s[i]);
if(s[i]=='(') {p++;continue;}
if(s[i]==')') {p--;continue;} if(s[i]=='+'|| (s[i]=='-'&&i!=&&s[i-]!='(') ) w[++cnt]=p*+,t[cnt].op=s[i];
else if(s[i]=='*'||s[i]=='/') w[++cnt]=p*+,t[cnt].op=s[i];
else if(s[i]=='^') w[++cnt]=p*+,t[cnt].op=s[i];
else{
if(s[i]=='-'){//cout<<"p";
w[++cnt]=p*+;
t[cnt].op='a';t[cnt].num=;
w[++cnt]=p*+,t[cnt].op='-';
if(s[i+]<''||s[i+]>'') continue;
i++;
}
//printf("num %d %c\n",i,s[i]); w[++cnt]=p*+;
ll x=;
while(s[i]>=''&&s[i]<='') x=x*+s[i]-'',i++;
i--;
t[cnt].num=x; t[cnt].op='a';
} //printf("build %d %d %c %d\n",cnt,w[cnt],t[cnt].op,t[cnt].num);
} int st[N],top=;
for(int i=;i<=cnt;i++){
int k=top;
while(k>&&w[st[k]]>=w[i]) k--;
if(k) t[st[k]].rc=i;
if(k<top) t[i].lc=st[k+];
st[++k]=i;
top=k;//printf("st %d %c %d\n",top,t[st[top]].op,w[st[top]]);
}
root=st[];
}
inline ll fpow(ll a,ll b){
ll ans=;
for(;b;b>>=,a*=a)
if(b&) ans*=a;
return ans;
}
ll cal(int u){
char c=t[u].op;
if(c=='a') return t[u].num; ll t1=cal(t[u].lc),t2=cal(t[u].rc);//printf("cal %d %d %c %d\n",u,t1,c,t2);
if(c=='+') return t1+t2;
if(c=='-') return t1-t2;
if(c=='*') return t1*t2;
if(c=='/') return t1/t2;
if(c=='^') return fpow(t1,t2);
}
int main(){
scanf("%s",s+); n=strlen(s+);
build();
printf("%lld",cal(root));
}

codevs2178 表达式运算Cuties[笛卡尔树]的更多相关文章

  1. NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]

    题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...

  2. YbtOJ#752-最优分组【笛卡尔树,线段树】

    正题 题目链接:http://www.ybtoj.com.cn/problem/752 题目大意 \(n\)个人,每个人有\(c_i\)和\(d_i\)分别表示这个人所在的队伍的最少/最多人数. 然后 ...

  3. POJ 2559 Largest Rectangle in a Histogram ——笛卡尔树

    [题目分析] 本来是单调栈的题目,用笛卡尔树可以快速的水过去. 把每一个矩阵看成一个二元组(出现的顺序,高度). 然后建造笛卡尔树. 神奇的发现,每一个节点的高度*该子树的大小,就是这一块最大的子矩阵 ...

  4. 2178 表达式运算Cuties

    2178 表达式运算Cuties  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 大师 Master 题解       题目描述 Description 给出一个表达式,其中运算 ...

  5. POJ 2201 Cartesian Tree ——笛卡尔树

    [题目分析] 构造一颗笛卡尔树,然后输出这棵树即可. 首先进行排序,然后用一个栈维护最右的树的节点信息,插入的时候按照第二关键字去找,找到之后插入,下面的树成为它的左子树即可. 然后插入分三种情况讨论 ...

  6. POJ 1785 Binary Search Heap Construction(裸笛卡尔树的构造)

    笛卡尔树: 每个节点有2个关键字key.value.从key的角度看,这是一颗二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大:从value的角度看,这是一个堆. 题意:以字符串为关键字k ...

  7. [BZOJ]4199: [Noi2015]品酒大会(后缀数组+笛卡尔树)

    Time Limit: 10 Sec  Memory Limit: 512 MB Description Input Output Sample Input 10 ponoiiipoi 2 1 4 7 ...

  8. [模板] 笛卡尔树 && RMQ

    话说我noip之前为什么要学这种东西... 简介 笛卡尔树(Cartesian Tree) 是一种二叉树, 且同时具有以下两种性质: 父亲节点的值大于/小于子节点的值; 中序遍历的结果为原序列. 笛卡 ...

  9. BZOJ.2616.SPOJ PERIODNI(笛卡尔树 树形DP)

    BZOJ SPOJ 直观的想法是构建笛卡尔树(每次取最小值位置划分到两边),在树上DP,这样两个儿子的子树是互不影响的. 令\(f[i][j]\)表示第\(i\)个节点,放了\(j\)个车的方案数. ...

随机推荐

  1. [WCF编程]13.并发:服务并发模式

    一.概述 传入的客户端调用消息会分发给Windows I/O线程池(线程默认为1000)上的服务实例.多个客户端可以发起多个并发的调用,并且服务可以在多个线程上处理这些请求.如果传入的调用分发给同一个 ...

  2. ADO.net数据绑定

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; usin ...

  3. C#文件或文件夹压缩和解压方法(通过ICSharpCode.SharpZipLib.dll)

    我在网上收集一下文件的压缩和解压的方法,是通过ICSharpCode.SharpZipLib.dll 来实现的 一.介绍的目录 第一步:下载压缩和解压的 ICSharpCode.SharpZipLib ...

  4. 从零开始学 Java - Spring 支持 CORS 请求踩的坑

    谁没掉进过几个大坑 记得好久之前,总能时不时在某个地方看到一些标语,往往都是上面一个伟人的头像,然后不管是不是他说的话,下面总是有看起来很政治正确且没卵用的屁话,我活到目前为止,最令我笑的肚子痛得是下 ...

  5. IEEE829-2008软件测试文档标准介绍

    1998版中定义了一套文档用于8个已定义的软件测试阶段: 测试计划: 一个管理计划的文档 包括:   测试如何完成 (包括SUT的配置).   谁来做测试   将要测试什么   测试将持续多久 (虽然 ...

  6. Xdebug文档(四)函数跟踪

    Xdebug能让你把所有函数调用,包括参数和返回值以不同的格式记录到文件中. 这些号称“函数跟踪”功能能帮助你面对一个新应用程序,亦或者在程序运行时你想弄清楚它在做什么.函数跟踪功能可以选择性地显示函 ...

  7. 【JavaScript】获取未知类的结构

    目录结构: // contents structure [-] 为什么需要获取类的结构 关于JavaScript中的类 定义类的方法 第一种 第二种 DEMO HTML页面 date文件 注意事项 参 ...

  8. PHP预定义变量

    * PHP预定义 * 预定义变量 * $_GET - 接收客户端以请求类型为GET方法发送的数据内容 * $_POST - 接收客户端以请求类型为POST方法发送的数据内容 * $_REQUEST - ...

  9. iOS AutoLayout的用法

    添加约束 代码实现Autolayout的步骤 利用NSLayoutConstraint类创建具体的约束对象 添加约束对象到相应的view上 - (void)addConstraint:(NSLayou ...

  10. 用VSCode写python的正确姿势(转载)

    最近在学习python,之前一直用notepad++作为编辑器,偶然发现了VScode便被它的颜值吸引.用过之后发现它启动快速,插件丰富,下载安装后几乎不用怎么配置就可以直接使用,而且还支持markd ...