原題傳送門
我覺得,這道題目主要考察的還是把字尾表示式轉成一棵樹
然後遍歷一遍樹求出每個節點的值
然後暴力改動每個節點的值,往上跑,如果某乙個時刻新算的值跟原來一樣,那麼就不用進行下去,否則繼續
結果果然只t了乙個點,然後我開了o2就過了
code:
#include
#define maxn 1000010
using
namespace std;
struct edgeedge[maxn <<1]
;int num, head[maxn]
, n, m, stk[maxn]
, top, val[maxn]
, sum[maxn]
, calc[maxn]
, flag, ans[maxn]
, tag[maxn]
, fa[maxn]
, rt;
char s[maxn]
;inline
intread()
void
addedge
(int x,
int y)
, head[x]
= num;
}void
build
(int u)
calc[u]
^= tag[u];}
void
dfs(
int u)
if(u == rt)
return
;int v = fa[u]
, i = head[v]
;while
(edge[i]
.to == u) i = edge[i]
.next;
int w = edge[i]
.to;
if(val[v]==2
) sum[v]
= sum[u]
| calc[w]
;else sum[v]
= sum[u]
& calc[w]
; sum[v]
^= tag[v]
;dfs
(v);
}int
main()
else
if(c ==
'|'|| c ==
'&')
else
if(c ==
'!') tag[stk[top]]^
=1;scanf
("%s"
, s +1)
;}for(
int i =
1; i <=
strlen
(s +1)
;++i) n =
(n <<1)
+(n <<3)
+(s[i]^48
);rt = stk[top]
;for
(int i =
1; i <= n;
++i) val[i]
=read()
;build
(rt)
;for
(int i =
1; i <= n;
++i)
int q =
read()
;while
(q--
)printf
("%d\n"
, ans[
read()
]);return0;
}
題解 Luogu1739 表示式括號匹配
這是一篇良心部落格。在這裡,你會看到所有你可能踩到的坑。所以,作者用這個方式來掩飾自己超蒻 一眼看過去,水題乙個!隨手寫了這麼乙個 include int main std cout flag?yes no 結果 艹測評機你不打臉會死啊喂 然後,改為do while include int main...
Luogu1175 表示式的轉換 表示式樹
平常我們書寫的表示式稱為中綴表示式,因為它將運算子放在兩個運算元中間,許多情況下為了確定運算順序,括號是不可少的,而中綴表示式就不必用括號了。字尾標記法 書寫表示式時採用運算緊跟在兩個運算元之後,從而實現了無括號處理和優先順序處理,使計算機的處理規則簡化為 從左到右順序完成計算,並用結果取而代之。例...
luogu1449 字尾表示式
時空限制 1000ms 128mb 所謂字尾表示式是指這樣的乙個表示式 式中不再引用括號,運算符號放在兩個運算物件之後,所有計算按運算符號出現的順序,嚴格地由左而右新進行 不用考慮運算子的優先順序 如 3 5 2 7對應的字尾表示式為 3 5 2 7 為表示式的結束符號。為運算元的結束符號。輸入格式...