#P10599. BZOJ2164 采矿
BZOJ2164 采矿
题目背景
题目来自原 BZOJ,我们承认题面及原数据的版权均属于原 BZOJ 或将题目授权给 BZOJ 使用的出题人。如果您是版权所有者且认为我们侵犯了您的权益,可联系我们。
题目描述
浩浩荡荡的 cg 大军发现了一座矿产资源极其丰富的城市,他们打算在这座城市实施新的采矿战略。
这个城市可以看成一棵有 个节点的有根树,我们把每个节点用 到 的整数编号。为了方便起见,对于任何一个非根节点 ,它任何一个祖先的编号都严格小于 。树上的每个节点表示一个矿点,每条边表示一条街道。
作为 cg 大军的一个小队长,你拥有 个部下。你有一张二维的动态信息表,用 表示第 行第 列的数据。当你被允许开采某个区域时,你可以将你的部下分配至各个矿点。在第 个矿点安排 个人可以获得 单位的矿产。
允许开采的区域是这样描述的:给你一对矿点 ,保证 是 的祖先(这里定义祖先包括 本身); 为你控制的区域,可以在以 为根的子树上任意分配部下; 到 的简单路径(不包括 但包括 ,若 则包括 )为探险路径,在该路径上你可以选择至多一个矿点安排部下。你这次开采的收益为安排有部下的矿点的收益之和。
输入格式
输入的第一行包含 个正整数 。其中 为矿点的个数, 为部下的数量。 是与动态信息表有关的数据。
第二行包含 个正整数,第 个数为 ,表示节点 的父亲。
接下来需要你用下文的方法依次生成 组数据,每组数据共 个。其中第 组的 个数据为信息表中第 行的 个数据。紧接着一行包含一个正整数 ,表示事件的数量。
最后给出 行,每行描述一个事件。每个事件会先给出一个 或 的整数。如果该数为 ,则后面有一个正整数 ,表示动态信息表有更新,你需要生成一组 个数据,来替换信息表中第 行的 个数据。如果该数为,则后面有两个正整数 ,表示出现了一个你可以开采的区域,你需要回答这次开采的收益。同一行的各个数之间均用一个空格隔开,没有多余的空格和换行。
数据的生成方法如下:每次生成一组 个从小到大排列的数据,替换动态信息表的一行。其中,从小到大第 个数替换信息表中第 列的数。调用以下代码 次并排序得到一组数据。(注意可能会出现重复的数)
Function GetInt
A←((A xor B)+(B div X)+(B * X))and Y
B←((A xor B)+(A div X)+(A * X))and Y
return (A xor B)mod Q
其中 均用 位有符号整数保存(C/C++ 的 signed long int 类型,pascal 的 longint 类型),,,xor 为位异或运算,div 为整除运算,and 为位且运算,mod 为取余运算。由于只保留了低 位,易得我们不用考虑数据的溢出问题。注意每次 和 都会被改变)
输出格式
对于每个开采事件(开头为 的事件),输出一行一个整数,为每次的收益。
10 5 1 2 10
1 1 3 3 4 4 6 6 9
4
1 6 3
1 9 1
0 1
1 1 1
11
9
12
提示
【样例解释】
最初的信息表如下:
0 | 1 | 2 | ||
---|---|---|---|---|
0 | 5 | 7 | 9 | |
1 | 2 | 3 | 4 | 5 |
0 | 1 | 2 | ||
2 | 4 | 7 | 8 | 8 |
0 | 2 | 3 | 9 | |
1 | 3 | 5 | 6 | 8 |
3 | 3 | 7 | ||
0 | 1 | 2 | 3 | 9 |
0 | 1 | 4 |
变化后的第 行,为:
1 1 1 4 7
第一次开采可以在矿点 任意安排,可以在矿点 或 中选取一个安排开采。一种最优安排是在矿点 安排 人,在矿点 安排 人。第二次开采可以在矿点 安排,可以在矿点 中选择一个安排。一种最优安排是在矿点 安排 人,在矿点 安排 人。
【数据范围】
有 的数据,对于满足 的整数 ,。这些数据中有 的数据(即所有数据的 )满足 。
除上述数据,另有 的数据满足 ,,。
对于 的数据 ,,。对于满足 的整数 ,。,。