luogu#P6169. [IOI2016] molecules

[IOI2016] molecules

题目描述

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

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

由于机器的细节,lluu 之间的差距要保证会大于等于最重分子和最轻分子之间的差距,即 ulwmaxwminu-l \ge w_{max}-w_{min},其中 wmax=max(w0,,wn1)w_{max}=\max(w_0,\cdots,w_{n-1})wmin=min(w0,,wn1)w_{min}=\min(w_0,\cdots,w_{n-1})

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

样例一

 4 15 17
 6 8 8 7

这个例子当中,我们有四个分子,重量分别是 6,8,86,8,877。这台机器可以检测子集总重量在 15151717 之间(包含 15151717)的子集。注意,17158617-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,666,我们要寻找一个子集,其总重量介于 14141515 之间(包含 14141515)。请注意,15146515-14 \ge 6-5。因为不存在总重量介于 14141515 之间的子集,所以输出 0

输入格式

  • 第一行:整数 n,ln,luu

  • 第二行:nn 个整数:w0,,wn1w_0,\cdots,w_{n-1}

输出格式

如果有满足条件的子集:

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

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

如果没有,输出 0

1 10 12
9

0

2 5 10
4 2
2
0 1

提示

对于 100%100\% 的数据,n2×105n \le 2 \times 10^5wi2311w_i \le 2^{31}-1l,u2311l,u \le 2^{31}-1