WC2021 表示式求值

2022-05-04 23:00:09 字數 1322 閱讀 4502

[題目鏈結]

[題解]

首先讓我們解決乙個簡單的問題 :

注意到 \(k\) 很小 , 那麼不妨維護 \(f_\) 表示 \(i\) 號生物的每個位置是否都比 \(s\) 中每個元素的值大。

用 \(bitset\) 維護 \(f\) , 查詢時 , 從大到小列舉值即可。

時間複雜度 : \(o(\frac})\)

解決這個問題的關鍵是 : 每個位置的值都是由 \(k\) 個初始陣列中的元素得到的 , 而 \(k\) 又很小 , 因此可以通過壓縮狀態之類的方法求解。

回到本題 , 首先不妨建出表示式樹。這是一棵高度為 \(o(n)\) 的樹 , 葉子節點維護的是位置 , 而非葉節點則為操作。( 詳見 [**] )

令 \(f_\) 表示 \(u\) 節點的值嚴格大於 \(s\) 中每個數的方案數。轉移只需分別討論兩個兒子節點的情況。

回答詢問時進行容斥即可。

時間複雜度 \(o(n2 ^ )\)

[**]

#include using namespace std;

typedef long long ll;

#define rep(i , l , r) for (int i = (l); i < (r); ++i)

const int mn = 5e4 + 5, mod = 1e9 + 7;

typedef pair < int, int > pii;

#define mp make_pair

int n, m, cnt, top, len, stk[mn], pre[mn], f[mn][2], g[1 << 12], a[12][mn], size,

val[mn], child[mn][2];

char s[mn];

inline void inc(int &x, int y)

inline void dec(int &x, int y)

inline int get(int x)

inline int build(int l, int r) else

return cur;

}int main()

if (val[u] != -1) }}

g[s] = f[1][0];

}int ans = 0;

for (int i = 1; i <= n; ++i)

}printf("%d\n", ans);

return 0;

}

WC2021 表示式求值

直接列舉每一位求值顯然至少是 o n s 的,為了減少計算次數,考慮對於 n 個不同陣列的情況歸納出一些通用情況 對於乙個陣列,考慮計算答案 ge a i 的方案數,那麼有一部分數 ge a i 直接狀壓 ge a i 的數的集合,對於的數不同二進位制表示就可以得到 2 m 種不同的狀態 在計算時,...

遊記 WC2021遊記

在學校的時候教練讓大家報名,本著不會也要當炮灰的原則填了報名表 放了寒假,給班主任請了假開始自己在家突擊一些完全沒有考到的新知識點,看了點歷年題覺得十分不可做,於是每天就頹頹頹 早上的開幕式很水,說好的8 00 8 30結果講了幾分鐘就沒了 截了一張 dzd 講話的圖作紀念 上來就是隨機化演算法什麼...

WC2021前日常胡話

不知不覺離noip的恐怖回憶已經過去乙個半月了,但我似乎還在whk與oi間徘徊,以至於兩邊都沒搞好,自己心態還受了影響。難得清閒,寫點心裡話出來,就沒有那麼難受了吧。初中我就一直不太很重視whk的學習,上課有的時候不是很認真,然後不太願意寫的作業就應付應付或者抄一抄就過去了。但是因為初中知識太簡單,...