UVA 1661 Equation (后缀表达式,表达式树,模拟,实现)
题意:给出一个后缀表达式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 (后缀表达式,表达式树,模拟,实现)的更多相关文章
- 表达式目录树(Expression)
一:什么是表达式树 Expression我们称为是表达式树,是一种数据结构体,用于存储需要计算,运算的一种结构,这种结构可以只是存储,而不进行运算.通常表达式目录树是配合Lambda一起来使用的,la ...
- MVC图片上传详解 IIS (安装SSL证书后) 实现 HTTP 自动跳转到 HTTPS C#中Enum用法小结 表达式目录树 “村长”教你测试用例 引用provinces.js的三级联动
MVC图片上传详解 MVC图片上传--控制器方法 新建一个控制器命名为File,定义一个Img方法 [HttpPost]public ActionResult Img(HttpPostedFile ...
- 05.表达式目录树Expression
参考文章 https://www.cnblogs.com/xyh9039/p/12748983.html 1. 基本了解 1.1 Lambda表达式 演变过程 using System; namesp ...
- LinQ实战学习笔记(三) 序列,查询操作符,查询表达式,表达式树
序列 延迟查询执行 查询操作符 查询表达式 表达式树 (一) 序列 先上一段代码, 这段代码使用扩展方法实现下面的要求: 取进程列表,进行过滤(取大于10M的进程) 列表进行排序(按内存占用) 只保留 ...
- C#表达式目录树(Expression)
1.什么是表达式目录树 :简单的说是一种语法树,或者说是一种数据结构(Expression) 2.用Lambda声明表达式目录树: Expression<Func<; //表达试目录树的方 ...
- C#_表达式目录树的应用
使用表达式目录树实现两个不同类型的属性赋值: public class People { public int Age { get; set; } public string Name { get; ...
- 第十九节: 结合【表达式目录树】来封装EF的BaseDal层的方法
一. 简介 该章节,可以说是一个简单轻松的章节,只要你对Expression表达式树.EF的基本使用.泛型有所了解,那么本章节实质上就是一个非常简单的封装章节,便于我们快捷开发. PS:在该章节对于E ...
- 第十五节:Expression表达式目录树(与委托的区别、自行拼接、总结几类实例间的拷贝)
一. 基本介绍 回忆: 最早接触到表达式目录树(Expression)可能要追溯到几年前使用EF早期的时候,发现where方法里的参数是Expression<Func<T,bool> ...
- 使用Java函数接口及lambda表达式隔离和模拟外部依赖更容易滴单测
概述 单测是提升软件质量的有力手段.然而,由于编程语言上的支持不力,以及一些不好的编程习惯,导致编写单测很困难. 最容易理解最容易编写的单测,莫过于独立函数的单测.所谓独立函数,就是只依赖于传入的参数 ...
随机推荐
- 1.6 Hive配置metastore
一.配置 1.配置文件 #创建配置文件 [root@hadoop-senior ~]# cd /opt/modules/hive-0.13.1/conf/ [root@hadoop-senior co ...
- 极客时间_Vue开发实战_05.Vue组件的核心概念(1):属性
05.Vue组件的核心概念(1):属性 代码地址: https://github.com/tangjinzhou/geektime-vue-1/blob/master/%E6%BC%94%E7%A4% ...
- jquery table表格 获取选中的某一行和某一列的值
table class="table table-hover" id="test123"> <tr> <th width="4 ...
- oracle创建用户空间、导出、导入dmp备份文件方法
导入数据需要注意的事项 1.创建一个用户对应一个表空间. 2.创建的用户和表空间一定要与bmp文件的用户和表空间一致. 3.导入的命令是在CMD下输入的 不是在SQL plus输入的. 4.可以用PL ...
- Lightoj 1067【逆元模板(求C(N,M))】
#include <bits/stdc++.h> using namespace std; typedef long long LL; typedef unsigned long long ...
- 基于ndk_r7_windows编译实现ndk项目,不需要cygwin
下面就介绍下Android NDK的入门学习过程: 入门的最好办法就是学习Android自带的例子, 这里就通过学习Android的NDK自带的demo程序:hello-jni来达到这个目的. 一. ...
- 安装Net::OpenSSH 库
perl 离线安装 Net::OpenSSH 库 Net::OpenSSH 库 下载地址https://metacpan.org/pod/Net::OpenSSH 直接获取安装包命令 wget htt ...
- IP服务-4-HSRP,VRRP和GLBP
HSRP(热备份路由器协议).VRRP(虚拟路由器冗余协议)和GLBP(网关负载均衡协议) 当主机只知道一个IP地址能够用来访问子网外部时,可能会出现一些问题,这些协议正好解决了这一隐患. HSRP允 ...
- PostgreSQL-3-DDL数据定义语言
1.创建/删除新的数据库 \l 查看现有数据库 \h CREATE DATABASE 查看CREATE DATABASE语句说明 \h DROP DATABASE 查看DROP DATABASE语 ...
- python库使用整理
1. 环境搭建 l Python安装包:www.python.org l Microsoft Visual C++ Compiler for Python l pip(get-pip.py):p ...