一開始有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表示已經開始與操作...