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表达式允许更简单的方式建模式 ...
随机推荐
- P3574 [POI2014] FAR-FarmCraft 吐槽 + 题解
洛谷上面的题解写的真的不太好,有很多错误,我来谈谈自己的理解. 设 \(f[i]\) 表示以 \(i\) 为根节点的子树中(包括节点 \(i\))的所有人安装好游戏所需要的时间(与下面的 \(g[i] ...
- 【Flyway】初识Flyway,将Flyway集成于Spring项目
什么是Flyway Flyway官方网站:点击这里 官方描述: Flyway extends DevOps to your databases to accelerate software deliv ...
- JDBC的增删改-结果集的元数据-Class反射-JDBC查询封装
一.使用JDBC批量添加 知识点复习: 1.JDBC的六大步骤 (导入jar包, 加载驱动类,获取连接对象, 获取sql执行器.执行sql与并返回结果, 关闭数据库连接) 2.封装了一个DBU ...
- Linux 问题:普通用户(non-root)无法ssh登录
vi /etc/pam.d/sshd ## 将下面那行注释,保存文件即可. # Disallow non-root logins when /etc/nologin exists. account r ...
- python3 使用位图排序
代码 from bitmap import BitMap a=[1,5,3,4,7,8,15,6,9] print(a) bm=BitMap(max(a)) #print(dir(bm)) print ...
- 体验IntelliJ IDEA的远程开发(Remote Development)
欢迎访问我的GitHub 这里分类和汇总了欣宸的全部原创(含配套源码):https://github.com/zq2599/blog_demos 本篇概览 IDEA的远程开发功能,可以将本地的编译.构 ...
- CVE-2023-2825-GitLab目录穿越poc
Gitlab CVE-2023-2825 目录穿越漏洞 前言 昨天 GitLab 出了一个版本目录穿越漏洞(CVE-2023-2825),可以任意读取文件.当时我进行了黑盒测试并复现了该漏洞. &qu ...
- LeetCode 周赛上分之旅 #42 当 LeetCode 考树上倍增,出题的趋势在变化吗
️ 本文已收录到 AndroidFamily,技术和职场问题,请关注公众号 [彭旭锐] 和 BaguTree Pro 知识星球提问. 学习数据结构与算法的关键在于掌握问题背后的算法思维框架,你的思考越 ...
- 论文日记五:QueryInst
导读 实例分割领域21年的SOTA,整个模型结构设计总述为以下: 1)设计了类似于Cascade Mask R-CNN的多阶段迭代优化的bbox和mask预测头: 2)基于query的实例分割方法,延 ...
- vscod 配置 morkdown 快捷键
vscod 配置 morkdown 快捷键 1.首先在根目录添加.vscode 文件夹 ️1.1 新建一个 settings.json 文件 { "[markdown]": { & ...