類似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 #include2view codeusing
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 }
表示式求值
程式的說明見清華大學出版社 資料結構 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 ...