题意:给出一个后缀表达式f(x),最多出现一次x,解方程f(x) = 0。

读取的时候用一个栈保存之前的结点,可以得到一颗二叉树,标记出现'X'的路径,先把没有出现'X'的子树算完,由于读取建树的时候是由底向上的,

这步可以在读取的时候顺带完成。

注意'X'或'1/x'在某个结点和'0'相乘,那么'X'等效与没有出现过,把之后的结点标记为常数。

然后dfs模拟运算和移项。

还有一些输入输出的小细节和几组测试数据,具体看代码。

WA了很多发,去找数据手动对拍好久终于发现(1/(1/x))=0这种情况是被当作无解。。。而我当作x = 0来处理了,QAQ。为何解个一元一次如此艰辛。。。

第一次写5000B+,模拟真的很难写有没有。手写一个分数的模板

#include<bits/stdc++.h>
using namespace std; const int maxn = ;
typedef long long ll; ll gcd(ll a,ll b) { return b?gcd(b,a%b):a; } struct Fra
{
ll p,q;
Fra(ll x = ,ll y = ):p(x),q(y){ normal(p,q); }
void normal(ll &p,ll &q) { ll g = gcd(p,q); p/=g; q/=g; }
Fra operator = (int x) { p = x; q = ; return *this; }
Fra operator = (ll x) { p = x; q = ; return *this; }
Fra operator - () { return {-p,q}; }
Fra operator + (Fra &r) {
ll m,n;
m = p*r.q+r.p*q;
n = q*r.q;
normal(m,n);
return {m,n};
}
Fra operator += (Fra& r) { return *this = *this+r; }
Fra operator - (Fra &r) { return (-r) + *this; }
Fra operator -= (Fra &r) { return *this = *this-r; }
Fra operator * (Fra &r) {
ll m,n;
m = p*r.p;
n = q*r.q;
normal(m,n);
return {m,n};
}
Fra operator *= (Fra &r) { return (*this) = (*this)*r; }
Fra operator /(Fra &r) { return Fra(r.q,r.p) * (*this); }
Fra operator /=(Fra &r) { return (*this) = (*this)/r; }
bool operator == (const Fra& r) const { return p*r.q == r.p*q; }
bool operator < (Fra& r) { return p*r.q < r.p*q; }
void print() { normal(p,q); if(q<)q = -q,p = -p; printf("%lld/%lld\n",p,q); }
}; struct Node
{
Node* l,*r;
Fra f; char op;
bool fx;
Node(){};
Node(Fra &v,Node*a = NULL, Node*b = NULL):f(v),l(a),r(b){}; }nd[maxn]; bool isOp[];
char rev[]; Fra cal(Fra &x,Fra &y,char op)
{
//assert(isOp[op] == true)
switch(op){
case '+':return x+y;
case '-': return x-y;
case '*': return x*y;
case '/': return x/y;
}
return {,};
} Fra ans; void calRev(Fra &x,char op)
{
switch(op){
case'+':ans-=x; return;
case'*':ans/=x; return ;
case'-':ans = x-ans; return;
case'/':ans = x/ans; return;
}
} //之前要预处理
bool dfs(Node* u)
{
//*u;
if(u->l == NULL) return true;
//assert(u.r)
if(u->l->fx){
ans = cal(ans,u->r->f,rev[u->op]); //乘以0的情况已经预处理了
if(!dfs(u->l)) return false;
}else if(u->r->fx) {
calRev(u->l->f,u->op);//移项,ans本身可能会是0
if(ans.q == ) { return false; }
if(!dfs(u->r)) return false;
}
return true;
} Node* read(char ch)
{
int cnt = ;
stack<Node*> stk;
do{
while(ch == ' ')ch = getchar();
Node &cur = nd[cnt];
if(isOp[ch]){
cur.op = ch;
cur.r = stk.top(); stk.pop();
cur.l = stk.top(); stk.pop();
cur.fx = cur.l->fx || cur.r->fx;
if(cur.fx){ //系数为0的处理
if((cur.op == '*' && (cur.r->fx ? cur.l->f == : cur.r->f == ))
|| (cur.op == '/' && cur.r->fx && cur.l->f == ) ) {
cur.fx = false;
cur.f = ; cur.l = cur.r = NULL;
}
}else { //预处理,边读边算
cur.f = cal(cur.l->f,cur.r->f,cur.op);
cur.l = cur.r = NULL;
}
}else {
if(ch == 'X'){
cur.fx = true;
}else {
cur.fx = false;
int data = ch-'';
while(ch = getchar(), ch>=''&&ch<='') data = data*+ch-'';
cur.f = data;
}
cur.l = cur.r = NULL;
}
stk.push(nd+cnt);
ch = getchar(); cnt++;
}while(ch != '\n'&&~ch);
return stk.top();
} int main()
{
//freopen("in.txt","r",stdin);
isOp['+'] = isOp['-'] = isOp['*'] = isOp['/'] = true;
rev['+'] = '-'; rev['-'] = '+'; rev['*'] = '/'; rev['/'] = '*';
char head;
while(~(head = getchar())){
Node* root = read(head);
if(!root->fx) {
if(root->f == ) puts("MULTIPLE");
else puts("NONE");
continue;
}
ans = ;
if(dfs(root)){ printf("X = "); ans.print(); }
else {puts("NONE"); continue; }
}
return ;
} /*
1 1 X / /
1 1 X 2 - / / 1 X /
0 X * 1 +
0 X / 1 + 9 9 9 9 9 9 9 9 9 9 9 9 9 X 1 * * * * * * * * * * * * * +
7 6 - 8 / 8 2 * / 0 3 - + 5 5 1 / + 1 X 2 + + 8 8 + + * +
7 8 X + * 1 8 5 7 3 + * * 7 6 6 / 3 + + 6 5 7 / - * / / +
*/

UVA 1661 Equation (后缀表达式,表达式树,模拟,实现)的更多相关文章

  1. 表达式目录树(Expression)

    一:什么是表达式树 Expression我们称为是表达式树,是一种数据结构体,用于存储需要计算,运算的一种结构,这种结构可以只是存储,而不进行运算.通常表达式目录树是配合Lambda一起来使用的,la ...

  2. MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动

    MVC图片上传详解   MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...

  3. 05.表达式目录树Expression

    参考文章 https://www.cnblogs.com/xyh9039/p/12748983.html 1. 基本了解 1.1 Lambda表达式 演变过程 using System; namesp ...

  4. LinQ实战学习笔记(三) 序列,查询操作符,查询表达式,表达式树

    序列 延迟查询执行 查询操作符 查询表达式 表达式树 (一) 序列 先上一段代码, 这段代码使用扩展方法实现下面的要求: 取进程列表,进行过滤(取大于10M的进程) 列表进行排序(按内存占用) 只保留 ...

  5. C#表达式目录树(Expression)

    1.什么是表达式目录树 :简单的说是一种语法树,或者说是一种数据结构(Expression) 2.用Lambda声明表达式目录树: Expression<Func<; //表达试目录树的方 ...

  6. C#_表达式目录树的应用

    使用表达式目录树实现两个不同类型的属性赋值: public class People { public int Age { get; set; } public string Name { get; ...

  7. 第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法

    一. 简介 该章节,可以说是一个简单轻松的章节,只要你对Expression表达式树.EF的基本使用.泛型有所了解,那么本章节实质上就是一个非常简单的封装章节,便于我们快捷开发. PS:在该章节对于E ...

  8. 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)

    一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...

  9. 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测

    概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...

随机推荐

  1. 安装openstack出现的问题及解决

    感谢http://www.cnblogs.com/nmap/p/6417163.html,参考这篇文章,我在虚拟机上部署成功了,后来因为虚拟机实在带不动,所以改装到物理机上,在实验室找到两台物理机,分 ...

  2. python数据分析笔记中panda(1)

    1 例子1 from pandas import read_csv; df = read_csv('H://pythonCode//4.1//1.csv') df 截图 1.1 修改表的内容编码 df ...

  3. 【Hadoop】MapReduce笔记(一):MapReduce作业运行过程、任务执行

    一.MR作业运行过程 JobClient的runJob()方法:新建JobClient实例,并调用其submitJob()方法.提交作业后,runJob()每秒轮询作业进度,如果发现上次上报后信息有改 ...

  4. LeetCode:104 Maximum Depth of Binary Tree(easy)

    题目: Given a binary tree, find its maximum depth. The maximum depth is the number of nodes along the ...

  5. 福建工程学院第十四届ACM程序设计大赛 - E - 外传:小晋逃生记

    http://www.fjutacm.com/Contest.jsp?cid=705#P4 其实想清楚了就很简单,之前想了很多种方法,以为是二分什么的,看起来就像是一个单峰函数.但是发现直接暴力一波就 ...

  6. 16-CoreData之多表关联(存储自定义数据模型)

    多表关联 1.1-简介 什么是多表关联 在处理数据库的关系中,无非只有三种关系 一对一:一个老师只能在一个教室上课,不可能同时在两个教室上课 一对多:一个教室可以有多个学生,但一个学生只能在一个教室 ...

  7. ADT版本查看,This Android SDK requires Andr...ate ADT to the latest问题

    ADT版本查看 Help->About ADT This Android SDK requires Andr...ate ADT to the latest问题 这样的问题很好解决,一个升级AD ...

  8. Mol Cell Proteomics. |陈洁| 整合鸟枪法蛋白质组学中鉴定和定量的错误率

    大家好,本周分享的是发表在MCP上的一篇关于鸟枪蛋白质组学中的错误率的文章,题目是Integrated identification and quantification error probabil ...

  9. spark sql 的metastore 对接 postgresql

    本教程记录 spark 1.3.1 版本的thriftserver 的metastore 对接 postgresql postgresql 的编译,参考:http://www.cnblogs.com/ ...

  10. 基于PHP的正则表达式

    用法 从某个字符抽取信息 用新文本替换匹配的文本 把字符串拆分成小块字符串组成的数组 基础 preg_match('/需要匹配的正则表达式/', '字符串'); 正则匹配模式 集合: [xxxx]-- ...