NC213851. [CSP2020]表达式(expr)
描述
小 C 想知道,给定一个逻辑表达式和其中每一个操作数的初始取值后,再取反某一个操作数的值时,原表达式的值为多少。
为了化简对表达式的处理,我们有如下约定:
表达式将采用后缀表达式的方式输入。后缀表达式的定义如下:
输入描述
第一行包含一个字符串 ,表示上文描述的表达式。
第二行包含一个正整数 ,表示表达式中变量的数量。表达式中变量的下标为 。
第三行包含 个整数,第 个整数表示变量 的初值。
第四行包含一个正整数 ,表示询问的个数。
接下来 行,每行一个正整数,表示需要取反的变量的下标。注意,每一个询问的修改都是临时的,即之前询问中的修改不会对后续的询问造成影响。数据保证输入的表达式合法。变量的初值为 0 或 1。
输出描述
输出一共有 行,每行一个 或 ,表示该询问下表达式的值。
示例1
输入:
x1 x2 & x3 | 3 1 0 1 3 1 2 3
输出:
1 1 0
说明:
该后缀表达式的中缀表达式形式为 (𝑥1 & 𝑥2) | 𝑥3。示例2
输入:
x1 ! x2 x4 | x3 x5 ! & & ! & 5 0 1 0 1 1 3 1 3 5
输出:
0 1 1
说明:
该表达式的中缀表达式形式为 。C++(clang++11) 解法, 执行用时: 2ms, 内存消耗: 376K, 提交时间: 2020-11-07 22:01:51
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int MAXN = 64; int n ,ans[MAXN] ,tot = 0; int main () { scanf ("%d",&n); if (n & 1) { printf ("-1\n"); return 0; } int i = 1 ,sum = 0; while (i <= n) { if (n & i) ans[++ tot] = i; i <<= 1; } for (int q = tot;q >= 1;-- q) { printf ("%d ",ans[q]); } printf ("\n"); return 0; }