時間限制: 2 sec 記憶體限制: 1024 mb
題目描述小路綾 (komichi aya) 想要給陽子 (inokuma youko) 做便當。
小路綾現在有n
nn種食材,編號從1
11到n
nn,她會按編號順序放入這n
nn種食材。
對於每種食材陽子有乙個美味度a
ia_i
ai。
小路綾知道,對於所有1⩽i
⩽n
1 \leqslant i \leqslant n
1⩽i⩽
n,設前i種食材的美味度總和
s i=
∑j=1
ia
js_ = \sum_^ a_
si=j=
1∑i
aj
當加入第i
ii種食材時,如果s
i>
ms_i>m
si>
m,陽子就會吃撐。
所以小路綾每放入一種食材時,都會想知道:最少要從之前已經選過的食材中去掉多少食材,才不會讓陽子吃撐。
當然,小路綾不會真正地把食材去掉,她只是想知道結果而已。才不是關心你呢!
輸入第一行為兩個正整數n,m
n,mn,
m,分別表示食材的種類數以及會使陽子吃撐的值mmm。
接下來為一行n
nn個正整數,其中第i個正整數表示a
ia_i
ai。
輸出輸出一行n
nn個非負整數,其中第i
ii個非負整數表示在加入第i
ii種食材時,至少要去掉之前加入的多少種食材才能不讓陽子吃撐。
樣例輸入【樣例1】
7151
2345
67
【樣例2】
5
10080
4040
4060
樣例輸出【樣例1】
000
0023
【樣例2】
011
23
提示對於100
%100\%
100%
的資料 1⩽n
⩽106
1⩽m⩽
1091
⩽ai⩽
m1 \leqslant n \leqslant 10^ \quad 1 \leqslant m \leqslant 10^ \quad 1 \leqslant a_ \leqslant m
1⩽n⩽10
61⩽m
⩽109
1⩽ai
⩽m
解體思路最簡單的思路應該是新增i
ii時,在i−1
i-1i−
1挑出最大的幾個數使得字首和s
i<=m
s_i<=m
si<=m
先離散化,用樹狀陣列維護ck表
示在
c_表示在
ck表示在
1
11到i−1
i-1i−
1中前k
kk小的和,最後用二分查詢最大的k使得ck+
a[i]
⩽m
c_k+a[i] \leqslant m
ck+a[
i]⩽m
,統計1
11到k
kk中有多少個數就行了,最後的答案就是i−1
−num
i-1-num
i−1−nu
m(num表示1
11到k
kk中有多少個數)。
#include
#include
#include
using
namespace std;
const
int maxn=
1e6+10;
typedef
long
long ll;
struct node a[maxn+10]
;bool
cmp1
(const node &a,
const node &b)
bool
cmp2
(const node &a,
const node &b)
struct bit
} ll ask1
(int x)
return res;
} ll ask2
(int x)
return res;
}}b;
int n,m;
void
work
(int i)
else r = mid -1;
}printf
("%d"
, i - b.
ask2
(res)-1
);}void
work()
sort
(a +
1, a +
1+ n, cmp1)
;for
(int i =
1; i <= n; i++
)sort
(a +
1, a +
1+ n, cmp2)
;for
(int i =
1; i <= n; i++)}
intmain()
洛谷 P4964 綾小路的特別考試 解題報告
這世界上 勝利 便是一切。無關乎過程。要付出多少犧牲都無所謂。只要最後我 勝出 那就行了。一場新的特別考試來臨了,這次的考試內容是 wan e de 文化課,但有所不同的是,考試中允許學生使用對講機。然而,對講機的接收範圍有限 每個對講機都能傳送無限遠,但是只能接收到接收範圍內的訊號 所以,需要周密...