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. HTTP文件断点续传的原理

    前几天一个同事跑过来找我说,我们在广告素材视频这块想做断点续传,就是这次某个视频缓存到一半,下次不用重头开始,可以在原来停留得位置开始继续下载.以提供更好的用户体验. 同时说需要我们支持吐素材地址的业 ...

  2. KMP算法-Java实现

    目的: 为了解决字符串模式匹配 历程: 朴素模式匹配:逐次进行比较 KMP算法:利用匹配失败得到的信息,来最大限度的移动模式串,以此来减少比较次数提高性能 概念: m:是目标串长度 n:是模式串长度 ...

  3. tomcat之一:指定tomcat运行时JDK版本

    tomcat作为日常开发的web应用服务器,给开发测试带来了很多便利,tomcat的运行依赖JDK的支持,在安装JDK时经常会配置环境变量:JAVA_HOME.CLASSPAT,且需要添加path变量 ...

  4. 从零开始学 Java - Spring 使用 Quartz 任务调度定时器

    生活的味道 睁开眼看一看窗外的阳光,伸一个懒腰,拿起放在床一旁的水白开水,甜甜的味道,晃着尾巴东张西望的猫猫,在窗台上舞蹈.你向生活微笑,生活也向你微笑. 请你不要询问我的未来,这有些可笑.你问我你是 ...

  5. .NET平台BigO算法复杂度备忘

          之前一篇文章提到BIG O算法复杂度的备忘录, 今天这个是.NET 平台下集合类相关的Big O 算法复杂度   今天先到这儿,希望对您有参考作用, 您可能感兴趣的文章: 数据结构与算法 ...

  6. Singleton(单例模式)

    一. /** * lazy man(不是线程安全的) * @author TMAC-J * */ public class Singleton { private static Singleton i ...

  7. Storm的BaseBasicBolt源码解析ack机制

    我们在学习ack机制的时候,我们知道Storm的Bolt有BaseBasicBolt和BaseRichBolt.在BaseBasicBolt中,BasicOutputCollector在emit数据的 ...

  8. OData V4 系列 服务创建

    OData 学习目录 创建应用程序 添加引用 install-package entityframework . Install-Package Microsoft.AspNet.Odata . In ...

  9. SharePoint 2013 图文开发系列之InfoPath入门

    本文主要介绍SharePoint 2013中,简单发布InfoPath表单,并添加后台代码,示例比较简单,主要描述的是一个创建InfoPath的过程,而非多么深奥的后台代码,希望能够给初学者带来帮助. ...

  10. ks

    http://www.codeproject.com/Articles/207820/The-Repository-Pattern-with-EF-code-first-Dependen