P7073 [CSP-J2020] 表达式
Problem
考察算法:后缀表达式建树,优化。
题目简述
读入一个后缀表达式,由 \(\&,\mid,!\) 三种运算和操作数构成。
有 \(q\) 次询问,每次输入一个下标 \(i\) ,表示要取反 \(x_i\) 的值。每次求表达式的值。
暴力
每次重新建表达式树,计算。
时间复杂度:\(O(q \times |s|)\),达到了惊人的 \(10^{11}\)。
优化点
从上向下深搜,记录哪些点的值变化会导致结果的变化。
思路
- 建立表达式树,并求出表达式的值,记录在变量 \(ans\) 中。
- 用一个 \(bool\) 数组记录那些点的值会导致结果的变化。例如运算符是 \(\mid\) ,如果 \(\mid\) 的左孩子为 \(1\),那么他的右孩子无论是 \(0/1\) ,都不会影响表达式的值为 \(1\) 。
- 每次询问判断是否会修改当前表达式的值,如果会,输出 \(!ans\),否则输出 \(ans\)。
代码
#include <bits/stdc++.h>
using namespace std;
const int N = 1e6 + 10;
struct node{
int to, next;
} a[N];
int pre[N], k, num[N], m, n;
char c[N];
bool f[N];
string s, w;
stack<int> st;
void dfs(int x) {
f[x] = true;
if (x <= n) return;
if (c[x] == '!') dfs(a[pre[x]].to);
else {
int n1 = a[pre[x]].to, n2 = a[a[pre[x]].next].to;
if (c[x] == '&') {
if (num[n1]) dfs(n2);
if (num[n2]) dfs(n1);
} else if (c[x] == '|') {
if (!num[n1]) dfs(n2);
if (!num[n2]) dfs(n1);
}
}
}
void add(int x, int y) {
a[++k] = {y, pre[x]};
pre[x] = k;
}
int main() {
getline(cin, s);
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
scanf("%d", &num[i]);
}
int x, y;
m = n;
for (int i = 0; i < s.size(); i++) {
if (isdigit(s[i])) {
w += s[i];
if (i == s.size() - 1 || !isdigit(s[i + 1])) {
st.push(stoi(w));
w = "";
}
} else if (s[i] == '!') {
m++;
c[m] = s[i];
x = st.top();
st.pop();
add(m, x);
num[m] = !num[x];
st.push(m);
} else if (s[i] == '&' || s[i] == '|') {
m++;
c[m] = s[i];
x = st.top();
st.pop();
y = st.top();
st.pop();
add(m, x), add(m, y);
if (s[i] == '&') num[m] = num[x] & num[y];
else if (s[i] == '|') num[m] = num[x] | num[y];
st.push(m);
}
}
int ans = num[st.top()];
dfs(st.top());
int q;
scanf("%d", &q);
while (q--) {
scanf("%d", &x);
if (f[x]) printf("%d\n", !ans);
else printf("%d\n", ans);
}
return 0;
}
P7073 [CSP-J2020] 表达式的更多相关文章
- c#封装DBHelper类 c# 图片加水印 (摘)C#生成随机数的三种方法 使用LINQ、Lambda 表达式 、委托快速比较两个集合,找出需要新增、修改、删除的对象 c# 制作正方形图片 JavaScript 事件循环及异步原理(完全指北)
c#封装DBHelper类 public enum EffentNextType { /// <summary> /// 对其他语句无任何影响 /// </summary> ...
- CSP 201903-2 24点
这是上一次考csp时遇到的一道简单的问题,但是当时太菜了没有写出来. 问题描述: 直接上图 解决思路: 标准的表达式求解,可以用符号栈和数值栈来存放运算符和数值,需要注意的是从左到右扫描的时候 遇到 ...
- CSP初赛复习
初赛复习 初赛一定要过啊,否则付出的那么多都白搭了! while(1) ++csp.rp,++csp.luck,++csp.scores; 历史 2020年开始,除NOIP以外的NOI系列其他赛事(包 ...
- 用java以正确的姿势刷CSP
许多程序算法考试中,用java是个不错的选择,它几乎实现了所有c++能实现的,所以越来越受Acmer的欢迎.总结一下用到的一些技巧和方法.更多关于csp的可参考海岛blog|皮卡丘 1. 输出 规格化 ...
- 【.net 深呼吸】细说CodeDom(2):表达式、语句
在上一篇文章中,老周厚着脸皮给大伙介绍了代码文档的基本结构,以及一些代码对象与CodeDom类型的对应关系. 在评论中老周看到有朋友提到了 Emit,那老周就顺便提一下.严格上说,Emit并不是针对代 ...
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- 再讲IQueryable<T>,揭开表达式树的神秘面纱
接上篇<先说IEnumerable,我们每天用的foreach你真的懂它吗?> 最近园子里定制自己的orm那是一个风生水起,感觉不整个自己的orm都不好意思继续混博客园了(开个玩笑).那么 ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
随机推荐
- Windows电脑环境变量(用户变量、系统变量)的修改
本文介绍在Windows 10操作系统中,进行用户变量.系统变量等两种环境变量的新建.修改与删除的详细方法. 在很多时候,我们需要对Windows电脑的环境变量加以修改,例如安装一些专业软件. ...
- ISP图像处理——紫边Purple Fringing检测
之前写过文章记紫边的形成原因,以下小结改善方法 图像紫边存在数码相机.监控摄像头等数字成像图像,使用设备在逆光.大光圈条件下拍摄图像的高反差区域容易出现紫边,解决图像自编问题有助设备得到完美图像. 紫 ...
- 【转载】Linux虚拟化KVM-Qemu分析(十)之virtio驱动
原文信息 作者:LoyenWang 出处:https://www.cnblogs.com/LoyenWang/ 公众号:LoyenWang 版权:本文版权归作者和博客园共有 转载:欢迎转载,但未经作者 ...
- 基准测试工具 --- BenchmarkDotNet
介绍 今天介绍一个非常强大的基于.Net 的基准测试工具BenchmarkDotNet. BenchmarkDotNet 已经被14300多个项目采用,包括非常多的知名开源项目,例如 dotnet/p ...
- TodoList - 开源研究系列文章
接着上次的代码,整理出一个待办列表的程序,比较简单易用,读者可自行修改成自己需要的程序. 1. 项目目录: 目录见下图,对代码进行了划分,比较简单.主处理类在Helper目录里. 2. ...
- C#数据去重的这几种方式,你知道几种?
前言 今天我们一起来讨论一下关于C#数据去重的常见的几种方式,每种方法都有其特点和适用场景,我们根据具体需求选择最合适的方式.当然欢迎你在评论区留下你觉得更好的数据去重的方式. 使用HashSet去重 ...
- 使用gulp.js打包layuiAdmin
安装nvm 在nvm目录下,找到settings.txt,追加以下两行加速nvm(淘宝镜像)node_mirror: https://npm.taobao.org/mirrors/node/npm_m ...
- CF1855B Longest Divisors Interval 题解
题意: 给定一个数 \(n\),求一个连续区间 \([l,r]\) 使得 \(n\) 是区间内每个数的倍数,最大化这个区间的长度(多组数据). 思路: 逆向思考一波,( 如果一个数 \(x\) 不是 ...
- 给你推荐一款快速通过 typescript 生成 jsonschema 的包处理器
theme: github fast-typescript-to-jsonschema Typescript 生成 jsonschema 数据插件 性能 案例 interface AAA { a: n ...
- linux 配置dns及代理
简介 对于新装的环境,可能无法访问外网,此时需要设置代理或DNS实现访问. 类似wget.yum.pip这类命令都需要通过网络进行下载. 配置dns服务 在/etc/resolv.conf中添加如下两 ...