loj3463 表示式求值

2022-06-07 06:30:13 字數 1202 閱讀 7132

類似cf582e,先建出表示式樹,然後樹形dp+離散+min和max卷積的優化,複雜度為$o(nm|e|)$,無法通過

考慮我們僅關心於這$n$個數的大小關係,具體來說,假設給出的陣列是$a_$(其中$0\le i暴力列舉$j$和$p_$,接下來去統計答案不小於$a_,j}$的方案數:

對於樹形dp的狀態上,我們僅需要記錄小於$a_,j}$和不小於$a_,j}$的方案數,換言之是$o(1)$轉移,但dp次數為$o(nm)$,因此總複雜度仍然是$o(nm|e|)$

但注意到,影響dp過程的只有對於每乙個$i$,$[a_\ge a_,j}]$的值,不難發現至多$2^$種,預處理出每一種值的結果,再列舉$j$和$p_$求出是哪一種值即可

時間複雜度為$o(2^|e|+nm)$,可以通過

1 #include2

using

namespace

std;

3#define n 50005

4#define mod 1000000007

5 stackst_op,st_num;

6int v,n,m,p,ans,b[11][n],a[n],ls[n],rs[n],id[11],f[1

<<10][n][2];7

char

s[n];

8bool cmp(int x,int

y)11

void

merge()

20void dfs(int k,int

p)25

dfs(ls[k],p);

26dfs(rs[k],p);

27int s=(1ll*f[p][ls[k]][0]*f[p][rs[k]][1]+1ll*f[p][ls[k]][1]*f[p][rs[k]][0])%mod;

28if (a[k]==0)32

if (a[k]==1)36

if (a[k]==2)40

}41intmain()

53else

61if (s[i]==')'

)65}66

while (!st_op.empty())merge();

67for(int i=0;i

68for(int i=1;i<=n;i++)78}

79 printf("%d"

,ans);

80return0;

81 }

view code

表示式求值

程式的說明見清華大學出版社 資料結構 c語言版 include include define stack init size 40 define stackincrement 20 define ok 1 define false 0 typedef structs stack typedef st...

表示式求值

既然是表示式求值,自然需要在記憶體中儲存計算結果以及中間值。在 用c語言寫直譯器 一 中提過 變數要求是若型別,而 c 語言中的 view plaincopy to clipboardprint?in basic io.h define memery size 26 typedef enum var...

表示式求值

寫了乙個下午,各種糾結,各種問,終於搞明白了。但是自己還是想出來的一點東西的。很爽歪歪的,哈哈。先貼第一次的 include include include include include includeusing namespace std char data 7 7 int sign char ...