首页 > 其他分享 >P8815 [CSP-J 2022] 逻辑表达式

P8815 [CSP-J 2022] 逻辑表达式

时间:2023-10-02 09:22:59浏览次数:45  
标签:P8815 int 短路 mid dfs t1 2022 CSP 表达式

Problem

考察算法:后缀表达式计算、建表达式树、\(DFS\)。

题目简述

给你一个中缀表达式,其中只有 \(\&\) 和 \(\mid\) 两种运算。

求:\(\&\) 和 \(\mid\) 运算中的“最短路”次数各出现了多少次。

最短路的定义为:

  • 在 \(a\) \(\&\) \(b\) 运算中,如果 \(a = 0\),那么整个表达式的计算就不需要再继续进行了,因为表达式的值都一定为 \(0\)。

  • 在 \(a\) \(\mid\) \(b\) 运算中,如果 \(a = 1\),表达式的值也不需要再继续计算了,一定为 \(1\)。

以上两种情况中的任何一种,都被称作一次“最短路”的情况。

思路

  • 首先把中缀表达式转换为后缀表达式。
  • 在计算后缀表达式的过程中,建立一颗表达式树。
  • 最后 \(dfs\) 整棵树,看看最短路各出现了多少次。

代码

#include <bits/stdc++.h>

using namespace std;

const int N = 1e6 + 10;
struct node{
	char c;
	int l, r, v;
} a[N];
stack<char> op;
stack<int> st;
vector<char> v;
char s[N];
int c1, c2;

void dfs(int x) {
	if (a[x].l == 0 && a[x].r == 0) return;
	int t1 = a[x].l, t2 = a[x].r;
	dfs(t1);
	if (a[x].c == '&' && a[t1].v == 0) { c1++; return; }
	if (a[x].c == '|' && a[t1].v == 1)  { c2++; return; }
	dfs(t2);
}

int main() {
	scanf("%s", s + 1);
	for (int i = 1, len = strlen(s + 1); i <= len; i++) {
		if (isdigit(s[i])) v.push_back(s[i]);
		else if (s[i] == '(') op.push(s[i]);
		else if (s[i] == ')') {
			while (!op.empty() && op.top() != '(') {
				v.push_back(op.top());
				op.pop();
			}
			op.pop();
		} else if (s[i] == '&') {
			while (!op.empty() && op.top() == '&') {
				v.push_back(op.top());
				op.pop();
			}
			op.push(s[i]);
		} else if (s[i] == '|') {
			while (!op.empty() && (op.top() == '&' || op.top() == '|')) {
				v.push_back(op.top());
				op.pop();
			}
			op.push(s[i]);
		}
	}
	while (!op.empty()) {
		v.push_back(op.top());
		op.pop();
	}
	int len = v.size(), k = 0;
	for (int i = 0; i < len; i++) {
		if (isdigit(v[i])) {
			a[++k] = {0, 0, 0, v[i] - '0'};
			st.push(k);
		} else {
			int x = st.top(); st.pop();
			int y = st.top(); st.pop();
			if (v[i] == '&') {
				a[++k] = {v[i], y, x, a[y].v & a[x].v};
				st.push(k);
			} else {
				a[++k] = {v[i], y, x, a[y].v | a[x].v};
				st.push(k);
			}
			
		}
	}
	printf("%d\n", a[k].v);
	dfs(k);
	printf("%d %d", c1, c2);
	return 0;
}

标签:P8815,int,短路,mid,dfs,t1,2022,CSP,表达式
From: https://www.cnblogs.com/yhx0322/p/17739712.html

相关文章

  • P7073 [CSP-J2020] 表达式
    Problem考察算法:后缀表达式建树,优化。题目简述读入一个后缀表达式,由\(\&,\mid,!\)三种运算和操作数构成。有\(q\)次询问,每次输入一个下标\(i\),表示要取反\(x_i\)的值。每次求表达式的值。暴力每次重新建表达式树,计算。时间复杂度:\(O(q\times|s|)\),达到了惊人的\(10......
  • P7072 [CSP-J2020] 直播获奖
    Problem考查知识点:桶优化。题目简述竞赛的获奖率为\(w\%\),即当前排名前\(w\%\)的选手的最低成绩就是即时的分数线。若当前已评出了\(p\)个选手的成绩,则当前计划获奖人数为\(\max(1,\lfloorp\timesw\%\rfloor)\),如有选手成绩相同,则所有成绩并列的选手都能获奖,因此实......
  • P7074 [CSP-J2020] 方格取数
    Problem相关算法:\(DP\)。题意简述给你一个方格图,每次只能向上、向右、向下走。现在求:经过所有点取到的数字和的最大值。思路动态规划。对于每一列而言,如果某个点向上走了,就不可能再向下走。向下走了同理。所以我们可以把两种情况都尝试一遍,每个点而言,如果是处于向下的状态......
  • 2022 China Collegiate Programming Contest (CCPC) Weihai Site
    PrefaceVP到自己学校出的题了可海星,不得不说学长们出的题比起昨天VP的CCPC2022广州做起来要舒服地多这场前面写题都很顺基本都是一发过,中期的medium也没怎么卡思路和卡机子,一道一道地慢慢出最后一个小时徐神RushF可惜没Rush出来,然后我和祁神坐在下面把B的做法给搞出来了,但不知......
  • The 2022 ICPC Asia Shenyang Regional Contest
    C.ClampedSequence因为\(n\)的范围不大,并且可以猜到\(l,r\)中应该至少有一个在\(a_i,a_i-1,a_i+1\)上。所以直接暴力枚举\(l\)或\(r\)然后暴力的计算一下#include<bits/stdc++.h>usingnamespacestd;#defineintlonglongusingvi=vector<int>;int32_tmain(){......
  • CSP模拟30
    CSP模拟30难得改完一次题,写篇题解祭一下A.枫(P7485「Stoi2031」枫)考场居然打了个高分暴力我的思路:假设我们已知最后一个数,逆推,不断往该数前(或后)加了多少数,直至完成这个操作。荣获$96pts$的好成绩评测记录代码如下:#include<bits/stdc++.h>usingnamespacestd;constin......
  • 2022 China Collegiate Programming Contest (CCPC) Guangzhou Onsite
    Preface好难啊这场广州站,不愧是5题金4题铜的超恶劣站,中档题普遍难度较高但我感觉主要原因还是题目出的太偏向于DP了,AI是本质差不多的树上换根DP,M又是个数位DP,导致像我这种不擅长DP的人直接中期坐牢但好在祁神大力切出了medium~hard的K题,然后最后一小时我把一直在想的A题丢给徐......
  • 2022 ICPC 杭州站
    gym知乎尝试先读题而不是写缺省源感觉不太好E一头雾水。F是签到就先上去写了,结果读错题交了个样例都没过的代码,小改了一下就过了。G不太会做。zsy把M丢给我想了一下然后gjk把D过了。看榜发现K过了很多人,需要快速判断比较两个字符串等价于比较哪两个字符,反应了一......
  • 解决Android studio 更新到2022.3版本后,一直卡在waiting for target device to come o
    解决Androidstudio更新到2022.3.1patch1之后卡在waitingfortargetdevicetocomeonline的问题1.现象在发布一个app的时候,每次走到waitingforalltargetdevicestocomeonline之后,就没有后续了,模拟器没有调起来,更不用谈后续的install。2.原因暂时不明3.解决方法......
  • SketchUp草图大师2022中文版下载 安装包下载方式
    草图大师sketchup官方电脑版是一款设计方案创作过程的设计工具,草图大师已经成为全球数百万设计师选择的设计工具。很多型号质量都很好。支持视频动画功能,让设计师在软件中全方位释放创意。创建三维建筑设计方案的优秀工具。有需要的朋友不妨下载试试。软件地址:看置顶贴部分软件使......