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表达式允许更简单的方式建模式 ...
随机推荐
- 前端查询天气的html
<html> <script src="https://code.jquery.com/jquery-3.5.1.min.js"></script&g ...
- 【Shell】ps 命令
ps 命令 Linux ps (英文全拼:process status)命令用于显示当前进程的状态,类似于 windows 的任务管理器. 1. ps 常用的命令 ps -aux #显示所有进程信息 ...
- Hexo博客Next主题文章置顶相关
我需要写一些文章做推荐相关,需要文章置顶功能 博客效果 置顶方法配置 一.修改库文件 原理 在Hexo生成首页HTML时,将top值高的文章排在前面,达到置顶功能. 修改方法 修改Hexo文件夹下的n ...
- Redis Stack:基于Redis的搜索、文档、图形和时间序列功能
基于Redis的搜索.文档.图和时间序列功能整合到一个扩展Redis Stack中,以使开发人员能够轻松构建实时应用程序. Redis Stack 于 3 月 23 日发布,由三个组件组成: Redi ...
- Jenkins主从架构的实现
一.概要 提到K8S环境下的CI/CD,可以使用的工具有很多,比如Jenkins.Gitlab CI.新兴的drone等,考虑到大多公司在VM环境下都采用 Jenkins 集群来搭建符合需求的 CI/ ...
- 【调制解调】PM 调相
说明 学习数字信号处理算法时整理的学习笔记.同系列文章目录可见 <DSP 学习之路>目录,代码已上传到 Github - ModulationAndDemodulation.本篇介绍 PM ...
- Oracle分区表设置详解
Oracle分区表详解 Oracle建议单表超过2G就需要进行分表,一万数据大概3MB,单表最多分区为1024*1024-1个分区,我感觉够我们使用了哈 废话不多说,上示例,Oracle分表具体sql ...
- 【技术实战】Vue技术实战【五】
需求实战一 效果展示 代码展示 <template> <div class="home-component"> <div class="pr ...
- 结果过滤器—MVC项目中结果过滤器(Result Filter)使用
一.什么是结果过滤器? 结果过滤器(ResultFilter),是对执行的Action结果进行处理的一种AOP思想,适用于任何需要直接环绕 View 或格式化处理的逻辑.结果过滤器可以替换或更改 Ac ...
- 如何在达梦数据库中追踪慢SQL
在达梦数据库中,我们可以通过开启日志记录和设置最小执行时间来追踪慢SQL.下面是具体的步骤: 1. 修改dm.ini文件 使用以下命令编辑dm.ini文件: cd /home/dmdba/dmdbms ...