#P6169. [IOI 2016] molecules

[IOI 2016] molecules

题目描述

彼得在一家公司工作,这家公司已经制造了一台检测分子的机器。每个分子的重量都是正整数。这台机器的检测范围是 [l,u][l,u],这里 ll 和 uu 都是正整数。这台机器能够检测一个分子集合当且仅当这个集合包含了一个子集,这个子集的分子的重量属于机器的检测范围。

考虑 nn 个分子,重量记为 w0,⋯ ,wn−1w_0,\cdots,w_{n-1}。如果存在一个下标的集合(并且该集合中的下标都不相同)I={i1,⋯ ,im}I=\{i_1,\cdots,i_m\} 使得 l≤wi1+⋯+wim≤ul\le w_{i_1}+\cdots+w_{i_m}\le u,那么检测就会成功。

由于机器的细节,ll 和 uu 之间的差距要保证会大于等于最重分子和最轻分子之间的差距,即 u−l≥wmax−wminu-l \ge w_{max}-w_{min},其中 wmax=max⁡(w0,⋯ ,wn−1)w_{max}=\max(w_0,\cdots,w_{n-1}),wmin=min⁡(w0,⋯ ,wn−1)w_{min}=\min(w_0,\cdots,w_{n-1})

你的任务是写一个程序,该程序能找到一个子集,使得该子集的总重量属于检测范围,或者判定没有这样的子集存在。

样例一

 4 15 17
 6 8 8 7

这个例子当中,我们有四个分子,重量分别是 6,8,86,8,8 和 77。这台机器可以检测子集总重量在 1515 到 1717 之间(包含 1515 和 1717)的子集。注意,17−15≥8−617-15 \ge 8-6。分子 11 和分子 33 的重量之和为 w1+w3=8+7=15w_1+w_3=8+7=15, 所以应该输出

2
1 3

其他可能正确的答案有

2 
1 2

(w1+w2=8+8=16w_1+w_2=8+8=16)

和

2
2 3

(w2+w3=8+7=15w_2+w_3=8+7=15)。

样例二

4 14 15
5 5 6 6

这个例子当中,我们有四个分子,重量分别为 5,5,65,5,6 和 66,我们要寻找一个子集,其总重量介于 1414 和 1515 之间(包含 1414 和 1515)。请注意,15−14≥6−515-14 \ge 6-5。因为不存在总重量介于 1414 和 1515 之间的子集,所以输出 0。

输入格式

  • 第一行:整数 n,ln,l 和 uu。

  • 第二行:nn 个整数:w0,⋯ ,wn−1w_0,\cdots,w_{n-1}。

输出格式

如果有满足条件的子集:

  • 第一行,输出该子集大小 xx。

  • 第二行,xx 个整数,符合要求的子集中的分子的下标。

如果没有,输出 0。

1 10 12
9

0

2 5 10
4 2
2
0 1

提示

对于 100%100\% 的数据,n≤2×105n \le 2 \times 10^5,wi≤231−1w_i \le 2^{31}-1,l,u≤231−1l,u \le 2^{31}-1。