CF1468A LaIS dp,樹狀陣列

2022-06-06 11:00:07 字數 866 閱讀 3927

給出乙個長度為 \(n\) 的序列 \(a_1,a_2,...,a_n\) ,請找出乙個子串行 \(b_1,b_2,...,b_k\) ,使其滿足 \(\min(b_1,b_2)\le \min(b_2,b_3)\le ...\le \min(b_,b_k)\) ,求出 \(k\) 的最大值。

lais 中由乙個子串行滿足是 is 並且元素距離不超過 2,稱為這個 lais 的核

我們考慮對著這個核去 dp

我們按值公升序掃瞄所有元素,設 \(f[i]\) 表示以 \(a[i]\) 為核的結尾的 lais 的最大長度

假如現在掃瞄的是 i,我們需要考慮

單點修改,字首查詢,用乙個樹狀陣列(線段樹當然也行)維護即可

#include using namespace std;

#define int long long

struct bitree

int lowbit(int p)

void update(int p, int val)

}int max(int p)

return ans;

}};void getnext(int n, const vector&a, vector&nxt)

sta.push(i);

}}void solve()

); sort(seq.begin(), seq.end());

bitree bitree(n);

for (int _ = 0; _ < n; _++)

bitree.update(i, res);

}cout << bitree.max(n) << endl;

}signed main()

CF961E Fufuruma(分塊 樹狀陣列)

找出乙個序列裡,ij and a j i的對數 問題可以轉化為對每個i,找到下標區間在i 1到a i 內的j,同時a j i的數的數量,並求和。考慮分塊,然後對每個塊維護乙個樹狀陣列。分塊做的還是不熟練,比賽的時候陣列開小了導致沒過。分塊還是很強,可以做一些線段樹做不了的東西。這題的正解是可持久化線...

CF1354D MultiSet(樹狀陣列 二分)

題意 有兩種操作 一種是把乙個元素加入到集合中,一種是刪除集合中第k個元素,求解最後集合裡的元素。題解 祖傳的樹狀陣列套二分,這種題可遇不可求,比賽時直接秒了,不太會出現這麼裸的資料結構題了,includeusing namespace std const int maxn 1e6 500 int ...

(CF792 ABCD題解) 模擬,樹狀陣列

題意 給你n個數,問你兩個數直接的差值得絕對值最小為多少,及有多少對滿足這樣的數 分析 排序後直接掃一遍即可 include include include include include using namespace std const int maxn 200010 int a maxn in...