[題目鏈結]
[題解]
首先讓我們解決乙個簡單的問題 :
注意到 \(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的學習,上課有的時候不是很認真,然後不太願意寫的作業就應付應付或者抄一抄就過去了。但是因為初中知識太簡單,...