当前位置: 首页 > news >正文

题解:P7073 [CSP-J2020] 表达式

这道题是一道非常难的关于树的题目。

前置芝士

思路

我们要先字符串处理(也就是输入,预处理等事情。较简单,不在此描述了)。接着,我们在建一颗表达式树。我们假设在每次询问时,都修改表达式树,然后算出结果。这时我们会发现 TLE 了,因为每次遍历都是 \(\mathcal O(n q)\),所以我们用到了树形 DP。大多数题目树形 DP 都是从下往上做,但是这道题得从上往下做。然后我们假设 \(u\) 这个节点发生了变化,我们要看它的父亲节点是否有变化。如果没有,最后结果不变;如果父亲节点的值变了,就看这个父亲节点是否会导致父亲节点的父亲的值改变,然后一直做这个操作。最后我们把答案都预处理出来就好啦!

还有很多细节,看代码吧!

AC code:

#include <bits/stdc++.h>
using namespace std;
const int N=1010000;
struct node{int l,r;int type;int val;bool dp;
}a[N];
stack <int> s;
int n,m,q;
int p[N];
void dfs1(int u){if(a[u].type>0)return;if(a[u].type==-1){dfs1(a[u].l);a[u].val= !a[a[u].l].val;}else{dfs1(a[u].l);dfs1(a[u].r);if(a[u].type==-2)a[u].val=a[a[u].l].val & a[a[u].r].val;elsea[u].val=a[a[u].l].val | a[a[u].r].val;}
}
void dfs2(int u){if(a[u].type>0)return;int L=a[u].l,R=a[u].r;if(a[u].type==-1){a[L].dp=a[u].dp;dfs2(L);}else{if(a[u].type==-2){if(a[R].val==0)a[L].dp=false;else a[L].dp=a[u].dp;if(a[L].val==0)a[R].dp=false;else a[R].dp=a[u].dp;}else{if(a[R].val==1)a[L].dp=false;else a[L].dp=a[u].dp;if(a[L].val==1)a[R].dp=false;else a[R].dp=a[u].dp;}dfs2(L);dfs2(R);}
}
int main(){while(true){char ch; scanf("%c",&ch);if(ch=='x'){++n;int id=0;while(true){scanf("%c",&ch);if(ch>='0'&&ch<='9')id=id*10+ch-'0';else break;}a[n].type=id;p[id]=n;s.push(n);}else{assert((ch=='|')||(ch=='&')||(ch=='!'));if(ch=='|'||ch=='&'){++n;int r=s.top();s.pop();int l=s.top();s.pop();a[n].l=l;a[n].r=r;if(ch=='|')a[n].type=-3;else a[n].type=-2;s.push(n);}else{++n;int l=s.top();s.pop();a[n].l=l;a[n].type=-1;s.push(n);}scanf("%c",&ch);}if(ch!=' ')break;}int root=s.top();scanf("%d",&m);for(int i=1;i<=m;i++){int x;scanf("%d",&x);a[p[i]].val=x;}dfs1(root);a[root].dp=true;dfs2(root);scanf("%d",&q);for(int i=0;i<q;i++){int x;scanf("%d",&x);if(a[p[x]].dp)printf("%d\n",a[root].val^1);else printf("%d\n",a[root].val);}
}
http://www.rkmt.cn/news/198193.html

相关文章:

  • PyWebIO文件管理全解析(高级技巧曝光):让上传下载更安全高效的秘诀
  • 题解:P14304 【MX-J27-T1】分块
  • DC宇宙蝙蝠洞通讯:戈登局长接到AI生成警报
  • Python 3D图形开发必知(视角控制技术全公开)
  • 外卖骑手接单提示音:VoxCPM-1.5-TTS定制专属提醒语调
  • 体育赛事比分更新:观众无需看屏也能掌握赛况
  • 心理咨询陪伴机器人:VoxCPM-1.5-TTS营造温暖对话氛围
  • 导师推荐9个AI论文写作软件,专科生轻松搞定毕业论文!
  • 动漫角色语音克隆:粉丝自制作品也能拥有原版声线
  • ChromeDriver下载地址汇总?不如先了解VoxCPM-1.5-TTS部署依赖
  • 双指针专题(五):灵活的起跳——「无重复字符的最长子串」
  • 幼儿园亲子留言系统:孩子录音转文字再转语音回家播放
  • 家族族谱语音记录:后代子孙聆听祖先奋斗历程
  • FastAPI跨域问题深度解析(预检请求避坑宝典)
  • HuggingFace镜像网站同步更新VoxCPM-1.5-TTS最新版本
  • 揭秘NiceGUI输入校验陷阱:5个你必须掌握的防御性编程技巧
  • PyWebIO文件处理实战(从入门到精通):解决90%开发者遇到的上传难题
  • 【高并发必看】FastAPI限流最佳实践:3个真实线上案例深度剖析
  • X射线检测技术:多领域关键应用与性能发展趋势解析
  • asyncio中协程到底能不能复用?:99%开发者都忽略的核心细节
  • 基于YOLOv12的口罩识别检测系统(YOLOv12深度学习+YOLO数据集+UI界面+登录注册界面+Python项目源码+模型)
  • Python协程复用终极优化方案(千万级请求场景实测有效)
  • HTTPX异步请求实战案例解析(高并发场景下的性能优化秘籍)
  • VoxCPM-1.5-TTS-WEB-UI模型结构解读:轻量化设计如何实现高效推理
  • 图像卷积架构
  • 救命神器10个AI论文工具,自考学生轻松搞定毕业论文!
  • VoxCPM-1.5-TTS-WEB-UI支持多语种吗?实测结果告诉你真相
  • 【Python 升级必读】:3.13 版本废弃特性的10个危险信号
  • 设计停车场车位引导系统,通过摄像头识别空车位,实时推送车信息,帮助车主快速找到车位。
  • 导师推荐!继续教育必用!9款AI论文写作软件TOP9测评