給出乙個長度為 \(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...