codevs2178 表达式运算Cuties[笛卡尔树]
给出一个表达式,其中运算符仅包含+,-,*,/,^要求求出表达式的最终值
数据可能会出现括号情况 还有可能出现多余括号情况
数据保证不会出现>maxlongint的数据
数据可能回出现负数情况
仅一行,即为表达式
仅一行,既为表达式算出的结果
(2+2)^(1+1)
16
表达式总长度<=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[笛卡尔树]的更多相关文章
- NOIP2011pj表达式的值[树形DP 笛卡尔树 | 栈 表达式解析]
题目描述 对于1 位二进制变量定义两种运算: 运算的优先级是: 先计算括号内的,再计算括号外的. “× ”运算优先于“⊕”运算,即计算表达式时,先计算× 运算,再计算⊕运算.例如:计算表达式A⊕B × ...
- YbtOJ#752-最优分组【笛卡尔树,线段树】
正题 题目链接:http://www.ybtoj.com.cn/problem/752 题目大意 \(n\)个人,每个人有\(c_i\)和\(d_i\)分别表示这个人所在的队伍的最少/最多人数. 然后 ...
- POJ 2559 Largest Rectangle in a Histogram ——笛卡尔树
[题目分析] 本来是单调栈的题目,用笛卡尔树可以快速的水过去. 把每一个矩阵看成一个二元组(出现的顺序,高度). 然后建造笛卡尔树. 神奇的发现,每一个节点的高度*该子树的大小,就是这一块最大的子矩阵 ...
- 2178 表达式运算Cuties
2178 表达式运算Cuties 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 大师 Master 题解 题目描述 Description 给出一个表达式,其中运算 ...
- POJ 2201 Cartesian Tree ——笛卡尔树
[题目分析] 构造一颗笛卡尔树,然后输出这棵树即可. 首先进行排序,然后用一个栈维护最右的树的节点信息,插入的时候按照第二关键字去找,找到之后插入,下面的树成为它的左子树即可. 然后插入分三种情况讨论 ...
- POJ 1785 Binary Search Heap Construction(裸笛卡尔树的构造)
笛卡尔树: 每个节点有2个关键字key.value.从key的角度看,这是一颗二叉搜索树,每个节点的左子树的key都比它小,右子树都比它大:从value的角度看,这是一个堆. 题意:以字符串为关键字k ...
- [BZOJ]4199: [Noi2015]品酒大会(后缀数组+笛卡尔树)
Time Limit: 10 Sec Memory Limit: 512 MB Description Input Output Sample Input 10 ponoiiipoi 2 1 4 7 ...
- [模板] 笛卡尔树 && RMQ
话说我noip之前为什么要学这种东西... 简介 笛卡尔树(Cartesian Tree) 是一种二叉树, 且同时具有以下两种性质: 父亲节点的值大于/小于子节点的值; 中序遍历的结果为原序列. 笛卡 ...
- BZOJ.2616.SPOJ PERIODNI(笛卡尔树 树形DP)
BZOJ SPOJ 直观的想法是构建笛卡尔树(每次取最小值位置划分到两边),在树上DP,这样两个儿子的子树是互不影响的. 令\(f[i][j]\)表示第\(i\)个节点,放了\(j\)个车的方案数. ...
随机推荐
- java数据类型
对String来说,”==“是用来判断两个字符串(对象)的地址是否相同,即判断是否是同一个字符串的应用.”equals()“则是判断两个字符串(对象)的值是否相等,如果相等则返回true.一般情况下, ...
- ubuntu中LAMP环境搭建及ubuntu语言和输入法设置
1. LAMP 的安装 1) sudo apt-get install apache2 mysql-server mysql-client php5 php5-gd php5-mysql 2) 存放 ...
- liunx命令
关机 (系统的关机.重启以及登出 ) shutdown -h now 关闭系统(1) init 0 关闭系统(2) telinit 0 关闭系统(3) shutdown -h hours:minute ...
- C++_系列自学课程_第_10_课_表达式_《C++ Primer 第四版》
程序设计语言中大部分程序都在进行表达式的求值操作, 例如求两个数的和,求一个表达式的逻辑结果,或者通过输入输出表达式语句进行输入和输出. 这里我们对表达式进行讨论. 一.表达式 1.表达式 表达式由一 ...
- java判断输入的数是不是素数
package test; import java.util.Scanner; //判断输入的数是不是素数 public class Test18 { public static void main( ...
- SSH整合之全注解
SSH整合之全注解 使用注解配置,需要我们额外引入以下jar包
- 适应手机端的jQuery图片滑块动画DEMO演示
在线预览 下载地址 实例代码 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "htt ...
- js中查找相同的几种函数
function findInArr(arr,num){ for(var i=0;i<arr.length;i++){ if(arr[i]==num){ return true; } } ret ...
- 了解HTML CSS格式化排版 文字排版
这里简单的写一些涉及到字体排版中常用到的属性, 大家可以学习查看, 也可以mark下以后看. font-family: "Micrsoft Yahei"; 设置字体 font-si ...
- SE(homework2)_软件分析
老师这次课后的作业具有开放性,很容易的我会想到经常用的那些工具软件,MATLAB,envi,ARCGIS等等. Q1:此类软件是什么时候出现的,这些软件是怎么说服你(陌生人)成为它们的用户的?他们的目 ...