題解 LuoGu7073 表示式

2021-10-11 01:31:31 字數 1755 閱讀 6025

原題傳送門

我覺得,這道題目主要考察的還是把字尾表示式轉成一棵樹

然後遍歷一遍樹求出每個節點的值

然後暴力改動每個節點的值,往上跑,如果某乙個時刻新算的值跟原來一樣,那麼就不用進行下去,否則繼續

結果果然只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 為表示式的結束符號。為運算元的結束符號。輸入格式...