Jzoj5431 序列操作

2022-05-09 15:28:17 字數 763 閱讀 1473

一開始有n個非負整數h[i](1<=i<=n),接下來會進行m次操作,第i次操作給出乙個數c[i],要求你選出c[i]個大於零的數並將它們減去1。

問最多可以進行多少輪操作後無法操作(即沒有c[i]個大於零的數)

考場上腦抽認為先減小的會更優(很明顯先減大的會更優啊!!!!!)

考慮怎麼維護,可以用splay

然而正常人都用bit因為100w兩個log不會超時(其實是會的不過jz跑得快)

先將所有數大到小排序丟入bit中

每次找出第c[i]個數,將所有大於ci的都減一,等於c[i]的取最後的那些,這樣就能保證序列單調性

(感覺自己好傻啊,這樣下去遲早藥丸)

#pragma gcc optimize("o3")

#pragma g++ optimize("o3")

#include

#include

#include

#define n 1000010

#define ll long long

using

namespace

std;

int n,m,s[n];

struct fenwick

inline

int sum(int x)

} w;

int lower_bound(int v)

return l;

}int main()

printf("%d\n",m);

}

Jzoj5431 序列操作

一開始有n個非負整數h i 1 i n 接下來會進行m次操作,第i次操作給出乙個數c i 要求你選出c i 個大於零的數並將它們減去1。問最多可以進行多少輪操作後無法操作 即沒有c i 個大於零的數 考場上腦抽認為先減小的會更優 很明顯先減大的會更優啊!考慮怎麼維護,可以用splay 然而正常人都用...

jzoj5231 序列問題 分治

n nn個數字,求 l 1n r ln min max i l r 109 7 sum n sum nmin max i in l.r 10 9 7 l 1 n r l n m in m ax i l.r 1 09 7 考慮分治,單獨在半個內的分治下去計算,考慮如何計算跨過中點的區間。有兩種情況 m...

JZOJ 3889 序列問題 dp

傳送門 在乙個序列中選出兩個集合s ss和t tt,使得s ss中的每個數異或起來等於t tt中 的每個數與起來 設f i,j,k 0.2 f fi j,k 0.2 表示做到第i ii個數,結果為j jj的方案數,k 0 k 0k 0表示在此之前並沒有任何操作,k 1 k 1k 1表示已經開始與操作...