Description
你需要确定是否存在效率为 vi 的计划。如果存在这样的计划,则可能需要输出这样一个计划。
制定计划的过程包括两个阶段。
在第一阶段,你将获得 v1,v2,…,vq 的值。你需要确定是否存在效率为 vi 的计划,如果不存在,输出 -1;如果存在,输出一个非负整数 ki。
对 k 的定义如下:给定三个整数 x,y,m,定义计划 [a1,a2,…,an] 的 $k = \bigoplus\limits^n_{j=1} ( (x\times j + y\times a_j^2) \bmod m )$,其中 ⊕ 为按位异或。
因为符合要求的计划可能不止一个,所以 ki 也有很多种可能,你需要输出其中一种可能的 ki。
在第二阶段,某些计划的可行性将被检查。在每个查询中,你的程序会得到一个整数 i(1≤i≤q)。对于这个查询,如果不能制定效率为 vi 的计划,你需要输出 -1;否则,你需要输出 n 个整数 a1,a2,…,an(li≤ai≤ri),表示一个制定的计划。这个计划计算出来的 k 值应该等于你先前输出的 ki,效率应该等于 vi。
在程序输出每个 k 之前,无法知道哪些计划会被检查。因此,你需要保证在第一阶段中输出的 ki 是正确的。
本题多测,第一行输入一个整数 t(1≤t≤104),表示数据组数。
在每组数据中:
第一行包含两个整数 n,q(2≤n≤2×105,1≤q≤2×105),分别表示城市的数量和要制定的计划的数量。
第二行包含三个整数 x,y,m(11≤m≤230,0≤x,y<m),即计算 k 的参数。
接下来的 n−1 行描述了城市之间的道路网络。在这 n−1 行中,第 i 行包含两个整数 si,fi(1≤si,fi≤n,si=fi),表示第 i 条道路连接城市 si 和 fi 的双向道路。保证这些道路能够构成一棵树。
接下来的 n 行中的第 i 行包含两个整数 li,ri(0≤li≤ri≤109),表示第 i 个城市的工人数量限制。
接下来的一行包含 q 个整数 v1,v2,…,vq(0≤vi≤i=1∑nri),表示需要制定的计划的效率值。保证所有的 vi 都是不同的。
接下来,你需要输出第一部分中你需要输出的内容(具体方式见“输出格式”)。输出完成后,才可以读入第二部分的数据。
接下来若干行,每行输入一个数 i(0≤i≤q)。当 i=0 时,i 表示要检查的计划的编号。在按照输出格式的要求输出后,交互库才会继续给你下一个 i。当 i=0 时,表示第二部分的检查结束,即这一组数据输入完成。如果这不是最后一组数据,你的程序应该立即开始读入下一组数据。
保证 ∑n,∑q≤2×105,且每组数据中检查计划次数 c 的总和不超过 104,∑n×c≤106。
读取完每组输入的第一部分后,需要输出 q 个整数 k1,k2,…,kq(−1≤ki<230),如果 ki=−1 则表示无法制定效率值为 vi 的计划。输出后,交互库才会给你第二部分的数据。
在读入第二部分检查的计划编号 i(且 i=0)后,如果第 i 个计划无法制定,即 ki=−1 时,则输出 -1。否则,需要输出 n 个整数 a1,a2,…,an(li≤ai≤ri),表示所制定的计划。该计划的 k 应等于 ki,并且效率应等于 vi。
IO 交互题在输出后应刷新缓冲区。
如果在 C++ 中使用了 cout << ... << endl,在 Java 中使用了 System.out.println,在 Python 中使用了 print,在 Pascal 中使用了 writeln,那么输出缓冲区会自动刷新,不需要额外操作。
如果使用了其他输出方法,建议手动刷新输出缓冲区。在刷新输出缓冲区时,可以使用 C 和 C++ 中的 fflush(stdout),Pascal 中的 flush(output),Java 中的 System.out.flush(),Python 中的 sys.stdout.flush()。
1
9 3
4 7 15
1 2
2 4
2 5
1 3
3 6
3 7
6 8
6 9
4 4
2 2
5 5
3 3
2 2
6 6
3 3
4 4
3 3
18 19 20
1
2
3
0
-1 10 -1
-1
4 2 5 3 2 6 3 4 3
-1
3
3 4
3 4 11
1 2
2 3
0 1
0 1
0 1
0 1 2 3
2
0
4 6
1 2 11
1 2
2 3
3 4
0 2
1 1
1 1
1 2
0 1 2 3 4 5
5
2
3
0
5 7
11 31 101
1 2
2 3
2 4
3 5
1 2
1 5
0 4
1 4
4 6
13 12 11 10 9 8 6
3
5
7
0
12 8 3 -1
1 0 0
-1 -1 4 14 9 -1
2 1 1 2
-1
1 1 1 1
-1 127 23 58 13 90 91
2 5 4 1 6
2 4 4 3 4
1 1 0 1 4
Hint
在样例中,程序与交互库的交互用空行分隔。这样做是为了便于理解,清楚地知道哪个消息是对哪个消息的回应。在实际测试中,不会有多余的空行(当然,会有换行)。
第一个样例只有一种制定计划的方法,即 a=[4,2,5,3,2,6,3,4,3]。它的效率为 19,计算出来的 k 为 10。
第二个样例有三组数据。
- 在第一组数据中:
- 存在唯一一个效率为 0 的计划,a=[0,0,0]。该计划的 k 为 12。
- 存在效率为 1 的计划,例如 a=[1,0,0]。该计划的 k 为 8。
- 存在效率为 2 的计划,例如 a=[1,0,1]。该计划的 k 为 3。
- 不存在效率为 3 的计划。
- 在这四个请求的计划中,检查了计划编号 i=2(v2=1)。
- 在第二组数据中:
- 不存在效率为 0 的计划。
- 不存在效率为 1 的计划。
- 存在效率为 2 的计划,例如 a=[1,1,1,1]。该计划的 k 为 4。
- 存在效率为 3 的计划,例如 a=[2,1,1,1]。该计划的 k 为 14。
- 存在唯一的效率为 4 的计划 a=[2,1,1,2]。该计划的 k 为 9。
- 不存在效率为 5 的计划。
- 在这六个请求的计划中,检查了计划编号 i=5(v5=4),i=2(v2=1)和 i=3(v3=2)。
- 在第三组数据的第一个部分中,请求了以下计划(从第二个开始,因为效率为 v1=13 的计划不存在):[2,5,4,4,6];[2,5,4,1,6];[2,4,4,4,4];[2,4,4,3,4];[2,4,4,2,4];[1,1,0,1,4]。
| 子任务 |
分值 |
n,∑n |
∑q |
其它特殊性质 |
| 1 |
11 |
|
li=ri |
| 2 |
9 |
c=0 |
| 3 |
12 |
li=0,ri≤1 |
| 4 |
li=0 |
| 5 |
8 |
si=1,fi=i+1 |
| 6 |
5 |
n≤10,∑n≤1000 |
Q≤1000 |
c=q,ri≤10,ri−li≤2 |
| 7 |
2 |
c=q,ri≤10 |
| 8 |
13 |
∑n≤1000 |
c=q,i=1∑nri−li≤104 |
| 9 |
11 |
c=q |
| 10 |
6 |
|
|
| 11 |
5 |
∑n≤1000 |
|
| 12 |
∑n≤8000 |
| 13 |
9 |
|
保证 ∑n,∑q≤2×105,且每组数据中检查计划次数 c 的总和不超过 104,∑n×c≤106。