让我们来看看 AI 在此次 NOIPlus2025 中的表现

· · 休闲·娱乐

前言

我在此次 NOI 考试中被碾压了,生气的我决定看一看 AI 的水平。

开启深度思考,禁止联网搜索。
给 DeepSeek 的写题策略是:尽可能的快速解决这道题,如果无法解决,请尽可能的拿高分。
如果通过不了样例,我会让 DeepSeek 重新思考,直到可以通过,并统计思考次数。
由于只是测试 DeepSeek 的水平,并没对使用的程序语言做出限制,因此第一题和第二题的代码是 Python 语言。

[NOIP2025T1] 糖果店 / candy

思考次数:1 次。
思考时间:492 秒。 :::success[思考过程] 首先,问题是关于购买糖果的。有n种糖果,每种糖果的购买价格是交替的:第一颗x_i元,第二颗y_i元,第三颗x_i元,第四颗y_i元,以此类推。小R有m元钱,想买尽可能多的糖果。他不关心种类,只关心总数量。

我需要找到用m元钱能买到的最大糖果数量。

由于糖果种类多,m可能很大( up to 10^18),我不能直接模拟每种糖果的购买过程。我需要一个高效的方法。

考虑一种糖果,如果我要买k颗这种糖果,总成本是多少?设k颗糖果中,有a颗是奇数颗(价格x_i),b颗是偶数颗(价格y_i),那么a + b = k,且a = ceil(k/2), b = floor(k/2)?不,实际上,对于第1颗是x,第2颗是y,第3颗是x,第4颗是y,所以如果k是偶数,那么有k/2颗x和k/2颗y;如果k是奇数,那么有(k+1)/2颗x和(k-1)/2颗y?不,对于k=1,只有1颗x;k=2,1颗x和1颗y;k=3,2颗x和1颗y?不对:第1颗x,第2颗y,第3颗x,所以对于k=3,是x,y,x,所以有2颗x和1颗y。所以一般来说,对于k颗,有ceil(k/2)颗x和floor(k/2)颗y。所以成本是 ceil(k/2) x_i + floor(k/2) y_i。

但注意,ceil(k/2) = (k+1)//2, floor(k/2) = k//2。

所以对于第i种糖果,买k颗的成本是: cost_i(k) = ⌈k/2⌉ x_i + ⌊k/2⌋ y_i

由于我们只关心总糖果数,我们可以考虑每种糖果的“平均成本”或“边际成本”,但可能不是简单的。

一个关键点是,我们可能混合购买多种糖果,以最小化总成本对于给定糖果数量。

由于目标是最多化糖果数量,我们可以考虑二分搜索总糖果数t,然后检查是否能用m元钱买到t颗糖果。但t可能很大,因为m最大10^18,但糖果数量可能达到m/min(x_i,y_i) which is huge, 所以二分搜索可能不高效?但实际上,t最多可能是m / min_value,但min_value可能很小,所以t可能达到10^18,二分搜索需要log2(10^18) ≈ 60次迭代,所以二分搜索是可行的。但问题是如何检查对于给定t,是否能用m元买到t颗糖果。

检查函数:给定t,我们需要选择每种糖果购买的数量k_i,使得∑k_i = t,且总成本∑cost_i(k_i) ≤ m。

现在,问题是如何分配t颗糖果到n种糖果上,使得总成本最小。

对于每种糖果,成本函数cost_i(k)是关于k的线性函数?实际上,它是分段线性的。对于每个k,成本是线性的,但斜率在变化。

考虑cost_i(k)的增量:从k到k+1,额外成本是x_i如果k是偶数(因为第k+1颗是奇数颗?注意k表示已经买了k颗,那么第k+1颗的价格取决于k+1的奇偶性。如果k是偶数,那么第k+1颗是奇数颗,价格x_i;如果k是奇数,那么第k+1颗是偶数颗,价格y_i。所以边际成本是:当k为偶数时,增加一颗的成本是x_i;当k为奇数时,增加一颗的成本是y_i。

所以成本函数是:对于第i种糖果,买k颗的总成本是:如果k=0,成本0;k=1,成本x_i;k=2,成本x_i+y_i;k=3,成本2x_i+y_i;k=4,成本2x_i+2*y_i;等等。

现在,为了最小化总成本对于固定t,我们应该优先选择边际成本低的糖果。但边际成本取决于当前已经买了多少颗该种糖果。

实际上,对于每种糖果,我们可以考虑其“平均成本”或更精确地,考虑其购买顺序。

一个常见思路是:由于每种糖果的购买成本是交替的,我们可以考虑将每种糖果的购买过程分解为“一对”糖果:每两颗糖果的成本是x_i + y_i。但如果不买偶数颗,则可能有一颗单独的。

所以,对于每种糖果,如果我们买偶数颗,比如2a颗,那么总成本是a(x_i+y_i)。如果我们买奇数颗,比如2a+1颗,那么总成本是a(x_i+y_i) + x_i。

所以,成本可以写为: cost_i(k) = floor(k/2) (x_i + y_i) + (k mod 2) x_i

但注意,当k为偶数时,k mod 2=0,所以成本为 (k/2)(x_i+y_i);当k为奇数时,成本为 (k//2)(x_i+y_i) + x_i。

现在,在分配t颗糖果时,我们需要决定每种糖果买多少颗。

为了最小化总成本,我们应该优先选择那些在额外一颗糖果时成本更低的糖果。

但额外一颗的成本取决于当前该种糖果已买的数量。

考虑一种策略:我们假设所有糖果都从0开始购买,然后我们决定购买顺序:每次购买一颗糖果,选择当前购买成本最低的那种糖果。

由于每种糖果的边际成本是交替的:对于第i种糖果,第一次买成本x_i,第二次买成本y_i,第三次x_i,第四次y_i,等等。

所以,整体上,我们可以将每种糖果的购买序列视为一个序列:x_i, y_i, x_i, y_i, ...

那么,总成本最小化问题就相当于:我们有多个序列,每个序列有无限个元素,每个序列的元素是交替的x_i和y_i。我们想从这些序列中选择t个元素(每个序列最多选一个元素一次?但序列是无限的,我们可以从同一序列选多个元素,但顺序是固定的:首先选x_i,然后y_i,然后x_i,等等。所以,实际上,我们可以考虑所有可能的“购买事件”,每个事件对应从某种糖果购买下一颗的成本。

但t可能很大,我们无法枚举所有事件。

另一种方法:注意,对于每种糖果,其边际成本序列是周期性的:x_i, y_i, x_i, y_i, ... 所以,平均成本是 (x_i+y_i)/2 每颗?但不对,因为如果只买一颗,成本是x_i,不是平均。

为了最小化总成本,我们应该尽可能多地选择边际成本低的购买。

但边际成本取决于购买顺序。

我们可以考虑将购买分为两个阶段:首先,对于每种糖果,第一次购买成本是x_i,之后每次购买成本是y_i?但不对,因为第三次购买又是x_i。

实际上,对于每种糖果,除了第一颗之外,其他颗的成本是y_i和x_i交替,但第一颗是x_i。

但注意,从成本序列看,第一颗是x_i,第二颗是y_i,第三颗是x_i,第四颗是y_i,所以 after the first, the cost alternates between y_i and x_i? 不,是x_i, y_i, x_i, y_i,... 所以奇数颗是x_i,偶数颗是y_i。

所以,当我们购买一颗新的糖果时,如果这种糖果已经买了偶数颗,那么下一颗成本是x_i;如果已经买了奇数颗,那么下一颗成本是y_i。

所以,在分配购买时,我们需要考虑每种糖果的当前购买次数。

但为了全局最小化,我们可以考虑所有可能的“下一颗”成本。

一个高效的方法是:我们考虑一个“基础”成本,然后调整。

注意,如果我们强制所有糖果都买偶数颗,那么总成本是 sum_{i} [ (k_i/2) * (x_i+y_i) ],但k_i是偶数。

但通常,我们可能买奇数颗。

让我们定义对于每种糖果,其“每对”成本是 p_i = x_i + y_i,然后单独一颗的成本是 x_i。

但当我们买多颗时,对于一种糖果,如果我们买2a颗,成本是a p_i。如果我们买2a+1颗,成本是a p_i + x_i。

所以,在总糖果数t的情况下,设总成本为C。假设我们决定每种糖果买k_i颗,且∑k_i = t。

那么总成本 C = ∑ [ floor(k_i/2) p_i + (k_i mod 2) x_i ]

现在,为了最小化C,我们可以先假设所有糖果都买偶数颗,但那样总糖果数也是偶数。如果t是奇数,我们需要有一个糖果买奇数颗。

实际上,我们可以考虑将t表示为2A + B,其中B是0或1,表示是否有奇数颗。那么对于每种糖果,我们分配2a_i + b_i颗,其中∑2a_i + ∑b_i = 2A+B,所以∑a_i = A, 且∑b_i = B。

那么总成本 C = ∑ [ a_i p_i + b_i x_i ]

因为对于每种糖果,如果b_i=1,则我们买了奇数颗,成本包括a_i p_i + x_i;如果b_i=0,则成本为a_i p_i。

所以,现在问题转化为:我们需要选择非负整数a_i和b_i(每个b_i是0或1),满足∑a_i = A 且 ∑b_i = B,然后最小化 ∑ a_i p_i + ∑ b_i x_i。

注意,这里a_i和b_i是相关的吗?实际上,对于每种糖果,a_i表示购买了多少“对”,b_i表示是否多买一颗。而且a_i可以是任意非负整数,b_i是0或1。

但注意,在分配时,a_i和b_i是独立的吗?不,因为对于一种糖果,如果我们设定b_i=1,那么它贡献x_i;如果我们设定b_i=0,那么它不贡献x_i。但a_i的分配则影响p_i的和。

所以,最小化总成本的问题可以分解为两个部分:

选择哪些糖果有b_i=1(即买奇数颗),共B个糖果被选为b_i=1。

分配A个“对”到各种糖果上。

对于部分2,为了最小化∑a_i p_i,由于p_i是固定的,我们应该优先将“对”分配给p_i小的糖果。因为∑a_i = A,最小化∑a_i p_i,相当于按p_i从小到大排序,然后选择前A个最小的p_i?不,因为a_i可以大于1,实际上,我们可以分配多个“对”给同一种糖果。所以,为了最小化总成本,我们应该将所有的“对”都分配给p_i最小的那种糖果?不对,因为如果一种糖果的p_i很小,我们可能想多分配一些对给它,但注意a_i没有上限,所以确实,为了最小化∑a_i p_i,我们应该将所有A个对都分配给p_i最小的那种糖果?但这样对吗?

考虑两种糖果,p1=1, p2=2。如果A=2,如果都分配给p1,成本为21=2;如果分配一个对给p1一个对给p2,成本为1+2=3;所以确实都分配给p1更小。所以是的,为了最小化∑a_i p_i,我们应该将所有A个对都分配给p_i最小的那种糖果?但等等,这真的正确吗?因为如果我们分配多个对给同一种糖果,成本是a_i p_i,所以如果p_i小,那么a_i大成本就小。所以确实,我们应该选择p_i最小的糖果,然后把所有A个对都分配给它?但这样可能不是最优的,因为当我们分配对时,我们忽略了b_i部分?不,在部分2中,a_i和b_i是独立的,因为b_i的选择不影响a_i的分配成本。

在总成本中,部分2只依赖于a_i和p_i,所以为了最小化∑a_i p_i,由于p_i是常数,且a_i求和为A,那么最小化∑a_i p_i确实是通过将所有的A集中到p_i最小的糖果上 achieved。因为如果分配一些对给p_i大的糖果,那么成本会增加。

所以,对于给定的A和B,最小总成本是: min over choice of S where S is a set of B candies with b_i=1, of [ A minp + sum{i in S} x_i ]? 其中min_p是min over i of p_i? 但等等,不一定。因为当我们分配a_i时,我们选择p_i最小的糖果分配所有A个对,所以成本是A min_p。然后对于b_i,我们选择B个糖果,使得sum of x_i最小?因为我们要最小化∑b_i x_i,所以我们应该选择x_i最小的B个糖果。

但注意,在分配b_i时,我们选择的B个糖果,与分配a_i的糖果是独立的吗?是的,因为a_i分配只影响p_i部分,而b_i影响x_i部分。所以,对于固定的A和B,最小总成本是: A * min_p + minS { sum{i in S} x_i } where S is a set of B candies.

但minS { sum{i in S} x_i } 就是选择最小的B个x_i的和。

所以,如果我们定义 let P_min = min_i p_i, 且 let X_sorted 是x_i排序后的数组,那么对于B=0, cost = A P_min; 对于B=1, cost = A P_min + X_sorted[0]; 对于B=1? B是0或1,因为t=2A+B。

但等等,这里有一个问题:在分配a_i时,我们假设所有A个对都分配给p_i最小的糖果,但这种糖果可能也被选为b_i=1吗?是的,这允许。因为对于一种糖果,我们可以同时有a_i和b_i,即我们买2a_i+1颗,成本为a_i p_i + x_i。所以如果我们将所有A个对分配给一种糖果,同时这种糖果也被选为b_i=1,那么成本是A p_i + x_i,但如果我们选择另一种糖果为b_i=1,成本是A * p_i + x_j,其中x_j可能更小。所以是的,在计算b_i部分时,我们独立地选择x_i最小的B个糖果。

但注意,当我们选择b_i=1时,我们并不影响a_i的分配,因为a_i分配只考虑p_i,而不考虑x_i。

所以,对于给定的t=2A+B,最小总成本是 C_min = A * P_min + S_B, where S_B is the sum of the smallest B values of x_i.

但这是真的吗?让我们验证 with a simple example.

假设有两种糖果,糖果1: x1=3, y1=1, p1=4; 糖果2: x2=1, y2=2, p2=3. 所以 P_min = min(4,3)=3.

现在,假设 t=3, so A=1, B=1.

根据公式,C_min = 1 * 3 + min(x_i) = 3 + 1 = 4.

但实际如何购买?如果我们买糖果2两颗和糖果1一颗?成本:糖果2: 2颗成本 x2+y2=1+2=3? 但 wait, 对于糖果2买2颗,成本是1+2=3;对于糖果1买1颗,成本是3;总成本6?不,我们想最小化成本。

实际上,为了得到3颗糖果,我们可以买糖果2三颗?但糖果2三颗成本:x2+y2+x2=1+2+1=4?或者买糖果1两颗和糖果2一颗:糖果1两颗成本3+1=4,糖果2一颗成本1,总成本5?或者买糖果1一颗和糖果2两颗:糖果1一颗成本3,糖果2两颗成本1+2=3,总成本6?或者买糖果2三颗成本4?所以最小成本是4,通过买糖果2三颗。所以确实成本是4,符合公式。

在公式中,我们选择所有A个对分配给p_min的糖果,这里p_min=3是糖果2,所以A=1个对分配给糖果2,成本1*3=3,然后B=1,我们选择x_i最小的糖果,这里x_i最小是糖果2的x2=1,但糖果2已经被分配了对,现在再加一颗,成本加x2=1,总成本4。但注意,当我们分配对给糖果2时,我们已经买了2颗,然后再加一颗,成本是x2?但等等,当我们买第三颗时,成本是x2吗?对于糖果2,已经买了2颗(偶数颗),所以下一颗是奇数颗,成本x2=1,是的。所以正确。

但如果我们选择糖果1为b_i=1,成本x1=3,总成本3+3=6,更大。所以公式正确。

另一个例子:假设有两种糖果,糖果1: x1=1, y1=100, p1=101; 糖果2: x2=100, y2=1, p2=101. 所以 P_min=101. 现在 t=3, A=1,B=1. 根据公式,C_min=1*101 + min(x_i)=101+1=102.

实际购买:我们可以买糖果1三颗?成本:x1,y1,x1=1+100+1=102?或者买糖果2三颗:100+1+100=201?或者混合:买糖果1两颗和糖果2一颗:成本 (1+100) + 100 = 201?或者买糖果1一颗和糖果2两颗:1 + (100+1)=102?所以最小成本102,符合。

所以公式似乎正确。

但等等,在公式中,我们假设所有A个对都分配给P_min的糖果,但在这个例子中,P_min是101,两种糖果都有p_i=101,所以我们可以选择任意一种分配对,然后选择x_i最小的为b_i=1,这里x1=1最小,所以分配对给糖果1和b_i给糖果1?但这样糖果1就有2A+1=3颗,成本为Ap1 + x1=1101+1=102。或者分配对给糖果2和b_i给糖果1,那么糖果1只有1颗成本x1=1,糖果2有2颗成本p2=101,总成本102?一样。所以没问题。

所以,对于任何t,最小总成本是 C_min(t) = floor(t/2) P_min + (t mod 2) min_x? 其中min_x是min_i x_i?

但等等,在公式中,我们有 C_min = A * P_min + S_B, 其中S_B是B个最小x_i的和。但B只能是0或1,所以S_B=0 if B=0, or min_x if B=1.

所以 C_min(t) = floor(t/2) P_min + (t mod 2) min_x

但这是真的吗?在之前的例子中,它 worked。

但考虑另一个例子:假设有三种糖果,糖果1: x1=10, y1=1, p1=11; 糖果2: x2=1, y2=1, p2=2; 糖果3: x3=1, y3=1, p3=2. P_min=2, min_x=1.

现在 t=4, A=2, B=0. 根据公式 C_min=2*2=4.

实际购买:我们可以买糖果2和糖果3各两颗?成本:糖果2: x2+y2=1+1=2; 糖果3: x3+y3=1+1=2; 总成本4。或者买糖果1四颗?成本:2(x1+y1)=211=22?所以最小成本4,符合。

现在 t=3, A=1,B=1. C_min=1*2 +1=3. 实际:买糖果2两颗和糖果3一颗?成本:糖果2两颗成本2,糖果3一颗成本x3=1,总成本3。符合。

现在 t=5, A=2,B=1. C_min=2*2 +1=5. 实际:买糖果2两颗、糖果3两颗、糖果2再加一颗?但糖果2已经两颗,再加一颗成本y2=1?但等等,当我们买第五颗时,如果买糖果2的第三颗,成本是x2=1?因为第二颗之后是第三颗,成本x2=1?所以成本为:糖果2两颗成本2,糖果3两颗成本2,然后糖果2第三颗成本x2=1,总成本5?符合。

但注意,在公式中,当我们分配b_i时,我们选择x_i最小的糖果,但这里糖果2和糖果3的x_i都是1,所以任意选一个都可以。

所以公式似乎正确。

但等等,有一个潜在问题:在分配a_i时,我们假设所有A个对都分配给P_min的糖果,但P_min的糖果可能有多颗?是的,但没关系,因为如果多种糖果有相同的P_min,我们可以任意分配,但既然成本相同,分配到哪里都一样。

但更关键的是:在b_i部分,我们选择x_i最小的B个糖果,但这些糖果可能和分配a_i的糖果相同吗?是的,而且这没有问题,因为对于一种糖果,如果我们分配了a_i个对和b_i=1,那么总成本是a_i * p_i + x_i,这正好是购买2a_i+1颗的成本。

所以,公式 C_min(t) = floor(t/2) P_min + (t mod 2) min_x 似乎给出了购买t颗糖果的最小总成本。

但这是真的吗?让我们考虑一个反例。

假设有两种糖果,糖果1: x1=100, y1=1, p1=101; 糖果2: x2=1, y2=100, p2=101. P_min=101, min_x=1.

现在 t=2, A=1,B=0. C_min=1*101=101.

但实际购买2颗糖果的最小成本是多少?我们可以买糖果1一颗和糖果2一颗:成本100+1=101?或者买糖果2两颗:成本1+100=101?或者买糖果1两颗:成本100+1=101?所以都是101,符合。

现在 t=3, C_min=1*101+1=102. 实际:买糖果2三颗?成本1+100+1=102?或者买糖果1一颗和糖果2两颗:100 + (1+100)=201?或者买糖果1两颗和糖果2一颗:(100+1) + 1=102?所以最小102,符合。

现在,考虑如果有一种糖果的p_i不是最小,但它的x_i很小,而且我们买奇数颗时,是否可能通过分配对给其他糖果来节省?但根据公式,我们总是分配对给P_min的糖果,然后b_i给min_x的糖果。在以上例子中,它 work。

但考虑另一种情况:假设糖果1: x1=10, y1=1, p1=11; 糖果2: x2=1, y2=10, p2=11; 糖果3: x3=1, y3=1, p3=2. 所以 P_min=2, min_x=1.

现在 t=4, A=2,B=0. C_min=22=4. 实际:买糖果3四颗?成本:2(x3+y3)=2*2=4?符合。

现在 t=3, C_min=12+1=3. 实际:买糖果3三颗?成本:1p3 + x3 = 2+1=3?符合。

现在,假设我们想买t=1颗,成本min_x=1,符合。

所以似乎正确。

但等等,在公式中,我们假设所有对都分配给P_min的糖果,但在这个例子中,糖果3的p_min=2,但如果我们买糖果3的对,成本低。但当我们买奇数颗时,我们选择min_x的糖果,这里糖果2和糖果3的x_i都是1,所以没问题。

但考虑如果min_x的糖果不是P_min的糖果,但当我们分配b_i时,我们选择min_x的糖果,然后分配对给P_min的糖果,这可能导致一种情况:我们实际上从两种不同的糖果购买,但成本计算正确。

所以,我认为这个公式是正确的。

因此,对于任何t,最小总成本是 C_min(t) = floor(t/2) P_min + (t mod 2) min_x

其中 P_min = min_i (x_i + y_i), min_x = min_i x_i

那么,问题就转化为:找到最大的t,使得 C_min(t) <= m.

所以,我们可以直接计算t的最大值。

但等等,让我们用样例验证一下。

样例1: n=2, m=10, 糖果1: x=4,y=1; 糖果2: x=3,y=3.

那么 P_min = min(4+1, 3+3) = min(5,6)=5

min_x = min(4,3)=3

那么 C_min(t) = floor(t/2)5 + (t mod 2)3

我们找t使得 C_min(t)<=10.

t=0: cost=0

t=1: cost=3

t=2: cost=5

t=3: cost=5+3=8

t=4: cost=2*5=10

t=5: cost=2*5+3=13>10

所以最大t=4,符合输出。

样例2: n=3, m=15, 糖果1: x=1,y=7; 糖果2: x=2,y=3; 糖果3: x=3,y=1.

计算 P_min = min(1+7, 2+3, 3+1) = min(8,5,4)=4

min_x = min(1,2,3)=1

C_min(t) = floor(t/2)4 + (t mod 2)1

找t使得 C_min(t)<=15.

t=0:0

t=1:1

t=2:4

t=3:4+1=5

t=4:8

t=5:8+1=9

t=6:12

t=7:12+1=13

t=8:16>15? 16>15, so t=7? 但样例输出是8。

问题!样例2输出是8,但根据公式t=8时成本是16>15,所以不应该达到8。

哪里出错了?

检查样例2解释:小 R 可以购买 1 颗第一种糖果、1 颗第二种糖果与 6 颗第三种糖果,共花费 1 + 2 + 12 = 15 元。

1颗第一种糖果成本1元,1颗第二种糖果成本2元,6颗第三种糖果成本多少?第三种糖果: x3=3,y3=1, 买6颗: 三颗x和三颗y? 成本: 3x3 + 3y3 = 33 + 31 = 9+3=12? 总成本1+2+12=15,糖果数1+1+6=8。

所以确实买了8颗成本15。

但根据我的公式,对于t=8,成本是 floor(8/2)4 + 0? because even? 但8是偶数,所以成本44=16>15,所以公式认为最小成本是16,但实际有更小成本15。

为什么?

在我的公式中,我假设所有对都分配给P_min的糖果,但这里P_min=4是糖果3,但糖果3的p3=4,但如果我们分配对给糖果3,成本是4 per two candies, but when we buy multiple from candy3, the cost for two is indeed 4, but when we buy from other candies, the cost for two may be higher, but in this case, we are not buying all from candy3.

在实际购买中,我们买了6颗糖果3,成本12,即每两颗成本4,但我们也买了其他糖果,其中第一种糖果买1颗成本1,第二种买1颗成本2,这些成本没有体现在公式中?在公式中,当分配对时,我们只使用P_min,但这里我们使用了多种糖果,而且这些糖果的p_i可能大于P_min,但当我们买奇数颗时,我们使用了x_i,但x_i可能大于min_x?在公式中,我们假设b_i部分使用min_x,但实际我们可能使用其他x_i,但为什么成本更低?

在公式中,对于t=8,A=4, B=0, 所以成本应为4 P_min = 44=16。但实际成本是15,为什么?

因为在实际中,我们并没有将所有4个对分配给P_min的糖果。我们分配了3个对给糖果3(因为6颗),然后对于其他糖果,我们买了奇数颗,但奇数颗的成本是x_i,而不是作为对的一部分。

在公式中,我假设所有对都分配给P_min的糖果,但这里我们对糖果3分配了3个对,成本3*4=12,然后对于糖果1和糖果2,我们各买了一颗,成本x1+x2=1+2=3,总成本15。但在公式中,当B=0时,我们不应该有任何奇数颗,但这里我们有两个奇数颗,但t=8是偶数,所以理论上B应该为0,但这里我们有两个奇数颗?矛盾。

问题在于:在推导中,我假设我们分配a_i和b_i such that ∑2a_i + ∑b_i = t, and then cost = ∑a_i p_i + ∑b_i x_i. 但在这个分配中,对于糖果1和糖果2,我们买了1颗,所以 b_i=1 for both, but then ∑b_i=2, but t=8, so ∑2a_i + ∑b_i = 2*3 + 2 = 8, so A=∑a_i=3, B=∑b_i=2. 所以实际上,对于t=8,我们有A=3, B=2? 但 earlier I assumed that for t=8, B=0? no, because t=2A+B, so if B=2, then 2A+2=8, so A=3.

所以我的初始假设错误了:当t是偶数时,B不一定为0?因为B=∑b_i,而t=2∑a_i + ∑b_i,所以如果t是偶数,∑b_i must be even? 不,因为2∑a_i是偶数,所以t和∑b_i同奇偶,所以如果t是偶数,∑b_i是偶数;如果t是奇数,∑b_i是奇数。所以B=∑b_i可以是大于1的偶数或奇数。

在公式中,我错误地假设了B只能是0或1,但实际上B可以是0到n之间的任何整数,但受限于∑b_i = B且B与t同奇偶。

在成本函数中,我们有 C = ∑a_i p_i + ∑b_i x_i, with constraints ∑a_i = A, ∑b_i = B, and t=2A+B.

为了最小化C,我们需要选择哪些糖果设置b_i=1,以及如何分配a_i。

现在,最小化 ∑a_i p_i 仍然是通过将所有的A集中到p_i最小的糖果上吗?是的,因为p_i是常数,所以为了最小化∑a_i p_i,我们应该将所有的A分配给p_i最小的糖果。

对于∑b_i x_i,为了最小化,我们应该选择B个最小的x_i。

所以,最小成本 C_min = A * P_min + S_B, where S_B is the sum of the B smallest x_i.

但这里A和B满足2A+B=t,所以对于固定的t,A和B是相关的:B = t - 2A, and A可以是整数从0到 floor(t/2)?但注意,B不能超过n,因为只有n种糖果,每个b_i最多为1?不,b_i表示一种糖果是否买了奇数颗,但对于一种糖果,如果我们买了奇数颗,b_i=1,但如果我们买了更多,比如3颗,那么b_i仍然是1吗?在成本表达式中,对于一种糖果,如果我们买了k颗,成本是 floor(k/2) p_i + (k mod 2) x_i。所以无论k多大,b_i只取决于k mod 2:如果k是奇数,b_i=1;如果k是偶数,b_i=0。所以对于每种糖果,b_i只能是0或1。

所以,在分配中,b_i是0或1,且∑b_i = B,其中B是t mod 2? 不,因为t=2A+B,且B=∑b_i,所以B必须介于0和n之间,而且B与t同奇偶?不,B是∑b_i,每个b_i是0或1,所以B可以是0到n之间的任何整数,但t=2A+B,所以对于给定的t,B必须满足 B <= n 且 B <= t 且 B ≡ t (mod 2)。

因为2A = t-B, so t-B must be non-negative and even, so B must have the same parity as t, and B<=t and B<=n.

所以,对于给定的t,最小成本是 C_min(t) = min over B { A * P_min + S_B } where A = (t-B)/2, and B must be between 0 and min(n,t) and B ≡ t mod 2.

其中S_B是x_i中最小的B个的和。

所以,我们需要找到最大的t,使得存在B满足0<=B<=min(n,t), B≡t mod 2, and (t-B)/2 * P_min + S_B <= m.

现在,如何计算这个?由于t可能很大,我们需要高效的方法。

注意,对于固定的t,B必须与t同奇偶,且B<=min(n,t)。由于n最多10^5,而t可能很大,所以当t>n时,B最多为n,且B与t同奇偶。

所以,我们可以考虑两种情况:t <= n and t > n.

但或许我们可以二分搜索t。

现在,问题是如何计算对于给定t, C_min(t) 的最小值 over B.

即 Cmin(t) = min{B} { floor((t-B)/2) * P_min + S_B } for B in [0, min(n,t)] and B ≡ t mod 2.

由于S_B是B的函数,且S_B是x_i排序后的前缀和,我们可以预处理S_B for B=0 to n.

设X是x_i的列表,排序后,令前缀和数组pre[B] = sum of first B x_i.

那么对于给定t,我们需要找到B满足0<=B<=min(n,t) and B≡t mod 2, such that (t-B)/2 * P_min + pre[B] is minimized.

实际上,对于固定t,我们想要知道 min_{B} [ (t-B)/2 * P_min + pre[B] ] 是否 <= m.

但注意,(t-B)/2 必须是整数,所以当t和B同奇偶时,(t-B)/2是整数。

所以,我们可以计算这个最小值。

由于B的范围是0到min(n,t),且对于t>n,B最多n,所以B的范围最多n,而n=10^5,所以对于每个t,我们可以枚举所有可能的B吗?但t可能很大,我们在二分搜索t时,需要检查多个t,但二分搜索只需要60次迭代,每次迭代我们需要计算min over B,但B最多10^5,所以60 * 10^5 = 6e6,这是可接受的。

但注意,对于每个t,我们需要计算 min over B in [0, min(n,t)] with B ≡ t mod 2, of [ (t-B)/2 * P_min + pre[B] ].

由于pre[B]已经预处理,我们可以计算。

但B的范围是0到min(n,t),当t很大时,min(n,t)=n,所以B从0到n,但只有两种奇偶性:对于固定t,我们只考虑B与t同奇偶,所以实际上我们只需要考虑B=0,2,4,... or B=1,3,5,... up to n.

所以,对于每个t,我们只需要检查O(n)个B,但n=10^5,每次检查60次 * 10^5 = 6e6,这应该可行。

但我们可以优化吗?对于固定t,令 f(B) = (t-B)/2 P_min + pre[B] = (t P_min)/2 - (B P_min)/2 + pre[B] = constant + pre[B] - (P_min / 2) B

所以 f(B) = pre[B] - (P_min / 2) * B + constant.

其中 constant = (t * P_min)/2.

所以最小化 f(B) 等价于最小化 pre[B] - (P_min / 2) * B over B in [0, min(n,t)] with B ≡ t mod 2.

由于 pre[B] - (P_min / 2) * B 是B的函数,而且B是离散的,我们可以预先计算这个函数对于所有B的值,然后对于每个奇偶性,我们记录最小值。但因为t的奇偶性变化,我们需要分别处理偶数和奇数B。

令 g(B) = pre[B] - (P_min / 2) * B

那么对于给定t,我们需要 min_{B in [0, min(n,t)] and B ≡ t mod 2} g(B) + (t * P_min)/2

由于 (t * P_min)/2 是常数,我们只需要检查 g(B) 对于B与t同奇偶的最小值。

我们可以预处理两个数组:min_even和min_odd,对于B从0到n,记录g(B)对于偶数B的最小值,和对于奇数B的最小值。

但注意,当B变化时,min_even[B]表示对于B=0,2,4,...的g(B)的最小值,类似min_odd[B]对于B=1,3,5,...但这里我们需要直到B的上限是min(n,t),但当t>n时,B上限是n,所以我们可以预处理对于B=0 to n的g(B),然后对于每个奇偶性,计算前缀最小值。

具体地,我们计算:

对于偶数B: let M_even[i] = min{ g(B) for B=0,2,4,...,i } 对于i偶数。

类似对于奇数B: M_odd[i] = min{ g(B) for B=1,3,5,...,i } 对于i奇数。

然后对于给定t,令 B_max = min(n,t)。然后如果t是偶数,我们取 M_even[B_max] 但B_max可能不是偶数,所以我们需要取不超过B_max的最大偶数,然后取M_even[那个值]?不,因为我们的M_even数组是对于每个偶数点存储了直到该点的最小值,所以如果我们有M_even数组索引为偶数点,我们可以找到不超过B_max的最大偶数点,然后取该点的M_even值。类似对于奇数。

但实际上,由于我们预处理了所有B从0到n的g(B),我们可以直接计算对于每个奇偶性,从0到B_max的最小值。

在二分搜索t时,对于每个t,我们计算Bmax = min(n,t),然后如果t是偶数,我们取 min{ even B in [0, Bmax] } g(B) ; 如果t是奇数,取 min{ odd B in [0, B_max] } g(B)。

然后检查 min_value + (t * P_min)/2 <= m.

但注意,这里 (t P_min)/2 可能是非整数?但因为在表达式中 (t-B)/2 P_min,当t-B是偶数时,这是整数,所以整个成本是整数?因为pre[B]是整数,P_min是整数,所以成本是整数。所以在我们计算中,我们应使用整数运算。

在g(B)中,有 (P_min / 2) * B,如果P_min是奇数,则这可能不是整数?但成本应该是整数,所以我们需要确保计算时不会引入浮点数误差。

回顾成本表达式: (t-B)/2 * P_min + pre[B]

由于 (t-B)是偶数,所以 (t-B)/2是整数,因此乘以整数P_min是整数,加上整数pre[B],所以成本是整数。所以在我们计算g(B)时, pre[B] - (P_min / 2) B 可能不是整数?但实际上,在成本中,我们并没有直接使用g(B),而是使用 f(B) = (t-B)/2 P_min + pre[B] = (t P_min)/2 - (B P_min)/2 + pre[B]

这里 (t P_min)/2 可能不是整数如果tP_min是奇数?但注意,t-B是偶数,所以t和B同奇偶,所以tP_min和BP_min同奇偶?不一定,因为P_min可能是奇数或偶数。

但成本是整数,所以 f(B) 是整数。所以 (t P_min)/2 - (B P_min)/2 应该是整数,这意味着 (t-B)*P_min/2 是整数,因为(t-B)是偶数,所以成立。

在计算时,我们可以避免浮点数 by storing everything as integers.

在计算 g(B) = pre[B] - (B * P_min) / 2 时,但这里除以2可能产生分数。但既然成本是整数,我们可以在整个表达式中避免除以2吗?

注意 f(B) = [ (t-B) P_min + 2 pre[B] ] / 2 ? 不,不是这样。

实际上,f(B) = (t-B)/2 * P_min + pre[B]

由于 (t-B)是偶数,令 D = (t-B)/2, 则 f(B) = D * P_min + pre[B]

所以当我们计算时,我们可以保持整数计算。

对于固定t,我们计算 min over B of [ D * P_min + pre[B] ] where D = (t-B)/2.

由于D是整数,且B=t-2D, so D从0到 floor(t/2) but also B<=n, so D >= ceil( (t-n)/2 ) because B=t-2D <= n, so 2D >= t-n, so D >= ceil( (t-n)/2 ). Also D必须使得B>=0, so D<= floor(t/2).

所以另一种方式: f(D) = D * P_min + pre[t-2D] , where D is integer from D_min to D_max, where D_min = max(0, ceil( (t-n)/2 ) ), D_max = floor(t/2).

然后我们需要 min over D of f(D) <= m.

现在 D的范围是多少?当t很大时,D从 ceil( (t-n)/2 ) to floor(t/2), so the number of D is about n/2, which is 5e4, so for each t, we need to check over 5e4 values of D? But 60 * 5e4 = 3e6, which is acceptable.

But note that pre[B] is defined for B from 0 to n, so when t-2D is between 0 and n, so for D in [ceil((t-n)/2), floor(t/2)] and also t-2D <= n, which is already satisfied by D>=ceil((t-n)/2).

So, for each t, we can iterate over D from D_min to D_max, and compute f(D) = D * P_min + pre[t-2D], and find the minimum f(D), and check if it <= m.

But we need to compute pre[B] for B from 0 to n, which we can precompute.

Now, how to compute D_min and D_max for given t?

D_min = ceil( (t-n)/2 ) = ceil( (t-n) / 2 )

But if t-n < 0, then D_min = 0.

D_max = floor(t/2)

So, in code, for a given t, we can:

D_min = max(0, (t-n+1)//2) ? because ceil(a) = (a+1)//2 if a is integer? But let me check: ceil((t-n)/2) if t-n is even, then (t-n)/2 is integer; if t-n is odd, then ceil((t-n)/2) = (t-n+1)/2.

So in integer code, we can compute: D_min = 0 if t <= n, else (t-n+1) // 2? But if t-n is even, say t-n=2k, then ceil(2k/2)=k, and (2k+1)//2 = k? actually in integer division in Python, (a+1)//2 gives ceil(a/2) for non-negative a.

So yes, D_min = 0 if t <= n, else (t-n+1) // 2.

But wait, if t-n is even, say t-n=2k, then (t-n+1)//2 = (2k+1)//2 = k, which is correct because ceil(2k/2)=k.

If t-n is odd, say t-n=2k+1, then ceil((2k+1)/2)=k+1, and (2k+1+1)//2 = (2k+2)//2 = k+1, correct.

So D_min = (t - n + 1) // 2 if t>n, else 0.

But note: if t-n is negative, then (t-n+1)//2 might be negative? But we set to 0 if t<=n.

So code: D_min = 0 if t <= n else (t-n+1)//2

D_max = t//2

Now, we need to iterate D from D_min to D_max, and compute B = t - 2D, and then cost = D P_min + pre[B], and take the minimum cost.

But note: B must be between 0 and n, which it is because when D_min is set, B = t-2D <= n, and when D_max, B=0 if t even, or 1 if t odd? Actually, when D= floor(t/2), B = t - 2floor(t/2) = t mod 2, which is 0 or 1, so B>=0.

So this is correct.

Now, we need to find the maximum t such that min_{D} [ D * P_min + pre[t-2D] ] <= m.

t can be as large as m / min_value, but m up to 10^18, so t might be very large, but we are iterating over D for each t, and the number of D for each t is at most n/2, which is 5e4, and we only do 60 iterations in binary search, so total 3e6, which is acceptable.

But we need to be careful about the range of t in binary search.

What is the maximum possible t? Since we can buy candy at cost at least min_x and min_p/2, so the maximum t is at most m / min_cost_per_candy, but min_cost_per_candy is at least min(min_x, P_min/2)? Actually, the average cost per candy can be as low as min(P_min/2, min_x) but since we can mix, the overall average cost can be around min(P_min/2, min_x). So let cost_per_candy_min = min( min_x, P_min/2 ). Then t_max <= m / cost_per_candy_min. Since min_x and P_min are at least 1, cost_per_candy_min至少是0.5,所以t_max最多2e18,但二分搜索t时,我们只需要从0到一个上界,上界可以设为m / min_min + n? 但更简单的是,我们可以设上界为m 2?因为成本至少是0.5 per candy, so t can be up to 2m, so we can set high = m 2 + n? But m can be 10^18, so 2m is 2e18, which is too large for integer in Python? But in Python, integers can be arbitrarily large, so it's okay for comparison, but when we compute D_min and D_max for t=2e18, we need to compute (t-n+1)//2, which is feasible in Python since integers are handled.

But in practice, when t is very large, the number of D we iterate over is only n/2, which is 5e4, so it's efficient.

So, algorithm:

Read n, m.

Read list of (x_i, y_i) for i in range(n).

Precompute P_min = min(x_i + y_i for all i)

Precompute list X of all x_i, sort X, and compute prefix sum pre[0..n] where pre[0]=0, pre[i] = pre[i-1] + X[i-1] for i from 1 to n.

Now, we want to find the maximum t such that there exists D in [D_min, D_max] with D * P_min + pre[t-2D] <= m.

But note: for a given t, we compute mincost(t) = min{D from D_min to D_max} [ D * P_min + pre[B] ] where B=t-2D.

Use binary search on t from 0 to high, where high can be set to m * 2 + 100? But to be safe, since the cost per candy is at least min(min_x, P_min/2), and min_x>=1, P_min>=2, so cost per candy至少是1? 不一定,因为如果min_x=1, P_min=2, then cost per candy can be 1 for the first candy, but for large t, the average cost is P_min/2=1, so indeed the cost per candy至少是1? 但有可能min_x=1, P_min=1? 但x_i和y_i至少1,所以P_min至少2?因为x_i>=1, y_i>=1, so P_min>=2. 所以成本每颗至少1?对于一颗糖果,成本x_i>=1,对于两颗,成本P_min>=2,所以每颗平均至少1。所以t最大不超过m。所以我们可以设high = m + n? 但m可能10^18,所以high=m+105? 但m+105几乎等于m,但t可能大于m?不,因为每颗成本至少1,所以t<=m。所以实际上t<=m。所以high = m.

但等等,有可能通过购买多种糖果,使得平均成本低于1?不,因为每颗成本至少1,所以总成本至少t,所以t<=m。所以high=m。

但 in practice, when we compute for t=m, the cost might be larger than m, but t cannot exceed m. So we can set high = m.

But note: for large n, we might have t up to m, but when m=10^18, we cannot iterate over t from 0 to m, so binary search is necessary.

Now, in binary search, we need to check for t whether min_cost(t) <= m.

But when t is large, say t=10^18, then D_min = (t-n+1)//2 which is about 5e17, and D_max = t//2 = 5e17, so the range of D is from 5e17 to 5e17? Wait, no: when t>n, D_min = (t-n+1)//2, D_max = t//2, so the number of D is (D_max - D_min + 1) = (t//2 - (t-n+1)//2 + 1). Let me compute:

Let t be large, n fixed.

D_max = t//2

D_min = (t-n+1)//2

The number of D = D_max - D_min + 1 = t//2 - (t-n+1)//2 + 1.

Now, if t is even, t=2k, then D_max=k, D_min = (2k-n+1)//2 = k - ceil(n/2) + something? Let me compute:

(2k-n+1)//2 = k - floor(n/2) ? because (2k-n+1)/2 = k - (n-1)/2, so ceil? Actually, in integer division, (2k-n+1)//2 = k - (n-1)//2? Not exactly.

Example: t=100, n=10, then D_min = (100-10+1)//2 = 91//2=45, D_max=50, so number of D=50-45+1=6.

And n=10, so number of D is about n/2=5, so 6 is close.

Similarly, if t=101, n=10, D_min=(101-10+1)//2=92//2=46, D_max=101//2=50, so number of D=50-46+1=5.

So the number of D is approximately n/2, which is 5e4, as said.

So for any t, the number of D we need to iterate is about n/2, which is acceptable.

So we can implement the binary search.

Code steps:

Precompute P_min and pre[].

low = 0, high = m

while low <= high: mid = (low+high)//2 if check(mid): low = mid+1 else: high = mid-1

then answer = high

Now, check(t) function: if t==0: return True D_min = 0 if t<=n else (t-n+1)//2 D_max = t//2 min_cost = a large number (e.g., 10*20) for D in range(D_min, D_max+1): B = t - 2D

B must be between 0 and n, which it is by our D_min calculation.

cost = D * P_min + pre[B] if cost < min_cost: min_cost = cost return min_cost <= m

But note: pre[B] is defined for B from 0 to n. So when B>n? But from our D_min, we have B<=n, so it's safe.

But what if B<0? But when D<=t//2, B=t-2D>=0, so B>=0.

So this should work.

Let's test with sample2.

Sample2: n=3, m=15, x1=1,y1=7 -> p1=8 x2=2,y2=3 -> p2=5 x3=3,y3=1 -> p3=4 So P_min=4 X = [1,2,3] sorted, so pre[0]=0, pre[1]=1, pre[2]=1+2=3, pre[3]=1+2+3=6

Now, t=8: D_min = since t=8>n=3, so D_min = (8-3+1)//2 = (6)//2=3 D_max = 8//2=4 So D=3,4.

For D=3: B=8-6=2, cost=34 + pre[2]=12+3=15 For D=4: B=8-8=0, cost=44 + pre[0]=16+0=16 So min_cost=15 <=15, so check(8) returns True.

So it works.

Now, what if t=7? D_min = (7-3+1)//2 = (5)//2=2 D_max=7//2=3 D=2: B=7-4=3, cost=24 + pre[3]=8+6=14 D=3: B=7-6=1, cost=34 + pre[1]=12+1=13 min_cost=13<=15, so True.

So maximum t=8.

Now, we need to consider if there are multiple糖果 with the same P_min, but our method already handles.

So we can code accordingly.

But one more corner: when n=0? But n>=1, so no problem.

Let's code.

But note: pre[B] for B=0 to n, so we need to define pre as an array of length n+1.

Implementation:

We'll read n, m. x_list = [] for i in range(n): read x, y x_list.append(x) P_min = min(P_min, x+y)

Then sort x_list, and compute pre[0]=0, for i in range(1, n+1): pre[i] = pre[i-1] + x_list[i-1]

Then binary search.

But note: when t is small, say t<=n, then D_min=0, D_max=t//2, so we iterate over D from 0 to t//2, which is at most t/2, and t<=n=10^5, so最多5e4,所以没问题。

So code:

We'll write the check function.

But one optimization: when we iterate D, we note that as D increases, B decreases, and pre[B] is non-decreasing? Actually, pre[B] is increasing with B. So when D increases, B decreases, so pre[B] decreases? But since pre[B] is increasing with B, when B decreases, pre[B] decreases. So in f(D)=D * P_min + pre[B], as D increases, the first term increases, but the second term decreases. So it might be unimodal? But we can simply iterate over all D in the range since the range is only 5e4.

So we proceed.

Code in Python:

Note: m can be as large as 10^18, so we use integers.

Let's code.

We need to be careful about integer overflow? In Python, integers are arbitrary precision, so no problem.

Code:

import sys

def main(): data = sys.stdin.read().split() if not data: return n = int(data[0]) m = int(data[1]) x_list = [] P_min = 10**18 # large number index = 2 for i in range(n): x = int(data[index]); y = int(data[index+1]); index += 2 x_list.append(x) p = x + y if p < P_min: P_min = p

text x_list.sort() pre = [0] * (n+1) for i in range(1, n+1): pre[i] = pre[i-1] + x_list[i-1]

Binary search for t

low = 0 high = m # since t <= m ans = 0 while low <= high: mid = (low + high) // 2 if check(mid, n, P_min, pre): ans = mid low = mid + 1 else: high = mid - 1

print(ans) def check(t, n, P_min, pre): if t == 0: return True

Compute D_min and D_max

if t <= n: D_min = 0 else: D_min = (t - n + 1) // 2 D_max = t // 2 min_cost = 10**20

Iterate D from D_min to D_max

for D in range(D_min, D_max+1): B = t - 2 * D

B should be between 0 and n, which it is by D_min

cost = D * P_min + pre[B] if cost < min_cost: min_cost = cost return min_cost <= m

But wait, in check function, we use m from the outer scope? But in function, we need to pass m. So let's adjust.

We can define check as a function that takes t, n, P_min, pre, m.

So in main, we call check(mid, n, P_min, pre, m)

Now, let's test with sample1.

Sample1: n=2, m=10, x1=4,y1=1 -> p1=5 x2=3,y2=3 -> p2=6 P_min=5 x_list = [3,4] sorted -> pre[0]=0, pre[1]=3, pre[2]=7

Check t=4: D_min: since t=4>n=2? yes, so D_min=(4-2+1)//2=3//2=1 D_max=4//2=2 D=1: B=4-2=2, cost=15 + pre[2]=5+7=12 D=2: B=4-4=0, cost=25 + pre[0]=10+0=10 min_cost=10<=10, True.

So correct.

But wait, in sample1, we have output 4, so it works.

Now, what if t=5? D_min=(5-2+1)//2=4//2=2 D_max=5//2=2 D=2: B=5-4=1, cost=2*5 + pre[1]=10+3=13>10, so False.

So correct.

So code should be correct.

But we should consider performance: for each t, we iterate over about n/2 values. In worst case, n=10^5, so 5e4 per t, and binary search 60 iterations, so 3e6 operations, which is acceptable in Python? It might be borderline in Python if implemented in PyPy or C++ but in Python it should be acceptable for 3e6 operations.

But let me check: 3e6 operations in Python might take a few seconds? But in Pyton, it should be acceptable.

We can try to optimize the inner loop by precomputing the best for each B? But we already have pre[B], and we are iterating D, which corresponds to B.

Notice that for fixed t, we have cost = D * P_min + pre[t-2D]. So for each B, we have D = (t-B)/2, so if we iterate B instead of D, we can cover the same set. But B must be in [0, n] and B ≡ t mod 2. And the number of B is about n/2, so same.

So no big improvement.

Another idea: for large t, the function f(D) might be convex? But since we have a small range, we don't need to optimize further.

So we output the code.

Let me test with a small case.

Suppose n=1, m=10, x1=2, y1=3, so P_min=5, pre[0]=0, pre[1]=2.

What is the maximum t? For t=1: cost= pre[1]=2 <=10 -> yes t=2: cost=15 + pre[0]=5 <=10 -> yes t=3: cost=15 + pre[1]=5+2=7<=10 -> yes t=4: cost=25 + pre[0]=10<=10 -> yes t=5: cost=25 + pre[1]=10+2=12>10 -> no So max t=4.

Now with our code for n=1: Check t=4: D_min: t=4>1, so D_min=(4-1+1)//2=4//2=2 D_max=4//2=2 D=2: B=0, cost=2*5+0=10<=10 -> True. So correct.

So code is ready.

We'll write the code accordingly.

One last thing: when n=0, but n>=1, so skip. ::: :::info[代码]

import sys

def check(t, n, P_min, pre, m):
    if t == 0:
        return True
    if t <= n:
        D_min = 0
    else:
        D_min = (t - n + 1) // 2
    D_max = t // 2
    min_cost = 10**20
    for D in range(D_min, D_max + 1):
        B = t - 2 * D
        cost = D * P_min + pre[B]
        if cost < min_cost:
            min_cost = cost
    return min_cost <= m

def main():
    data = sys.stdin.read().split()
    if not data:
        return
    n = int(data[0])
    m = int(data[1])
    x_list = []
    P_min = 10**18
    index = 2
    for i in range(n):
        x = int(data[index])
        y = int(data[index + 1])
        index += 2
        x_list.append(x)
        p_val = x + y
        if p_val < P_min:
            P_min = p_val

    x_list.sort()
    pre = [0] * (n + 1)
    for i in range(1, n + 1):
        pre[i] = pre[i - 1] + x_list[i - 1]

    low = 0
    high = m
    ans = 0
    while low <= high:
        mid = (low + high) // 2
        if check(mid, n, P_min, pre, m):
            ans = mid
            low = mid + 1
        else:
            high = mid - 1

    print(ans)

if __name__ == "__main__":
    main()

::: 评测记录(Accepted)(官方数据)

[NOIP2025T2] 清仓甩卖 / sale

思考次数:6 次。
思考时间:1042+889+212+356+594=3093 秒。

:::success[思考过程] 由于本题思考过程较长,不予展示。 :::

:::info[代码]

import sys
from functools import cmp_to_key

MOD = 998244353

def greedy_value(a, w, m):
    n = len(a)
    candies = [(a[i], w[i], i) for i in range(n)]
    def cmp(c1, c2):
        a1, w1, i1 = c1
        a2, w2, i2 = c2
        # 比较性价比 a1/w1 和 a2/w2
        if a1 * w2 > a2 * w1:
            return -1
        if a1 * w2 < a2 * w1:
            return 1
        # 性价比相同,比较原价
        if a1 > a2:
            return -1
        if a1 < a2:
            return 1
        # 原价相同,比较编号
        if i1 < i2:
            return -1
        if i1 > i2:
            return 1
        return 0
    candies.sort(key=cmp_to_key(cmp))
    money = m
    total = 0
    for candy in candies:
        a_val, w_val, _ = candy
        if money >= w_val:
            money -= w_val
            total += a_val
    return total

def optimal_value(a, w, m):
    # 0-1背包,重量w_i,价值a_i,容量m
    # 由于重量只有1和2,可以分开处理
    items1 = []  # 重量1的物品价值
    items2 = []  # 重量2的物品价值
    for i in range(len(a)):
        if w[i] == 1:
            items1.append(a[i])
        else:
            items2.append(a[i])
    items1.sort(reverse=True)
    items2.sort(reverse=True)
    # 前缀和
    pref1 = [0]
    for v in items1:
        pref1.append(pref1[-1] + v)
    pref2 = [0]
    for v in items2:
        pref2.append(pref2[-1] + v)
    best = 0
    # 枚举取多少个重量1的物品
    for cnt1 in range(len(items1)+1):
        weight = cnt1
        if weight > m:
            break
        max_cnt2 = min(len(items2), (m - weight) // 2)
        total = pref1[cnt1] + pref2[max_cnt2]
        if total > best:
            best = total
    return best

def solve_one(n, m, a):
    count = 0
    for mask in range(1 << n):
        w = [1 if (mask >> i) & 1 == 0 else 2 for i in range(n)]
        greedy = greedy_value(a, w, m)
        optimal = optimal_value(a, w, m)
        if greedy == optimal:
            count += 1
    return count % MOD

def main():
    data = sys.stdin.read().split()
    if not data:
        return
    c = int(data[0])
    t = int(data[1])
    idx = 2
    out = []
    for _ in range(t):
        n = int(data[idx]); idx += 1
        m = int(data[idx]); idx += 1
        a = list(map(int, data[idx:idx+n]))
        idx += n
        if n <= 20:
            out.append(str(solve_one(n, m, a)))
        else:
            out.append("0")
    sys.stdout.write("\n".join(out))

if __name__ == '__main__':
    main()
:::

[评测记录(12pts)(官方数据)](https://www.luogu.com.cn/record/251127543)

##  [NOIP2025T3] 树的价值 / tree

思考次数:$1$ 次。  
思考时间:$1023$ 秒。
:::success[思考过程]
首先,题目要求我们给树的每个节点分配一个非负整数权值,然后对于每个节点 i,计算其子树中所有节点权值集合的 mex 值(即不在集合中的最小非负整数)。树的价值是所有节点的 mex 值之和。我们需要最大化这个和。

关键点:每个节点的 mex(S_i) 取决于其子树中的权值集合。为了最大化总和,我们可能需要让不同的节点有较大的 mex 值,但 mex 值受到子树中权值出现情况的限制。

由于高度有限制 m,且 m 较小(最大 800),而 n 最大 8000,我们需要一个时间复杂度与 m 相关而不是与 n 直接相关的算法。

考虑树的结构:以 1 为根,每个节点的子树包含它自身及其所有后代。

mex 的性质:对于节点 i,如果其子树包含了 0 到 k-1 的所有整数,但缺少 k,那么 mex(S_i) = k。因此,要使得 mex 大,就需要子树中包含连续的一串小整数。

但权值是非负整数,没有上界限制。所以我们可以分配任意大的权值,但 mex 只关心最小的缺失整数。所以直观上,我们应该在子树中尽可能连续地填充小整数,以使得 mex 变大。

然而,不同子树的 mex 会相互影响,因为一个节点的权值会被所有祖先节点考虑在内。

一个常见思路是:考虑每个权值对总价值的贡献。但 mex 不是简单的求和,所以需要转换视角。

另一种思路:对于每个节点 i,其 mex(S_i) 等于使得 0,1,...,x-1 都出现在其子树中的最大 x。那么,如果我们能使得对于每个 i,其子树中包含 0 到某个数,那么 mex 就是那个数+1。

但我们需要最大化所有 mex 的和。

注意:高度 m 较小,意味着树可能是比较扁平的。我们可以考虑按深度进行 DP。

设树的高度为 h,但题目给定高度不超过 m。

定义深度 d_i。

观察:对于节点 i,其子树中所有节点的深度都大于等于 d_i。我们可以考虑不同深度的节点对 mex 的贡献。

假设我们给每个节点赋予一个权值 a_i。考虑一个固定的整数 v,v 对总价值的贡献是多少?即有多少个节点 i,使得 mex(S_i) > v?因为 mex(S_i) 表示最小的不在 S_i 中的数,所以 mex(S_i) > v 当且仅当 0,1,...,v 都在 S_i 中出现。因此,对于每个 v,它对总价值的贡献就是满足 0,1,...,v 都出现在 S_i 中的节点 i 的数量。总价值可以写成:

\sum_{i=1}^n mex(S_i) = \sum_{v=0}^{\infty} #{ i : mex(S_i) > v } = \sum_{v=0}^{\infty} #{ i : {0,1,...,v} \subseteq S_i }.

所以,如果我们能计算出对于每个 v,有多少个节点 i 的子树包含了 0 到 v 的所有数,那么把这些数量求和就得到总价值。

由于树的大小有限,实际上 v 不会超过某个值,因为最多只有 n 个不同的权值,但我们可以分配任意大的权值,所以 v 可以很大。但注意,如果 v 很大,那么包含 0 到 v 所有数的子树会很少。实际上,v 不会超过 n-1?因为最多只有 n 个节点,所以最多出现 n 个不同的权值,但 mex 可能达到 n。但根据公式,我们需要考虑所有 v,但贡献会随着 v 增大而减少。

在最大化总价值时,我们需要决定如何分配权值,使得对于每个 v,包含 0 到 v 的子树数量尽可能多。

现在,问题转化为:对于每个 v,我们选择一些节点赋予权值 0,1,...,v,但每个节点只能赋予一个权值。然后,对于每个节点 i,如果其子树包含了所有这 v+1 个权值,那么它就对 v 有贡献(即 mex(S_i) > v)。我们需要最大化所有 v 的贡献之和。

但注意,v 是连续的,所以总价值是所有 v 的贡献之和。这等价于:对于每个节点 i,其 mex(S_i) 就是满足其子树包含 0 到 k-1 的最大 k。所以,如果我们能使得每个节点 i 的子树包含 0 到某个较大的数,那么 mex 就大。

但资源有限:每个权值只能分配给一个节点?不,权值可以重复吗?题目没有说权值必须不同。集合 S_i 是子树中结点权值构成的集合,所以权值可以重复,但集合只关心有哪些值,不关心出现次数。所以,如果多个节点有相同的权值,那么对于集合来说,只算一个元素。

所以,权值可以重复,但重复的权值不会增加集合的元素。为了使得集合包含更多的小整数,我们应该让不同的小整数出现在不同的节点上,且尽可能出现在多个子树中。

考虑:如果权值 v 出现在某个节点上,那么它出现在所有祖先节点的子树中。所以,为了使得一个子树包含 0 到 v,我们需要对于每个 0<=u<=v,权值 u 出现在该子树的某个节点上。

因此,每个权值 u 被分配到一个节点上,这个节点会贡献给所有祖先节点的子树(即所有包含该节点的子树)。

对于固定的 v,包含 0 到 v 所有权值的子树,就是那些在树中包含了每个权值 u (0<=u<=v) 至少一个节点的子树。

所以,我们需要放置权值 0,1,2,... 到节点上,使得对于每个 v,包含所有 0 到 v 的节点 i 的数量最大。

这类似于覆盖问题。

由于高度 m 较小,我们可以考虑深度。设树有根,深度从 0 开始。

一个关键点:一个节点的子树包含它自身和所有后代。所以,如果我们把权值放在深度较大的节点上,那么它只能贡献给较少的祖先(因为祖先数量等于深度)。而如果放在深度较小的节点上,它能贡献给更多的祖先(从根到该节点的路径上的所有节点)。

但另一方面,为了使得一个子树包含多个权值,这些权值需要分布在该子树的不同节点上。

为了最大化总价值,我们应该把小的权值放在靠近根的地方,这样更多的子树会包含它们。对于较大的权值,放在较深的地方,因为只有较少的子树需要包含它们。

具体地,考虑从 v=0 开始。要使更多节点的子树包含 0,我们只需要在树中放置一个 0。但放在哪里?如果放在根节点,那么所有节点的子树都包含根节点,所以所有节点的子树都包含 0?注意:子树的定义:节点 i 的子树包括 i 及其所有后代。对于根节点,其子树包含所有节点,所以如果根节点权值为 0,那么对于每个节点 i,其子树是否包含 0?对于根节点自身,其子树包含 0。对于其他节点,如果该节点不是根,但其子树是否包含根?不,因为子树只包括该节点的后代,不包括祖先。所以,只有根节点及其后代才在根的子树中?实际上,对于节点 i,其子树 S_i 只包含 i 和 i 的后代,不包含 i 的祖先。所以,如果我们在根节点放 0,那么只有根节点的子树包含 0。其他节点的子树不包含根节点,所以可能不包含 0,除非它们自己的权值是 0 或者它们的后代有权值 0。

所以,为了让一个节点的子树包含 0,我们需要在它的子树中至少有一个节点权值为 0。

因此,权值放置的位置决定了哪些子树包含该权值。

为了使更多节点的子树包含 0,我们应该把 0 放在一个节点上,使得尽可能多的节点的子树包含该节点。一个节点被哪些节点的子树包含?节点 u 被所有 u 的祖先节点的子树包含(因为祖先的子树包含 u)。所以,如果 u 的深度为 d,那么有 d+1 个节点的子树包含 u(即 u 的所有祖先,包括 u 自身)。所以,为了最大化包含 0 的子树数量,我们应该把 0 放在根节点?根节点的深度为 0,所以只有 1 个节点的子树包含根节点(即根节点自身)。这似乎很少。如果放在一个叶子节点,那么它的所有祖先的子树都包含它,所以包含该叶子的子树数量等于该叶子的深度+1。由于深度最大为 h,所以最多 h+1 个。但 h 可能小于 n。但我们需要考虑所有节点,而不是单个权值。

实际上,对于权值 0,我们可能希望它出现在尽可能多的子树中。所以,我们应该把它放在一个节点上,使得该节点有尽可能多的祖先(即深度尽可能大),因为每个祖先的子树都包含该节点。但注意:该节点自身的子树也包含自身,所以包含该节点的子树数量正好等于该节点的深度+1。所以,为了最大化包含 0 的子树数量,我们应该把 0 放在一个深度最大的节点上?但这样,只有从根到该叶子的路径上的节点的子树包含 0。其他分支的节点不包含该叶子,所以它们的子树不包含 0。所以,可能不是全局最优。

我们需要同时考虑多个权值。总价值是所有 mex 的和,即对于所有 v,包含 0 到 v 的子树数量之和。

让我们重新思考。

定义:对于每个节点 i,令 f(i) 为 mex(S_i)。那么 f(i) 是满足对于所有 0<=k<f(i),k 出现在 S_i 中的最大值。

所以,如果我们能计算出每个节点的 f(i),那么总和就是答案。

如何设置权值以最大化 f(i)?这类似于给树染色,使得每个节点子树中出现的颜色集合的 mex 尽可能大。

由于 mex 只关心最小的缺失数,我们可以考虑从 0 开始逐个数是否出现在子树中。

一个想法是:对于每个深度,我们分配权值?但深度和权值没有直接关系。

另一个想法:考虑树的重构。由于高度 m 较小,我们可以把树按深度分层。

设深度为 d 的节点集合为 L_d。深度从 0 到 h,其中 h<=m。

对于节点 i,其子树包含的节点来自深度 >= d_i 的部分,但只限于 i 的后代。

为了使得节点 i 的 mex 大,我们需要在 i 的后代中放置 0,1,2,...,k-1 这些权值。注意,这些权值可以放在 i 的后代中的任意位置。

由于权值可以任意大,我们实际上只关心较小的权值是否出现。所以,我们可以专注于分配较小的权值,因为较大的权值对 mex 的影响较小(它们只影响那些已经包含所有小权值的节点的 mex,使得 mex 可能更大)。

从贡献的角度:总价值 = sum_{i} mex(S_i) = sum_{v>=0} #{i: S_i 包含 0 到 v}。

所以,对于每个 v,我们需要最大化满足 S_i 包含 0 到 v 的节点 i 的数量。

设 A_v 是满足 S_i 包含 0 到 v 的节点 i 的集合。那么 A_{v} 是 A_{v-1} 的子集,因为如果包含 0 到 v,那么一定包含 0 到 v-1。所以,A_0 ⊇ A_1 ⊇ A_2 ⊇ ...。

我们需要选择权值放置,使得对于每个 v,|A_v| 尽可能大。

放置权值 v 会如何影响这些集合?权值 v 被放置在某些节点上。对于每个节点 i,如果 i 的子树包含权值 v,那么 i 可能属于 A_v(如果它也包含 0 到 v-1)。但权值 v 的放置会影响 A_v 和更大的 v。

实际上,当我们放置权值 0,1,...,v 时,A_v 由那些子树同时包含这些权值的节点组成。

由于 A_v 是嵌套的,我们可以依次考虑放置权值 0,1,2,...,每次放置权值 k 时,我们试图最大化 A_k 的大小,但 A_k 依赖于之前的放置。

或许我们可以贪心:先放置权值 0,使得 A_0 尽可能大;然后放置权值 1,在 A_0 的基础上使得 A_1 尽可能大;依此类推。

但放置权值 k 时,我们只能将其放在节点上,这些节点会贡献给所有祖先的子树。我们需要选择放置位置,使得在考虑权值 0 到 k-1 已经放置的情况下,尽可能多的节点子树同时包含 0 到 k。

设已经放置了权值 0 到 k-1,此时 A_{k-1} 是已知的(一组节点)。现在我们要放置权值 k。对于每个节点 i,如果 i 的子树包含权值 k,并且 i 属于 A_{k-1},那么 i 将属于 A_k。所以,放置权值 k 会增加 A_k 的大小吗?实际上,A_k 是那些子树包含 0 到 k 的节点,所以对于 i 属于 A_{k-1},如果 i 的子树也包含权值 k,那么 i 就属于 A_k。所以,放置权值 k 会使得一些 A_{k-1} 中的节点进入 A_k(如果它们子树包含 k)。但注意,如果 i 不属于 A_{k-1},那么即使它子树包含 k,它也不属于 A_k,因为它缺少某个更小的权值。

所以,放置权值 k 只会影响 A_{k-1} 中的节点。我们需要选择放置权值 k 的位置,使得尽可能多的 A_{k-1} 中的节点的子树包含权值 k。

对于每个节点 i 在 A_{k-1} 中,其子树已经包含 0 到 k-1。现在,如果我们在 i 的子树中放置权值 k,那么 i 的子树就包含 0 到 k,所以 i 属于 A_k。但如果我们在 i 的子树外放置权值 k,那么 i 的子树可能不包含 k,所以 i 不属于 A_k。

所以,为了最大化 A_k,我们希望对于每个 i 在 A_{k-1} 中,都在 i 的子树中放置权值 k。但权值 k 只能放在一个节点上(或者多个节点?但权值 k 可以放在多个节点上吗?题目没有要求权值必须不同,所以我们可以把同一个权值放在多个节点上。但这样做有意义吗?如果我们在多个节点放置权值 k,那么更多节点的子树会包含 k,但这可能会浪费,因为对于 A_{k-1} 中的节点,只需要至少一个权值 k 在其子树中即可。如果我们在多个位置放置 k,那么可能使得更多 A_{k-1} 中的节点包含 k,但可能也使得一些不属于 A_{k-1} 的节点包含 k,但这对于 A_k 没有直接贡献,因为这些节点不属于 A_{k-1},所以不会进入 A_k。然而,放置多个 k 可能会影响后续权值的放置?但后续权值也会类似考虑。所以,可能我们只需要每个权值放在一个节点上就足够了?但考虑一下:如果两个不同的节点 i 和 j 都在 A_{k-1} 中,但它们的子树不相交,那么如果我们只放一个权值 k,它只能在一个子树中,所以另一个节点的子树可能不包含 k,因此那个节点就不会进入 A_k。所以,为了覆盖所有 A_{k-1} 中的节点,我们可能需要在每个节点的子树中都放一个权值 k,但这需要多个权值 k 的副本。由于权值可以重复,我们可以放多个 k。但注意,权值 k 重复放置不会增加集合的大小,但会使得更多子树包含 k。所以,对于最大化 A_k,我们希望对于 A_{k-1} 中的每个节点,其子树中至少有一个权值 k。因此,我们需要在树上放置权值 k,使得每个 A_{k-1} 中的节点都被覆盖,即每个这样的节点的子树中至少有一个节点有权值 k。

这变成了一个覆盖问题:给定一个树,以及一个节点集合 A_{k-1},我们需要选择一些节点放置权值 k,使得对于每个节点 i 在 A_{k-1} 中,存在一个放置了权值 k 的节点在 i 的子树中。

我们希望最小化放置权值 k 的数量吗?不,我们并不最小化放置数量,因为放置权值 k 没有成本。我们关心的是最大化 A_k 的大小。但 A_k 的大小取决于有多少个 A_{k-1} 中的节点被覆盖(即其子树包含 k)。如果我们放置权值 k,我们可以覆盖一些 A_{k-1} 中的节点。但放置多个 k 可能会覆盖更多,但每个 k 的放置位置会影响覆盖哪些节点。我们的目标是覆盖所有 A_{k-1} 中的节点,这样 A_k = A_{k-1},即 |A_k| = |A_{k-1}|。但如果我们不能覆盖所有,那么 |A_k| < |A_{k-1}|。

所以,贪心策略:从 v=0 开始,初始化 A_{-1} 为所有节点(因为对于 v=-1,没有条件,所以所有节点都满足包含空集)。然后对于 v=0,1,2,...,我们放置权值 v,使得尽可能多的 A_{v-1} 中的节点被覆盖,即最大化 A_v 的大小。然后继续。

但 v 要考虑到多大?由于树有 n 个节点,最多 n 个不同的权值,但 mex 可能达到 n,所以 v 可能到 n-1。但放置权值 v 时,我们只需要考虑 A_{v-1} 中的节点。随着 v 增加,A_{v-1} 会变小,所以当 A_{v-1} 为空时,停止,因为更大的 v 不会有贡献。

所以,我们需要模拟这个过程。

但问题是如何高效计算每次放置权值 v 时,最大能覆盖多少 A_{v-1} 中的节点。

放置权值 v 时,我们可以选择多个节点放置权值 v。每个放置位置会覆盖哪些节点?如果一个节点 u 被放置了权值 v,那么所有 u 的祖先的子树都包含 u,因此如果这些祖先属于 A_{v-1},那么它们就会被覆盖(即进入 A_v)。但注意,覆盖是针对节点 i 的子树包含权值 v。节点 i 的子树包含权值 v 当且仅当存在一个节点 w 有权值 v,且 w 是 i 的后代(包括 i 自身)。所以,如果我们在节点 u 放置权值 v,那么它会覆盖所有满足 u 在 i 的子树中的节点 i,即所有 i 是 u 的祖先(包括 u)。因此,覆盖的节点集合是 u 的所有祖先。

但我们需要覆盖的是 A_{v-1} 中的节点。所以,如果我们选择一组节点 U 放置权值 v,那么覆盖的 A_{v-1} 中的节点就是所有满足存在 u 在 U 使得 u 是 i 的后代(即 i 是 u 的祖先)的 i 在 A_{v-1} 中。换句话说,对于每个 i 在 A_{v-1} 中,如果 i 的子树中至少有一个 u 在 U,那么 i 被覆盖。

所以,问题转化为:给定树和一个节点集合 S = A_{v-1},我们需要选择一组节点 U,使得对于每个 i 在 S,i 的子树与 U 的交非空。我们希望最大化被覆盖的 S 中的节点数,但我们可以选择任意大小的 U,没有限制。实际上,如果我们选择 U 包含所有 S 中节点的子树中的节点,但那样可能太大。实际上,我们可能只需要选择一些节点,使得每个 S 中的节点都有一个后代在 U 中。这类似于在树中选择一组节点,使得每个 S 中的节点都被“击中”,即每个 S 节点的子树中至少有一个被选中的节点。

但注意,U 中的节点可以是任意节点,不一定是 S 中的节点。我们的目标是覆盖 S 中的节点,即使得每个 S 节点都被覆盖。如果我们能够覆盖所有 S 节点,那么 |A_v| = |S|。否则,只能覆盖一部分。

那么,我们是否能总是覆盖所有 S 节点呢?这取决于 S 的结构。例如,如果 S 包含两个节点,其中一个节点是另一个节点的祖先,那么覆盖祖先节点会自动覆盖后代节点吗?不:我们需要覆盖每个节点 i 的条件是 i 的子树中包含权值 v。如果 i 是 j 的祖先,那么如果我们在 j 的子树中放置权值 v,那么 i 的子树包含 j,所以 i 被覆盖。但如果我们只在 i 的子树中但不在 j 的子树中放置,那么 i 被覆盖,但 j 可能不被覆盖,因为 j 的子树可能不包含那个放置点(如果放置点在 i 但不是 j 的后代,那么 j 的子树不包含它)。所以,对于祖先-后代关系,覆盖祖先不一定覆盖后代。实际上,对于节点 i,其子树包含权值 v 当且仅当放置点在其子树中。所以,对于后代节点 j,其子树是 i 的子树的子集。所以,如果放置点在 i 的子树中但不在 j 的子树中,那么 i 被覆盖,但 j 不被覆盖。

因此,为了覆盖 S 中的所有节点,我们需要对于每个节点 i 在 S 中,放置点必须在 i 的子树中。所以,如果 S 中的节点互不相容,即一个节点的子树不包含另一个节点,那么我们需要在每个节点的子树中都放置一个点。但放置点可以共享吗?如果两个节点 i 和 j,它们的子树有重叠,那么一个放置点可以同时覆盖 i 和 j,如果该放置点同时在 i 和 j 的子树中。这意味着该放置点必须在 i 和 j 的子树交集内,即 i 和 j 的公共后代。

所以,问题类似于:给定树和节点集合 S,我们需要选择一组节点 U,使得对于每个 i 在 S,存在 u 在 U 使得 u 是 i 的后代(或 i 自身)。我们希望最小化 |U|,以便覆盖所有 S。但这里我们并不最小化 |U|,而是只要覆盖尽可能多的 S。但既然 |U| 没有成本,我们总是可以通过选择足够的放置点来覆盖所有 S,除非 S 为空?但树是有限的,我们总可以在每个 S 节点的子树中单独放一个点,所以我们可以覆盖所有 S。但注意,放置点必须是树中的节点,每个节点可以放置多个权值吗?节点只能有一个权值,但不同的权值可以放在不同的节点上。这里我们放置权值 v,所以对于每个 v,我们选择一些节点放置权值 v。这些节点之前可能已经放置了其他权值,但一个节点可以有多个权值吗?不,每个节点只有一个权值。所以,一个节点只能被分配一个权值。因此,当我们放置权值 v 时,我们选择的节点必须还没有被分配权值?或者可以被分配权值 v,但之前可能已经分配了其他权值。但一个节点只能有一个权值,所以如果我们已经给一个节点分配了权值 u,那么它就不能再分配权值 v。因此,每个节点只能用于一个权值。

这是关键!每个节点只能赋予一个权值。所以,当我们依次放置权值 0,1,2,... 时,我们是在给节点分配权值,每个节点只能分配一次。所以,放置权值 v 时,我们只能选择那些尚未被分配权值的节点来放置 v。

因此,问题变成了:我们需要给每个节点分配一个权值(非负整数),以最大化总价值。而我们的贪心过程需要考虑到节点只能使用一次。

所以,从 v=0 开始,我们选择一些节点赋予权值 0。然后 v=1,选择一些未使用的节点赋予权值 1,依此类推。

设我们已经分配了权值 0 到 v-1,现在要分配权值 v。此时,A_{v-1} 是那些子树包含了所有 0 到 v-1 权值的节点集合。注意,这些权值已经分配给了某些节点。现在,我们想要分配权值 v 给一些未使用的节点,使得尽可能多的 A_{v-1} 中的节点被覆盖,即其子树包含权值 v。然后,这些被覆盖的节点形成 A_v。

由于节点只能使用一次,我们在分配权值 v 时,只能从未使用的节点中选择。而且,我们希望覆盖尽可能多的 A_{v-1} 中的节点。

这类似于在线贪心,但可能最优策略是提前计划好所有分配。

由于 m 较小,或许我们可以进行 DP。

考虑树的高度限制 m。这意味着树可能比较浅。我们可以考虑按深度 DP,或者考虑树的长链。

另一个思路:总价值可以表示为每个节点对总价值的贡献。但每个节点的 mex 取决于其子树中的权值集合。我们可以考虑每个权值 v 对哪些节点的 mex 有贡献。如之前所述,v 对节点 i 有贡献当且仅当 0 到 v 都出现在 i 的子树中。所以,如果我们令 B_v 为包含权值 v 的节点集合(即权值 v 被分配到的节点),那么节点 i 的子树包含权值 v 当且仅当 B_v 中至少有一个节点是 i 的后代(包括 i)。所以,节点 i 属于 A_v 当且仅当对于每个 u=0 到 v,B_u 中至少有一个节点是 i 的后代。

所以,我们需要选择 B_0, B_1, B_2, ...(每个 B_v 是节点的集合,且这些集合两两不相交,因为每个节点只能属于一个 B_v)。然后对于每个 v,A_v = { i : 对于所有 u<=v,存在 b in B_u 使得 b 是 i 的后代 }。总价值 = sum_{v>=0} |A_v|。

我们需要最大化这个和。

由于 B_v 是互不相交的,且每个节点最多出现在一个 B_v 中。

现在,考虑从根开始。由于高度有限,我们可以将节点按深度分层。

一个观察:为了使得一个节点的子树包含很多小权值,这些权值应该放在该节点的不同后代上。而且,由于节点只能使用一次,我们需要权衡哪些节点用于哪些权值。

或许我们可以考虑自底向上贪心。但需要更系统的思考。

由于 m 较小,我们可以考虑一个 DP,状态与深度相关。

定义深度 d 的节点集 L_d。

对于节点 i,其子树包含权值 v 的条件是:在 i 的子树中存在一个深度为某个值的节点属于 B_v。

由于高度限制,每个节点的子树深度范围从 d_i 到 h。

考虑一个权值 v。如果我们把 v 放在深度为 x 的节点上,那么它能覆盖所有深度小于等于 x 的祖先节点(使得这些祖先节点的子树包含 v)。但注意,覆盖是针对 A_{v-1} 中的节点,而不是所有节点。

所以,放置权值 v 时,我们关心的是那些已经在 A_{v-1} 中的节点,我们需要覆盖它们。

随着 v 增大,A_{v-1} 会缩小,所以我们需要覆盖的节点集合在缩小。

为了最大化总价值,我们希望每个 A_v 尽可能大,即每次放置权值 v 时,我们希望覆盖尽可能多的 A_{v-1} 中的节点。

但覆盖一个节点 i 需要在其子树中放置权值 v。由于节点只能使用一次,我们需要选择未使用的节点来放置 v。

那么,如何选择放置权值 v 的节点,以覆盖尽可能多的 A_{v-1} 中的节点呢?这类似于集合覆盖问题,但由于树结构,可能具有贪心性质。

考虑 A_{v-1} 中的节点。如果两个节点 i 和 j,其中 i 是 j 的祖先,那么覆盖 j 需要放置点在 j 的子树中,而覆盖 i 需要放置点在 i 的子树中。由于 j 的子树是 i 的子树的子集,所以如果我们放置点在 j 的子树中,那么同时覆盖了 i 和 j。但如果我们放置点在 i 的子树中但不在 j 的子树中,那么只覆盖 i,不覆盖 j。所以,为了同时覆盖两者,我们应该将权值 v 放在 j 的子树中。因此,对于祖先-后代关系,我们应该优先覆盖后代节点,因为覆盖后代会自动覆盖祖先。但注意,覆盖祖先不一定覆盖后代。所以,在资源有限的情况下,我们应该先满足后代节点,因为这样收益更大(覆盖一个后代节点会同时覆盖其所有祖先,但这些祖先可能已经在 A_{v-1} 中,所以覆盖后代节点会使得所有这些祖先节点也被覆盖?但小心:覆盖一个节点 i 意味着 i 的子树包含权值 v。如果我们在 j 的子树中放置 v,其中 j 是 i 的后代,那么 i 的子树包含 j,所以 i 被覆盖。因此,覆盖 j 会覆盖所有 j 的祖先。所以,覆盖一个深度较大的节点会覆盖从根到该节点的路径上的所有节点。因此,如果我们选择放置权值 v 在一个节点 u 上,那么它会覆盖所有 u 的祖先(包括 u)。所以,覆盖的节点集合是 u 的所有祖先。

但我们需要覆盖的是 A_{v-1} 中的节点。所以,如果我们选择 u,那么所有属于 A_{v-1} 且是 u 的祖先的节点都会被覆盖。因此,为了覆盖尽可能多的 A_{v-1} 中的节点,我们应该选择 u 使得其祖先中属于 A_{v-1} 的数量最多。但 u 必须是一个未使用的节点。

所以,对于每个未使用的节点 u,定义 c(u) = u 的祖先中属于 A_{v-1} 的数量。那么放置权值 v 在 u 上会覆盖 c(u) 个节点。但注意,如果我们放置多个权值 v 在不同的节点上,覆盖的节点可能会有重叠。例如,如果两个节点 u 和 v 在树中,它们的祖先集合可能有重叠。但如果我们只放置一个权值 v,我们只能选择一个 u。但我们可以放置多个权值 v 吗?是的,我们可以把权值 v 分配给多个节点,但每个节点只能用于一个权值。所以,对于固定的 v,我们可以分配给多个未使用的节点。但这样,这些放置点会覆盖各自的祖先集合。总覆盖的 A_{v-1} 节点是这些祖先集合的并集。

但我们的目标是最大化覆盖的节点数,即 |A_v|。由于 |A_v| 就是被覆盖的 A_{v-1} 节点数,所以我们需要选择一组未使用的节点 U_v,使得这些节点的祖先集合的并集与 A_{v-1} 的交集大小最大。但我们可以选择任意多的节点,只要它们未使用。但未使用的节点是有限的,而且我们还需要为未来的权值保留节点。所以,我们需要权衡:使用一个节点来放置权值 v 会覆盖一些 A_{v-1} 节点,但该节点之后就不能用于放置更大的权值了。

因此,我们需要一个全局优化。

从总价值公式来看,总价值 = sum_{v>=0} |A_v|,而 |A_v| 依赖于之前的放置。

或许我们可以将问题转化为:给每个节点分配一个权值,然后计算每个节点的 mex。但直接分配难以优化。

由于 m 较小,考虑树的高度。也许我们可以将节点按深度分层,然后考虑每个深度上权值的分布。

另一个想法:定义每个节点的 mex 值 f(i)。那么 f(i) 取决于其子树中出现的权值集合。如果子树中出现了 0 到 k-1,但没出现 k,那么 f(i)=k。所以,如果我们能给每个节点 i 设定一个目标 mex 值 f(i),那么我们需要确保对于每个 i,其子树中包含 0 到 f(i)-1 的所有权值,但不包含 f(i)(或者至少不包含 f(i) 但这不是必须的,因为 mex 是最小缺失,所以如果包含 f(i) 但缺失更小的数,那么 mex 会更小)。所以,为了达到 f(i),我们需要子树中包含 0 到 f(i)-1,而对于 f(i) 是否出现没有要求。但 f(i) 越大,要求越多。

总价值是 sum f(i)。我们需要最大化它。

所以,我们需要给每个节点 i 分配一个目标 f(i),然后确保存在权值分配使得对于每个 i,其子树中包含 0 到 f(i)-1 的所有权值。并且,每个节点只能有一个权值,所以权值分配需要与 f 兼容。

更精确地,我们需要分配权值 a_j 给节点 j,并定义 f(i) = mex(S_i)。那么对于每个 i,对于所有 k < f(i),必须存在一个节点 j 在 i 的子树中使得 a_j = k。对于 k = f(i),不一定需要不存在,但如果有,也不会改变 mex 如果更小的数都出现了。但为了最大化 f(i),我们可能希望不出现 f(i),但出现也无妨,只要所有更小的都出现了。但出现 f(i) 可能会影响其他节点的 mex?因为如果 f(i) 出现在 i 的子树中,那么对于 i 的祖先,这个 f(i) 可能会出现,但可能不影响祖先的 mex 如果祖先已经包含了更小的数。但为了简单,我们可以假设权值分配中,每个权值只出现一次?不一定。

但给定目标 f(i),我们需要检查是否存在权值分配满足条件。这似乎很复杂。

由于 m 较小,或许我们可以从根开始考虑。根节点的 mex 取决于整个树中出现的权值。为了最大化根的 mex,我们需要整个树中包含 0 到某个数。但根节点的 mex 可能很大,但会牺牲其他节点的 mex。

考虑极端情况:如果树是一条链,那么每个节点的子树是其自身及其后的节点。为了最大化总和,我们应该如何分配权值?对于链,节点 i 的子树是节点 i, i+1, ..., n。我们需要最大化 sum mex(S_i)。对于链,这类似于给每个位置分配一个数,然后对于每个 i,计算从 i 到 n 的集合的 mex。总价值是这些 mex 的和。如何最大化?可能我们需要将 0 放在最末端,1 放在倒数第二,等等。这样,对于每个 i,其 mex 会比较大。例如,n=5,链 1-2-3-4-5。如果分配 a5=0, a4=1, a3=2, a2=3, a1=4,那么 S1={0,1,2,3,4}, mex=5; S2={0,1,2,3}, mex=4; S3={0,1,2}, mex=3; S4={0,1}, mex=2; S5={0}, mex=1; 总和=15。如果分配 a1=0, a2=1, a3=2, a4=3, a5=4,那么 S1={0,1,2,3,4}, mex=5; S2={1,2,3,4}, mex=0; S3={2,3,4}, mex=0; S4={3,4}, mex=0; S5={4}, mex=0; 总和=5。所以确实将小权值放在深处更好。对于链,最优策略是将权值从深到浅递增分配,即最深的节点给 0,次深给 1,等等。这样每个节点的 mex 等于其深度+1?对于链,如果节点 i 的深度为 d_i(根深度0),那么如果分配 a_i = h - d_i,其中 h 是树的高度,那么对于节点 i,其子树包含从 i 到叶子的节点,权值从 0 开始连续?在上面的例子中,深度从0到4,分配 a_i = 4 - d_i,即 a1=4, a2=3, a3=2, a4=1, a5=0,那么 mex 对于节点1是5,节点2是4,节点3是3,节点4是2,节点5是1,总和15。对于一般链,如果高度为 h,有 n=h+1 个节点,这样分配得到总和为 (h+1)(h+2)/2。这是否最大?可能。

对于一般树,我们需要推广这个想法。

由于高度 m 较小,我们可以考虑将节点按深度倒序分配权值:先给最深的节点分配最小的权值,然后给次深的节点分配次小的权值,等等。但注意,一个节点可能有很多后代,所以其子树可能包含多个权值。

考虑一个节点 i,其子树中包含的权值集合取决于分配给其后代的权值。如果我们按照深度从大到小分配权值 0,1,2,...,那么每个节点 i 的子树中将包含所有深度大于 d_i 的节点中分配的小权值。但具体包含哪些权值,取决于分配情况。

假设我们按照深度分配:将所有节点按深度从大到小排序,然后依次分配权值 0,1,2,...。但这样每个节点获得一个权值。那么对于节点 i,其子树中包含的权值集合是分配给其子树中节点的权值。由于子树中的节点深度都大于等于 d_i,且我们按照深度从大到小分配,所以子树中可能包含一些较小的权值。但具体 mex 是多少?我们需要计算。

例如,对于第一组样例,树如下:节点1深度0,节点2深度1,节点3和4深度2,节点5深度2?根据输入,5个节点,p2=1, p3=1, p4=2, p5=2。所以树是:1是根,有两个孩子2和3,节点2有两个孩子4和5。深度:d1=0, d2=1, d3=1, d4=2, d5=2。高度 m=2。按照深度从大到小分配:深度2的节点有4和5,分配0和1;深度1的节点有2和3,分配2和3;深度0的节点1,分配4。那么权值:a1=4, a2=2, a3=3, a4=0, a5=1。计算 mex:S1={0,1,2,3,4} mex=5;S2={0,1,2} mex=3?注意S2包括节点2,4,5,权值2,0,1,集合{0,1,2} mex=3;S3={3} mex=0?节点3只有权值3,所以集合{3} mex=0;S4={0} mex=1;S5={1} mex=0。总和=5+3+0+1+0=9,与样例相同。但样例中设置的是 a1=3, a2=2, a3=0, a4=0, a5=1,但这里 a3=3, a4=0, a5=1,所以不同但总和相同。

如果按照深度从大到小分配,我们得到总和9。但这是否最大?对于这棵树,可能。

对于第二组样例,有7个节点,高度2。节点1深度0,节点2深度1,节点3深度2?输入:p2=1, p3=1, p4=2, p5=2, p6=2, p7=3。所以树:1是根,孩子2和3;节点2有孩子4,5,6;节点3有孩子7。深度:d1=0, d2=1, d3=1, d4=2, d5=2, d6=2, d7=2。按照深度从大到小分配:深度2的节点有4,5,6,7,分配0,1,2,3;深度1的节点有2和3,分配4和5;深度0的节点1,分配6。那么权值:a1=6, a2=4, a3=5, a4=0, a5=1, a6=2, a7=3。计算 mex:S1包含所有权值0-6,mex=7;S2包含节点2,4,5,6,权值4,0,1,2,集合{0,1,2,4} mex=3?因为缺少3,所以 mex=3;S3包含节点3,7,权值5,3,集合{3,5} mex=0?因为缺少0,所以 mex=0;S4={0} mex=1;S5={1} mex=0;S6={2} mex=0;S7={3} mex=0。总和=7+3+0+1+0+0+0=11,但样例答案是13。所以不是最优。

按照样例解释,设置 a1=4, a2=3, a4=2, a3=1, a6=1, a5=0, a7=0?描述中:a1=4, a2=3, a4=2, a3=1, a6=1, a5=0, a7=0。那么 S1={0,1,2,3,4} mex=5;S2={0,1,2,3} mex=4;S3={0,1} mex=2;S4={2} mex=0?但描述中写对于节点4是0?等等,样例解释:树的价值为 5 + 4 + 2 + 0 + 1 + 0 + 1 = 13。所以节点1 mex=5,节点2 mex=4,节点3 mex=2,节点4 mex=0,节点5 mex=1,节点6 mex=0,节点7 mex=1。检查:S4={a4=2},所以集合{2},mex=0,正确。S5={a5=0},mex=1。S6={a6=1},mex=0。S7={a7=0},mex=1。所以总和13。

按照深度分配只得到11,所以深度分配不是最优。

为什么?因为深度分配中,我们将权值4给了节点2,但节点2的子树中已经有了0,1,2,但缺少3,所以 mex=3。而在样例中,节点2的子树包含0,1,2,3,所以 mex=4。因此,为了节点2的 mex 更大,我们需要在节点2的子树中包含3。在样例中,节点2的权值是3,所以节点2自身提供了3,这样其子树就包含了0,1,2,3(来自节点4的2,节点5的0,节点6的1,和自身的3)。所以,将权值3放在节点2上,而不是放在深度2的节点上,可以提升节点2的 mex。但这样,节点3的权值变成了1,而不是5,等等。

所以,我们需要更聪明的分配。

从总价值公式出发,总价值 = sum_{v>=0} |A_v|。我们需要最大化这个和。

其中 A_v 是满足子树包含0到v的所有权值的节点集合。

由于高度 m 较小,我们可以考虑每个深度层次。

也许我们可以用 DP 来模拟放置权值的过程。

定义状态:考虑到权值 v,我们已经放置了0到v-1,现在有一些节点已经被使用(分配了权值),而 A_{v-1} 是已知的。但状态太多。

另一个想法:由于高度限制,每个节点的子树深度有限。对于节点 i,其子树中可能包含的权值数量最多为其子树大小,但 mex 可能更大如果权值不连续。

注意,mex 值不会超过子树大小,但子树大小可能很大。然而,由于高度限制,子树大小可能也受限?不,子树大小可以很大,例如根节点的子树大小为 n。

但 mex 值最大为 n,但通常不会那么大。

从贡献角度,对于每个 v,|A_v| 是满足子树包含0到v的节点数。那么,|A_v| 最多是多少?显然,|A_v| <= n。但为了最大化总价值,我们希望每个 |A_v| 尽可能大,但 v 较小时 |A_v| 可能较大,v 较大时 |A_v| 较小。

总价值 = sum_{v>=0} |A_v|,其中 |A_v| 非增,且 |A_v| <= n。

如果我们能使得 |A_v| 在 v 较小时很大,并且下降得慢,那么总价值就大。

假设我们能使 |A_v| = n 对于 v=0 到 k-1,然后 |A_k| = n-1,等等,那么总价值大约为 n*k + ...。但 k 可能有多大?k 受限于我们能否在树中放置0到k-1使得每个节点的子树都包含它们。

由于每个节点只能用于一个权值,所以最多有 n 个权值被放置。但权值可以重复吗?不,每个节点只有一个权值,所以不同的权值最多 n 个,但我们可以使用相同的权值多次吗?可以,但权值相同不会增加集合的元素。例如,如果我们放置多个0,那么对于集合来说,只包含0。但为了包含0到v,我们需要不同的权值0,1,...,v。所以,我们需要至少 v+1 个不同的权值。因此,v 最多为 n-1。

所以,实际上我们只需要考虑权值0到 n-1,但我们可以分配重复的权值,但重复的权值对于包含0到v没有帮助,因为集合只需要一个代表。所以,最优解中,我们应该分配不同的权值给不同的节点,至少对于较小的权值如此。因为如果重复,就浪费了节点,而这些节点本可以用于提供其他权值。

所以,我们假设在最优解中,所有分配的权值都是不同的,且为0,1,...,K-1,其中 K<=n。那么每个权值恰好出现在一个节点上。然后,对于 v >= K,A_v 为空,因为权值 K 没有出现,所以对于任何节点,其子树不可能包含0到K,所以 |A_K|=0。因此,总价值 = sum_{v=0}^{K-1} |A_v|。

现在,我们需要选择 K 个节点,并给它们分配权值0到K-1,使得 sum_{v=0}^{K-1} |A_v| 最大,其中 A_v 是满足子树包含所有权值0到v的节点集合。

注意,A_v 依赖于权值0到v的放置位置。设 B_v 是权值 v 所在的节点。那么 A_v = { i : 对于所有 u=0..v,B_u 在 i 的子树中 }。

由于 B_u 是单个节点(因为权值唯一),所以条件:对于每个 u=0..v,节点 B_u 是 i 的后代(包括 i 自身)。也就是说,i 是所有这些 B_u 的公共祖先。更精确地,i 的子树包含 B_u 当且仅当 B_u 是 i 的后代。所以,i 必须同时是所有 B_u (u<=v) 的祖先。因此,A_v 是所有 B_0, B_1, ..., B_v 的公共祖先的集合,但注意,i 是公共祖先意味着每个 B_u 都在 i 的子树中,但 i 可能不是最近的公共祖先。实际上,任何祖先都满足。

所以,A_v = { i : i 是每个 B_u (0<=u<=v) 的祖先 }。

那么,|A_v| 就是从根到所有 B_u 的最近公共祖先的路径上的节点数?不,对于一组节点,它们的公共祖先就是它们的最近公共祖先的所有祖先。所以,如果设 LCA(B_0,...,B_v) 为这些节点的最近公共祖先,那么所有从根到该 LCA 的路径上的节点都是公共祖先,所以 |A_v| = depth(LCA) + 1。

但注意,对于固定的 v,|A_v| 就是这些 B_0,...,B_v 的公共祖先的数量,即从根到它们的最近公共祖先的路径上的节点数。

因此,总价值 = sum_{v=0}^{K-1} (depth(LCA(B_0,...,B_v)) + 1)。

这里,对于 v=0,|A_0| 是所有包含权值0的节点数,即 B_0 的祖先数量,所以 |A_0| = depth(B_0)+1。

对于 v=1,|A_1| = depth(LCA(B_0,B_1))+1。

一般地,|A_v| = depth(LCA(B_0,...,B_v)) + 1。

所以,我们需要选择 K 和节点序列 B_0, B_1, ..., B_{K-1}(互不相同),使得 sum_{v=0}^{K-1} [depth(LCA(B_0,...,B_v)) + 1] 最大。

注意,K 可以小于 n,但我们可以选择 K=n,因为如果 K<n,我们可以添加一些权值更大的节点,但不会影响前面的 A_v,因为对于 v>=K,A_v=0,所以没有贡献。但添加更大的权值可能会增加 K,从而增加求和项数,但每个新项 |A_v| 可能很小。所以,我们需要选择最优的 K。

实际上,由于项数越多越好,但每项的深度可能较小。我们需要权衡。

设 C_v = depth(LCA(B_0,...,B_v)) + 1。那么总价值 = sum_{v=0}^{K-1} C_v。

注意,C_v 是非增的,因为添加更多节点,LCA 不会变深,反而可能变浅,所以 C_v >= C_{v+1}。实际上,LCA(B_0,...,B_v) 是这些节点的公共祖先,当我们添加 B_{v+1},LCA 可能保持不变或变成更浅的祖先,所以深度不会增加,因此 C_v 非增。

所以,我们有一个非增序列 C_0 >= C_1 >= ... >= C_{K-1}。

总价值是它的和。

现在,我们需要选择 K 个不同的节点作为 B_0,...,B_{K-1},以最大化这个和。

注意,B_0 的选择影响 C_0,B_1 影响 C_1,等等。

由于 C_v 依赖于所有前 v+1 个节点,顺序也很重要。但注意,权值是从0开始分配的,所以顺序是固定的:B_0 对应权值0,B_1 对应权值1,等等。所以,我们需要决定哪个节点得到权值0,哪个得到权值1,等等。

问题转化为:给 n 个节点排序,选择前 K 个节点,并分配权值0到K-1给它们,使得 sum_{v=0}^{K-1} [depth(LCA(前 v+1 个节点)) + 1] 最大。这里,前 v+1 个节点按权值顺序,即权值0到 v 的节点。

但注意,节点顺序是我们可以任意指定的,因为我们可以决定哪个节点获得权值0,哪个获得权值1,等等。所以,我们需要选择 n 个节点的一个子集,并给它们分配一个顺序,以最大化上述和。

由于 C_v 是非增的,我们希望 C_v 尽可能大,尤其是对于小的 v。所以,我们应该把重要的节点(能使 LCA 深度大)放在前面。

具体地,C_0 = depth(B_0)+1,所以为了最大化 C_0,我们应该选择深度最大的节点作为 B_0。这样 C_0 = max_depth + 1。

然后对于 C_1,它等于 depth(LCA(B_0,B_1))+1。我们希望这个值尽可能大。由于 B_0 已经选定,我们需要选择 B_1 使得 LCA(B_0,B_1) 尽可能深。也就是说,B_1 应该与 B_0 在同一个深分支上,这样它们的 LCA 就是 B_0 和 B_1 的某个共同祖先,如果 B_1 是 B_0 的后代,那么 LCA 就是 B_0?不,如果 B_1 是 B_0 的后代,那么 LCA(B_0,B_1) = B_0,所以 depth 等于 depth(B_0),所以 C_1 = depth(B_0)+1,与 C_0 相同。如果 B_1 是 B_0 的祖先,那么 LCA 就是 B_1,所以 C_1 = depth(B_1)+1,这小于 C_0 如果 B_1 比 B_0 浅。所以,为了最大化 C_1,我们应该选择 B_1 作为 B_0 的后代,这样 C_1 = depth(B_0)+1 = C_0。但 B_0 可能没有后代,或者后代已经被使用?但我们可以选择任意节点,只要不同。所以,如果我们选择 B_1 为 B_0 的后代,那么 C_1 = C_0。类似地,如果我们选择 B_2 作为 B_0 和 B_1 的后代,那么 LCA(B_0,B_1,B_2) 可能是 B_0 如果 B_1 和 B_2 都是 B_0 的后代,但具体取决于它们的关系。实际上,如果所有节点都在同一条链上,且按深度递减顺序分配权值,那么对于链,假设节点从根到叶子依次为 v0, v1, ..., vk,深度递增。如果我们把权值0给叶子 vk,权值1给 v_{k-1},等等,那么 B_0 = vk, B_1 = v_{k-1}, ...。那么 C_0 = depth(vk)+1,C_1 = depth(LCA(vk, v_{k-1}))+1 = depth(v_{k-1})+1,因为 v_{k-1} 是 vk 的父亲,所以 LCA 是 v_{k-1}。所以 C_1 = depth(v_{k-1})+1,这小于 C_0。实际上,对于链,如果权值从叶子到根分配,那么 C_v = depth(B_v)+1,因为每个新节点都是前一个节点的祖先,所以 LCA 就是最新的节点。那么总价值 = sum_{v=0}^{K-1} (depth(B_v)+1)。如果我们选择 K 个节点,按照深度从大到小,那么总和是 sum (depth+1),这随着深度减小而减小。对于链,如果选择所有节点,那么总和 = sum_{d=0}^{h} (d+1) = (h+1)(h+2)/2,与之前一致。

但在一般树中,我们可以选择节点使得 C_v 保持较大。例如,如果我们选择的所有节点都在同一条从根到叶子的路径上,且按照深度从大到小分配权值,那么 C_v = depth(B_v)+1,所以总和是这些 depth+1 的和。但如果我们选择不在同一条路径上的节点,那么 LCA 可能会更浅,导致 C_v 较小。

例如,在第二组样例中,如果选择 B_0 为深度2的节点,比如节点4,那么 C_0=3。然后选择 B_1 为节点5,也是深度2,但节点4和5的 LCA 是节点2,深度1,所以 C_1=2。如果选择 B_2 为节点6,LCA(4,5,6)=节点2,深度1,所以 C_2=2。等等。这样总和可能较小。

但样例中获得了更大的总和。按照样例的分配,权值0给节点5,权值1给节点3,权值2给节点4,权值3给节点2,权值4给节点1。那么 B_0=5, B_1=3, B_2=4, B_3=2, B_4=1。计算 C_0 = depth(5)+1 = 3? 节点5深度2,所以 depth=2,C_0=3。C_1 = depth(LCA(5,3))+1。节点5和3的 LCA 是节点1,深度0,所以 C_1=1。C_2 = depth(LCA(5,3,4))+1。节点5,3,4的 LCA 是节点1,所以 C_2=1。C_3 = depth(LCA(5,3,4,2))+1。这些节点包括5,3,4,2,它们的 LCA 是节点1?节点2是节点5的祖先,节点3是另一个分支,所以 LCA 是节点1,所以 C_3=1。C_4 = depth(LCA(5,3,4,2,1))+1。节点1是根,所以 LCA 是节点1,C_4=1。总和=3+1+1+1+1=7,但实际总价值是13,所以不对。

我犯了一个错误。在总价值公式中,总价值 = sum_{v} |A_v|,而 |A_v| 是满足子树包含0到v的节点数。在我的推导中,如果权值唯一,那么 |A_v| = 从根到 LCA(B_0,...,B_v) 的节点数,即 depth(LCA)+1。但这是正确的吗?让我们验证。

对于节点 i,其子树包含权值 v 当且仅当 B_v 在 i 的子树中。所以,其子树包含所有0到v当且仅当每个 B_u (0<=u<=v) 都在 i 的子树中,即 i 是每个 B_u 的祖先。所以,i 属于 A_v 当且仅当 i 是所有这些 B_u 的公共祖先。所以,A_v 正是这些 B_u 的公共祖先的集合。那么,这些公共祖先就是从根到 LCA(B_0,...,B_v) 的路径上的所有节点。所以,|A_v| = depth(LCA) + 1。是的。

但在样例中,对于 v=4,即权值0到4,B_0=5, B_1=3, B_2=4, B_3=2, B_4=1。LCA(5,3,4,2,1) = 节点1,深度0,所以 |A_4| = 1。但根据样例,节点1的 mex=5,所以对于节点1,其子树包含0到4,所以它属于 A_4,所以 |A_4| 至少1。还有其他节点吗?节点2的子树包含0到4吗?节点2的子树包含节点2,4,5,6,权值有3,2,0,1,所以集合{0,1,2,3},缺少4,所以不包含4,因此节点2不属于 A_4。节点3的子树包含节点3和7,权值1和0,集合{0,1},缺少2,3,4,所以不属于。节点4,5,6,7 的子树更小。所以只有节点1属于 A_4。所以 |A_4|=1,正确。

现在,总价值 = sum_{v=0}^{4} |A_v|。我们需要计算每个 v。

v=0: |A_0| 是包含权值0的节点数。权值0在节点5。那么哪些节点的子树包含节点5?节点5自身、节点2、节点1。所以 |A_0|=3。

v=1: |A_1| 是包含权值0和1的节点数。权值0在节点5,权值1在节点3。哪些节点同时包含两者?节点1的子树包含节点5和节点3,所以节点1满足。节点2的子树包含节点5但不包含节点3?节点2的子树包含节点2,4,5,6,不包含节点3,所以不满足。节点3的子树包含节点3和7,包含权值1但不包含权值0,所以不满足。其他节点都不满足。所以 |A_1|=1。

v=2: 权值0,1,2。权值2在节点4。哪些节点子树包含0,1,2?节点1的子树包含节点5(0),节点3(1),节点4(2),所以满足。节点2的子树包含节点5(0),节点4(2),但不包含权值1(节点3不在子树中),所以不满足。节点4的子树包含权值2,但不包含1,所以不满足。所以 |A_2|=1。

v=3: 权值0,1,2,3。权值3在节点2。哪些节点子树包含所有?节点1的子树包含0,1,2,3,满足。节点2的子树包含0,1,2,3?节点2的子树包含节点2(3),节点4(2),节点5(0),节点6(1),所以集合{0,1,2,3},满足!所以节点2也满足。所以 |A_3|=2。

v=4: 如上,只有节点1满足,|A_4|=1。

总和 = 3+1+1+2+1 = 8,但样例总价值是13,所以不对。我漏了什么?总价值是 sum mex(S_i),而不是 sum |A_v|。正确的公式是:总价值 = sum_{v>=0} |A_v|,其中 A_v = { i : mex(S_i) > v }。但 mex(S_i) > v 当且仅当 S_i 包含 0 到 v。所以是的。但在我的计算中,对于节点2,当 v=3 时,节点2的子树包含0,1,2,3,所以 mex(S_2) > 3,即 mex(S_2) >= 4。实际上,mex(S_2)=4,所以对于 v=0,1,2,3,节点2都属于 A_v。对于 v=4,节点2不属于 A_4 因为其子树不包含4。所以,在 sum |A_v| 中,节点2贡献了4次(v=0,1,2,3)。类似地,节点1贡献了5次(v=0到4)。节点3贡献了2次(因为 mex(S_3)=2,所以对于 v=0,1 属于 A_v)。节点4贡献了1次(mex=0?不,mex(S_4)=0?但 S_4={2},所以 mex=0,所以对于 v=0,节点4不属于 A_0?因为 mex>0 要求包含0,但 S_4 不包含0,所以节点4不属于 A_0。实际上,对于节点4,mex=0,所以它对任何 v>=0 都不属于 A_v。但在我之前的计算中,对于 v=0,|A_0| 是包含权值0的节点数,节点4不包含权值0,所以正确。节点5 mex=1,所以对于 v=0 属于 A_0。节点6 mex=0,所以没有贡献。节点7 mex=1,所以对于 v=0 属于 A_0。

所以,让我们重新计算每个节点的 mex 和贡献到 A_v。

根据样例分配:
a1=4, a2=3, a3=1, a4=2, a5=0, a6=1, a7=0。

节点1: S1={0,1,2,3,4} mex=5 -> 贡献给 v=0,1,2,3,4。
节点2: S2={0,1,2,3} mex=4 -> 贡献给 v=0,1,2,3。
节点3: S3={0,1} mex=2 -> 贡献给 v=0,1。
节点4: S4={2} mex=0 -> 无贡献。
节点5: S5={0} mex=1 -> 贡献给 v=0。
节点6: S6={1} mex=0 -> 无贡献。
节点7: S7={0} mex=1 -> 贡献给 v=0。

所以,|A_0| = 节点1,2,3,5,7 -> 5个。
|A_1| = 节点1,2,3 -> 3个。
|A_2| = 节点1,2 -> 2个。
|A_3| = 节点1,2 -> 2个。
|A_4| = 节点1 -> 1个。
总和 = 5+3+2+2+1=13,正确。

所以,在公式中,总价值 = sum_{v>=0} |A_v|。

而 |A_v| 是满足子树包含所有权值0到v的节点数。

在我的序列 B_v 定义中,如果权值唯一,那么 |A_v| 不简单地等于 depth(LCA)+1。因为 A_v 包含所有公共祖先,但还有像节点3这样的节点:节点3不是 B_0 和 B_1 的公共祖先,因为 B_0=5 不是节点3的后代,实际上节点3的子树包含 B_1=3自身,但不包含 B_0=5。所以节点3不属于公共祖先。但节点3的子树包含权值0吗?是的,因为节点7有权值0,所以节点3的子树包含权值0和1。所以,对于节点3,其子树包含 B_0 吗?B_0 是权值0所在的节点,即节点5。但节点5不在节点3的子树中。然而,节点3的子树包含权值0,因为节点7有权值0。但权值0可能出现在多个节点上?在分配中,权值0出现在节点5和节点7上!所以,权值0不是唯一的。所以,我的假设“权值唯一”不成立。在样例中,权值0出现了两次:在节点5和节点7。权值1也出现了两次:在节点3和节点6。

所以,权值可以重复。因此,B_v 可能不是单个节点,而是一个集合。但在总价值公式中,我们关心的是权值是否出现,而不是出现次数。所以,对于每个权值 v,我们只需要至少一个节点赋予权值 v,但我们可以有多个节点赋予相同的权值,这会使得更多节点的子树包含该权值。

所以,我们需要考虑每个权值 v 可以被分配给多个节点。

设 C_v 是赋予权值 v 的节点集合。那么对于节点 i,其子树包含权值 v 当且仅当 C_v 与 i 的子树有交集。

那么,A_v = { i : 对于所有 u=0..v, C_u 与 i 的子树有交集 }。

总价值 = sum_{v>=0} |A_v|。

我们需要选择互不相交的集合 C_0, C_1, C_2, ...(因为每个节点只能有一个权值),使得对于每个 v,|A_v| 尽可能大。

注意,我们可以选择任意多个权值,但权值越大,对总价值的贡献越小,因为 |A_v| 会变小。所以,我们可能只需要考虑前几个权值。

由于节点数有限,我们只能分配 n 个权值(每个节点一个)。所以,我们最多有 n 个权值分配,但权值可以重复,所以我们可以有多个权值相同的节点,但这样会减少不同权值的数量,从而减少 v 的最大值。

设我们分配了权值 0,1,...,K-1,每个权值可能分配给多个节点,但每个节点只分配一个权值。那么总节点数为 n,所以 sum_{v=0}^{K-1} |C_v| = n。

我们需要最大化 sum_{v=0}^{K-1} |A_v|,其中 A_v 依赖于 C_0,...,C_v。

现在,A_v 是满足对于每个 u<=v,C_u 与 i 的子树有交集的节点 i 的集合。

这仍然很复杂。

由于高度 m 较小,我们可以考虑深度。或许我们可以用网络流或匹配来解决?但 n=8000,m=800,可能可行。

另一个想法:考虑每个节点 i 的 mex 值 f(i)。那么 f(i) 取决于其子树中出现的权值。由于高度小,我们可以枚举每个节点 i,然后考虑其子树中需要哪些权值。但 f(i) 可以很大,但受子树大小限制。

或许我们可以将问题转化为:给每个节点分配一个权值,使得对于每个节点 i,其子树中出现的权值集合的 mex 之和最大。

这可以通过树形 DP 解决?但状态难以设计。

由于 m 小,我们可以考虑将树按深度分层,然后对于每个深度,考虑权值分配。

观察:如果一个节点的子树中包含了权值 0 到 k-1,那么其 mex 至少为 k。为了最大化总和,我们希望每个节点的 mex 尽可能大,但需要权衡。

从根节点开始,根节点的 mex 取决于整个树中出现的权值。为了最大化根节点的 mex,我们需要整个树中出现 0 到某个数。但根节点的 mex 最大可能为 n,如果树中出现了 0 到 n-1。但这样其他节点的 mex 可能会小。

在链的例子中,最优策略是将权值从深到浅分配,这样每个节点的 mex 等于其深度+1,总和为 O(n^2)。对于一般树,可能类似。

在样例2中,树的高度为2,有7个节点。如果我们按照深度分配,将小权值给深度大的节点,那么深度2的节点获得0,1,2,3,深度1的节点获得4,5,深度0获得6。那么计算 mex:根节点 mex=7,节点2 mex=3(因为其子树包含0,1,2,4,缺少3),节点3 mex=0,等等,总和11。但样例得到13。

所以,更好的策略是让某些深度1的节点也获得小权值,以增加其自身的 mex。

例如,节点2如果自身获得权值3,那么其子树中就有0,1,2,3,所以 mex=4。而节点3获得权值1,那么其子树中有0,1,所以 mex=2。等等。

所以,策略是:对于每个节点,我们希望在它的子树中包含一系列连续的小权值,特别是对于深度较小的节点,我们可以通过给自己分配一个小权值来增加自己的 mex。

因此,一个贪心策略是:自底向上,对于每个节点,考虑其子树中已经分配的权值,然后给自己分配一个权值,使得自己的 mex 尽可能大。但需要全局协调。

由于 m 小,我们可以考虑 DP 状态为每个节点的子树中已经包含了哪些权值,但权值范围可能很大。

注意,mex 只关心最小的缺失权值,所以对于节点 i,我们只关心其子树中是否包含 0,1,...,k-1。所以,我们可以用 k 来表示状态,其中 k 是 mex 的下界。

但树中可能有多个节点,状态爆炸。

另一个思路:由于高度 m 小,每个节点的子树深度范围有限。我们可以考虑将权值分配给不同深度的节点,并计算每个节点的 mex。

定义深度 d 的节点集合为 L_d。

对于节点 i,其子树中的节点深度从 d_i 到最大深度。所以,其子树中出现的权值取决于分配给这些深度的节点的权值。

如果我们把权值分配看作是从节点到权值的函数,那么每个节点的 mex 取决于其子树中权值集合。

为了简化,由于 mex 只关心连续的小权值,我们可以认为我们分配权值 0,1,2,... 给节点,并且尽量让每个节点的子树包含一个前缀。

或许我们可以从 v=0 开始,决定哪些节点的子树包含 0。这需要我们在某些节点上放置 0。放置 0 的节点应该选择哪些?为了最大化 |A_0|,即包含 0 的节点数,我们需要让尽可能多的节点的子树包含 0。一个节点的子树包含 0 当且仅当在其子树中至少有一个节点有 0。所以,如果我们把 0 放在节点 u,那么所有 u 的祖先的子树都包含 0。所以,为了最大化包含 0 的节点数,我们应该选择一组节点 U0 放置 0,使得所有节点的祖先集合的并集尽可能大。但所有节点的祖先集合的并集就是所有节点本身,如果我们选择所有节点放 0,那么每个节点的子树都包含自身,所以都包含 0,所以 |A_0|=n。但这样我们就用掉了所有节点,没有节点用于其他权值,那么对于 v>=1,|A_v|=0,总价值 = n。这显然不是最优,因为我们可以让一些节点有更大的 mex。

所以,我们需要权衡。放置 0 时,我们使用一些节点,这些节点之后不能用于其他权值。放置 0 的收益是 |A_0|,即有多少节点的子树包含 0。但放置 0 的成本是使用了节点,这些节点本可以用于放置其他权值以增加 |A_1|, |A_2|, 等等。

所以,这是一个资源分配问题。

对于每个权值 v,我们决定使用一些节点来放置 v,这些节点会贡献给 |A_v|,但也会影响后续的 |A_u| for u>v。

由于 |A_v| 是非增的,且我们想最大化总和,我们应该优先考虑让 |A_0| 大,但也要让 |A_1| 不小,等等。

从贡献的角度,每个节点 i 对总价值的贡献是它的 mex 值。而 mex 值等于使得 i 属于 A_v 的最大 v 加 1?更准确,如果 i 属于 A_v 对于 v=0 到 k-1,但不属于 A_k,那么 mex(i)=k。所以,i 对总价值的贡献为 k,它等于满足 i 属于 A_v 的 v 的数量。所以,总价值 = sum_i mex(i) = sum_i #{v: i in A_v} = sum_v |A_v|,正确。

所以,问题等价于选择互不相交的集合 C_0, C_1, C_2, ...,使得对于每个 v,A_v = { i: 对于所有 u<=v, C_u 与 i 的子树有交集 },并最大化 sum_v |A_v|。

由于树的高度 m 小,我们可以考虑深度相关的 DP。

定义深度为 d 的节点。对于节点 i,其子树包含节点 i 及其所有后代。后代都在深度大于等于 d_i 的层次。

如果我们考虑深度层,那么节点 i 的子树与深度层的关系是:对于每个深度 level >= d_i,子树包含该深度上的一些节点。

设对于每个深度 d,有节点集合 L_d。

现在,考虑权值 v。放置权值 v 的节点集合 C_v。C_v 中的节点位于某些深度。

对于节点 i,其子树包含权值 v 当且仅当存在深度 x >= d_i 且存在节点 j 在 L_x 中属于 C_v,并且 j 是 i 的后代。

由于树的结构,节点 i 的后代分布在不同深度。

为了简化,我们可以考虑每个节点 i 的子树在深度 d 上的节点集合,但这样很复杂。

由于 m 小,我们可以枚举深度。也许我们可以将树压缩成以深度为维度的结构。

另一个想法:对于每个节点 i,定义其到叶子的最长路径长度,即高度。但这里高度已经给定为 m。

考虑从叶子开始。叶子节点没有后代,所以叶子的子树只包含自身。因此,叶子的 mex 为 1 如果其权值为 0,否则为 0。所以,为了最大化叶子的贡献,我们应该给叶子分配权值 0,这样叶子 mex=1。但如果我们给叶子分配 0,那么叶子的祖先的子树都会包含 0,这对祖先有利。所以,给叶子分配 0 是好的。

类似地,对于深度大的节点,分配小权值可以惠及祖先。

所以,一个自然的贪心策略是:按照深度从大到小的顺序,依次给节点分配权值 0,1,2,...,但每个节点只能分配一个权值。这样,深度最大的节点获得最小的权值,深度最小的节点获得最大的权值。这样,对于每个节点,其子树中包含的权值将包括所有分配给深度大于它的节点的权值,由于深度从大到小分配,这些权值是从 0 开始连续的一些数。因此,节点 i 的 mex 将等于分配给深度大于等于 d_i 的节点中权值连续前缀的长度加 1?让我们分析。

假设我们按照深度从大到小分配权值,即我们有一个排序的节点列表,按深度递减排序,深度相同的任意顺序。然后我们依次分配权值 0,1,2,...。

设节点 i 的深度为 d_i。那么所有深度大于 d_i 的节点会在节点 i 之前被分配权值,因此它们获得较小的权值。这些节点都在 i 的子树中吗?不一定。节点 i 的子树只包含 i 的后代,而不是所有深度大于 d_i 的节点。所以,只有 i 的后代中深度大于 d_i 的节点才在 i 的子树中。因此,i 的子树中包含的权值只是那些分配给 i 的后代的权值,而不是所有深度大于 d_i 的节点。

所以,按照深度分配不一定保证 i 的子树包含连续的小权值。

为了确保 i 的子树包含连续的小权值,我们需要在 i 的后代中分配连续的小权值。所以,我们应该在 i 的子树内部分配权值,按照深度从大到小。

这提示我们可能需要对每棵子树独立地分配权值,但子树之间重叠,因为一个节点可能多个子树的成员。

由于树是整体的,我们需要全局分配。

考虑到高度 m 小,也许我们可以用 DP 以深度为状态。

定义 DP[d][s] 表示处理深度为 d 的节点时,某种状态 s 下的最大总价值。但总价值需要累计所有节点的 mex,所以可能需要维护更多信息。

从公式 sum |A_v| 出发,我们可以考虑每个 v 的贡献。

对于固定的 v,|A_v| 是满足子树包含 0 到 v 的节点数。这等价于:对于每个 u=0..v,至少有一个节点在 i 的子树中被标记为权值 u。所以,这类似于 v+1 种颜色,每个节点 i 需要在其子树中包含所有颜色,才计入 |A_v|。

由于 v 从 0 开始递增,我们可以动态地考虑。

设我们决定使用哪些节点来放置权值 0。放置权值 0 的节点集合为 S0。那么 |A_0| 就是所有满足子树与 S0 有交集的节点数。这等于所有 S0 中节点的祖先的并集。设 F(S) 表示节点集合 S 中所有节点的祖先的并集。那么 |A_0| = |F(S0)|。

然后,对于 |A_1|,我们需要满足子树与 S0 有交集且与 S1 有交集,其中 S1 是放置权值 1 的节点集合。那么 |A_1| = |F(S0) ∩ F(S1)|。

一般地,|A_v| = |∩_{u=0}^{v} F(S_u)|。

总价值 = sum_{v>=0} |∩_{u=0}^{v} F(S_u)|。

我们需要选择互不相交的集合 S0, S1, S2, ...,使得这个和最大。

注意,F(S) 是 S 中所有节点的祖先的并集。由于祖先关系,F(S) 总是包含根节点,如果 S 非空。

现在,∩_{u=0}^{v} F(S_u) 是这些集合的交集,即同时是所有 S_u 的祖先的节点。

设 G_v = ∩_{u=0}^{v} F(S_u)。那么 G_v 是满足对于每个 u<=v,存在一个节点在 S_u 中是 i 的后代。换句话说,i 属于 G_v 当且仅当对于每个 u<=v,i 的子树与 S_u 有交集。

所以,这正是 A_v。

现在,由于 S_u 互不相交,我们需要选择它们。

由于高度 m 小,我们可以考虑深度。祖先关系与深度有关。

一个节点 i 属于 F(S) 当且仅当 S 中有一个节点是 i 的后代(包括 i 自身)。所以,F(S) 可以看作是由 S 生成的向上闭包。

为了最大化总价值,我们希望 G_v 尽可能大,尤其是对于小的 v。

注意,G_v 是嵌套的:G_0 ⊇ G_1 ⊇ G_2 ⊇ ...。

总价值 = sum |G_v|。

所以,我们希望 G_v 在嵌套的同时保持较大。

这类似于在树中选择一些节点集 S0, S1, ...,使得它们的向上闭包的交集较大。

一个想法是:我们可以选择 S0 为所有叶子节点,那么 F(S0) 包含所有叶子的祖先,即所有节点,所以 |G_0| = n。但这样 S0 使用了所有叶子节点,这些节点就不能用于其他权值了。然后对于 S1,我们需要选择与 S0 不交的节点,那么 F(S1) 可能较小,所以 G_1 = F(S0) ∩ F(S1) = F(S1) 因为 F(S0)=全集,所以 |G_1| = |F(S1)|。如果我们选择 S1 为所有叶子的父节点,那么 F(S1) 包含这些父节点及其祖先,可能几乎全树,但有些叶子节点可能不在 F(S1) 中,因为叶子不是父节点的祖先?实际上,F(S1) 是 S1 中节点的祖先的并集,所以叶子节点如果不是 S1 中节点的祖先,就不在 F(S1) 中。由于叶子节点是深度最大的,它们不是任何深度较小节点的祖先,所以叶子节点不在 F(S1) 中。所以 |F(S1)| 可能小于 n。这样总价值可能不是最大。

我们需要找到最优的分配。

由于 m 小,我们可以考虑将节点按深度分层,然后决定每层有多少节点用于每个权值。

设深度 d 的节点数为 c_d。

对于权值 v,我们选择一些深度为 d 的节点放入 S_v。那么 F(S_v) 包含所有深度小于等于 d 的节点中那些是 S_v 中节点的祖先的节点。具体地,一个深度为 x 的节点 i 属于 F(S_v) 当且仅当存在一个节点 j 在 S_v 中使得 i 是 j 的祖先。由于深度关系,j 的深度必须大于等于 x。

所以,如果我们知道每个权值 v 的放置深度分布,我们可以计算 G_v。

但计算交集可能复杂。

也许我们可以贪心地选择 S_v。由于总价值是 sum |G_v|,而 |G_v| 是递减的,我们应该优先让 |G_0| 大,然后让 |G_1| 大,等等。

由于 |G_0| = |F(S0)|,为了最大化 |G_0|,我们应该让 S0 的向上闭包尽可能大。向上闭包的大小取决于 S0 中节点的深度分布。如果我们选择深度最大的节点,那么它的祖先较少,所以向上闭包较小。如果我们选择深度最小的节点,比如根节点,那么向上闭包只有根节点自身,很小。所以,我们需要选择深度适中的节点?让我们思考。

一个节点 u 的祖先数量为 depth(u)+1。所以,如果我们将权值 0 放在节点 u 上,那么它会贡献 depth(u)+1 个节点到 F(S0) 中。但如果我们放在多个节点上,那么 F(S0) 是这些祖先集合的并集。为了最大化并集,我们应该选择节点使得它们的祖先集合尽可能不重叠。祖先集合重叠的部分是它们的共同祖先。所以,为了最小化重叠,我们应该选择节点使得它们的最近公共祖先尽可能浅,这样它们的祖先集合重叠部分较小。但为了最大化并集,我们希望重叠部分小,这样并集大。所以,我们应该选择节点来自不同的分支,且深度尽可能大,这样它们的祖先集合从根到各自节点,重叠部分只是根节点,所以并集几乎包括所有节点?例如,如果树有 k 个叶子来自不同的分支,那么这些叶子的祖先集合的并集包括所有节点,因为每个节点都是某个叶子的祖先。所以,如果我们选择所有叶子作为 S0,那么 F(S0) 就是全树,所以 |G_0|=n。这是最大的可能。

所以,为了最大化 |G_0|,我们应该选择所有叶子节点作为 S0。但这样我们使用了所有叶子节点,它们就不能用于其他权值了。

然后,对于 |G_1|,我们需要选择 S1 与 S0 不交。那么 |G_1| = |F(S0) ∩ F(S1)| = |F(S1)|,因为 F(S0)=全树。所以,我们需要最大化 |F(S1)|,但 S1 不能包含叶子节点。所以,我们选择所有叶子的父节点作为 S1?但叶子的父节点可能不是所有节点的祖先。实际上,如果树是平衡的,那么叶子的父节点的祖先集合包括根到这些父节点的路径,可能覆盖大部分节点,但可能不包括叶子节点自己,但叶子节点已经不在考虑范围内,因为 |G_1| 是交集,而叶子节点在 F(S0) 中,但可能在 F(S1) 中?叶子节点在 F(S1) 中吗?叶子节点是叶子的父节点的后代吗?不,叶子节点是孩子,所以叶子的父节点是叶子的祖先,所以叶子节点在 F(S1) 中当且仅当 S1 包含叶子的父节点,因为叶子节点是叶子的父节点的后代?小心:F(S1) 是 S1 中节点的祖先的并集。如果 S1 包含一个节点 u,那么 u 的所有祖先属于 F(S1)。叶子节点不是 u 的祖先,除非 u 是叶子节点。所以,如果 S1 包含叶子的父节点,那么叶子的父节点的祖先包括根到该父节点,但不包括叶子节点。所以,叶子节点不属于 F(S1)。因此,|F(S1)| 不包括叶子节点。

所以,|G_1| 可能小于 n。

如果我们继续这样,那么总价值为 n + |F(S1)| + |F(S2)| + ...,其中 S1, S2, ... 是互不相交的节点集,且与 S0 不交。

这类似于分层覆盖。

由于树的高度为 m,我们可以考虑从深度 m 开始,每次使用一层节点。

在样例2中,叶子节点是深度2的节点:4,5,6,7。如果我们将 S0 设为这些叶子节点,那么 |G_0|=7,因为所有节点都是叶子的祖先?节点3是叶子7的祖先,节点2是叶子4,5,6的祖先,节点1是所有叶子的祖先。所以是的,F(S0)=全树。

然后 S1 必须与 S0 不交,所以我们可以选择深度1的节点:2和3。如果选择 S1={2,3},那么 F(S1) 包含节点2,3及其祖先,即节点1,2,3。所以 |G_1|=|F(S1)|=3。

然后 S2 必须与 S0,S1 不交,所以只能选择深度0的节点:1。所以 S2={1},F(S2)={1},|G_2|=1。

那么总价值 = |G_0| + |G_1| + |G_2| = 7+3+1=11。但还有 |G_3| 等?由于我们只有三个权值?这里我们只使用了权值0,1,2?但实际中,我们还可以分配权值给已经使用的节点?不,节点只能使用一次,所以如果我们已经用 S0 分配了权值0,S1 分配了权值1,S2 分配了权值2,那么所有节点都使用了,所以没有更多的权值,因此 v 最大为2,总价值 = sum_{v=0}^{2} |G_v| = 7+3+1=11。这正好是我们按照深度分配得到的值。

但样例中总价值为13,所以更好。在样例中,权值0出现在节点5和7,权值1出现在节点3和6,权值2出现在节点4,权值3出现在节点2,权值4出现在节点1。所以,这里 S0 不是所有叶子节点,因为叶子节点4没有被用于权值0,而是用于权值2。所以,S0 是节点5和7,那么 F(S0) 包含节点5,7及其祖先:节点5,2,1 和 7,3,1,所以节点1,2,3,5,7,共5个节点。所以 |G_0|=5。

然后 S1 是节点3和6,与 S0 不交。F(S1) 包含节点3,6及其祖先:节点3,1 和 6,2,1,所以节点1,2,3,6。那么 |G_1| = |F(S0) ∩ F(S1)| = 交集 of {1,2,3,5,7} 和 {1,2,3,6} = {1,2,3},所以 |G_1|=3。

然后 S2 是节点4,F(S2) 包含节点4,2,1,所以 {1,2,4}。那么 |G_2| = |G_1 ∩ F(S2)| = {1,2,3} ∩ {1,2,4} = {1,2},所以 |G_2|=2。

然后 S3 是节点2,F(S3) 包含节点2,1,所以 {1,2}。那么 |G_3| = |G_2 ∩ F(S3)| = {1,2} ∩ {1,2} = {1,2},所以 |G_3|=2。

然后 S4 是节点1,F(S4)={1},那么 |G_4| = |G_3 ∩ F(S4)| = {1,2} ∩ {1} = {1},所以 |G_4|=1。

总价值 = 5+3+2+2+1=13。

所以,这里我们使用了5个权值(0到4),覆盖了所有节点。

在贪心分层中,我们只使用了3个权值,总价值11。

所以,更好的策略是不要一次性用完所有叶子节点,而是保留一些叶子节点用于更高的权值,但这样会减少 |G_0|。

在样例中,|G_0| 只有5,而不是7,但后续 |G_v| 下降较慢,所以总和更大。

因此,我们需要优化选择 S0, S1, ... 以最大化 sum |G_v|。

由于高度 m 小,我们可以考虑 DP 状态表示当前已经处理了某些深度,或者考虑每个节点的使用情况。

但 n 和 m 可能达到 8000 和 800,所以状态不能太多。

另一个观察:在最优解中,权值 v 的节点应该放在深度较大的节点上,但为了平衡,可能有些深度较小的节点也放小权值。

从样例中,权值0放在深度2的节点5和7,权值1放在深度1的节点3和深度2的节点6,权值2放在深度2的节点4,权值3放在深度1的节点2,权值4放在深度0的节点1。

所以,权值分布在不同深度。

为了设计算法,由于 m 小,我们可以枚举权值的数量 K,然后决定每个深度上有多少节点用于每个权值。

设 x_{v,d} 表示分配给权值 v 的深度为 d 的节点数。那么对于每个深度 d, sum_{v} x_{v,d} = c_d,其中 c_d 是深度 d 的节点数。

我们需要计算 |G_v|,这取决于所有的 x_{u,d} for u<=v。

|G_v| 是满足对于每个 u<=v,节点 i 的子树包含至少一个权值 u 的节点数。这等价于:对于每个 u<=v,存在深度 d 使得 x_{u,d} > 0 且存在从 i 到深度 d 的后代路径。

由于树的结构,我们需要知道每个节点 i 的后代分布。

为了简化,我们可以考虑每个节点 i 能否被覆盖。但这样需要知道子树关系。

也许我们可以利用树是随机的这一事实?但题目说数据是随的,但不保证强弱。

或许对于高度小的树,我们可以采用贪心算法:从 v=0 开始,每次选择一组节点赋予权值 v,使得 |G_v| 最大,但 |G_v| 依赖于之前的选择。

由于 |G_v| = |G_{v-1} ∩ F(S_v)|,所以为了最大化 |G_v|,我们需要选择 S_v 使得 F(S_v) 与 G_{v-1} 的交集尽可能大。但 S_v 必须与之前的 S_u 不交。

所以,我们可以贪心地选择 S_v 来最大化 |G_{v-1} ∩ F(S_v)|。

但这是否最优?可能不是,因为当前选择会影响后续。

但由于高度小,也许我们可以用 DP 来模拟这个过程。

设我们已经选择了 S_0,...,S_{v-1},那么 G_{v-1} 已知。现在我们要选择 S_v(与之前不交)以最大化 |G_v| = |G_{v-1} ∩ F(S_v)|。然后我们继续。

但这样贪心可能得到局部最优。

在样例中,如果贪心,对于 v=0,我们选择 S0 以最大化 |G_0| = |F(S0)|。为了最大化 |F(S0)|,我们应该选择所有叶子节点,得到 |G_0|=7。然后对于 v=1,我们需要选择 S1 与 S0 不交,以最大化 |G_1| = |G_0 ∩ F(S1)| = |F(S1)|,因为 G_0=全树。所以选择所有叶子的父节点,得到 |F(S1)|=3,所以 |G_1|=3。然后 v=2,选择剩下的节点,即根节点,得到 |G_2|=1。总和11。

但样例中选择了不同的 S0,得到了13。

所以,贪心不是最优。

因此,我们需要全局优化。

由于 m 小,我们可以考虑状态压缩 DP?但深度最多800,不可能压缩。

或许我们可以将问题转化为:给每个节点分配一个权值,使得 sum mex 最大。然后使用树形 DP,状态为每个节点的子树中已经分配的最小权值情况。

由于 mex 只关心连续前缀,我们可以用二进制状态表示哪些权值出现在子树中,但权值可能很多。

注意,高度 m 小,所以子树深度范围小,因此子树大小可能不大?但根节点的子树大小为 n。

另一个想法:由于 mex 是连续前缀的长度,我们可以考虑每个节点 i 的 mex 值 f(i) 不超过其子树大小,但可能更大。

在树形 DP 中,我们可以自底向上计算。对于每个节点 i,我们需要决定分配给它的权值,以及其子树的权值分配,以最大化子树对总价值的贡献。

但总价值包括所有节点,所以当我们处理节点 i 时,我们需要考虑节点 i 对其祖先的贡献,这很困难。

或许我们可以改变视角:考虑每个权值 v 对总价值的贡献,即它使得哪些节点的 mex 增加了。但如上所述,这很复杂。

鉴于时间限制,我可能无法想出完整解法。由于题目要求“尽可能的快速解决这道题,如果无法解决,请尽可能的拿高分”,我或许可以写一个贪心算法来获得部分分数。

对于小数据,n<=40,我们可以暴力枚举所有分配?但 n=40 时,分配方案有 40^40 种,不可能。

对于 n<=7,我们可以枚举所有分配,计算总价值,取最大。

对于 n<=13,可能也可以枚举,但 13^13 太大。

但我们可以用搜索或状压 DP。由于每个节点只能一个权值,我们可以枚举每个节点的权值,但权值范围可能很大。但注意到,权值大于 n 没有意义,因为 mex 不会超过 n。所以权值范围可以限制在 0 到 n-1。那么对于 n=13,有 13^13 种,仍然太大。

我们可以用状态压缩表示每个节点的权值?但节点多。

或许对于小 n,我们可以用 DP 状态表示每个子树中出现的权值集合,但权值集合有 2^n 种,不可能。

所以,对于小数据,我们需要更聪明的方法。

鉴于题目有部分分,或许对于 m=2 的情况,我们可以单独处理。

在样例中,m=2,我们可以考虑深度0,1,2。

对于 m=2,树的高度为2,所以只有三层。

设深度0有1个节点(根),深度1有 a 个节点,深度2有 b 个节点,总节点数 n=1+a+b。

每个深度2的节点都是叶子,深度1的节点可能有多个孩子。

我们需要分配权值以最大化总价值。

由于高度为2,每个节点的子树深度不超过2。

对于根节点,其子树包含所有节点。
对于深度1的节点,其子树包含自身及其孩子(深度2节点)。
对于深度2的节点,其子树只有自身。

设我们分配权值。由于权值可以重复,我们可以考虑每个权值分配给哪些深度。

设权值 v 分配给深度2的节点数为 x_v,给深度1的节点数为 y_v,给深度0的节点数为 z_v,但深度0只有1个节点,所以 z_v 为0或1,且最多一个权值可以分配给根。

由于每个节点只能一个权值,我们有 sum_v x_v = b, sum_v y_v = a, sum_v z_v <=1。

我们需要计算每个节点的 mex。

但直接计算 mex 之和可能复杂。

从贡献角度,总价值 = sum_v |G_v|。

对于高度2的树,我们可以计算 G_v。

G_v 是满足子树包含所有0到 v 的节点。

由于高度2,节点 i 的子树包含权值 u 当且仅当在 i 的子树中存在一个节点有权值 u。

对于根节点,其子树包含权值 u 当且仅当至少有一个节点有权值 u,即 x_u + y_u + z_u >=1。
对于深度1的节点,设节点 i 有 c_i 个孩子。其子树包含权值 u 当且仅当 i 自身有权值 u,或者某个孩子有权值 u。
对于深度2的节点,其子树包含权值 u 当且仅当自身有权值 u。

所以,我们可以写出条件。

但为了最大化 sum |G_v|,我们需要选择分配。

由于 a 和 b 可能很大,但 m=2,我们可以尝试贪心或 DP。

或许对于 m=2,我们可以枚举权值的数量 K,然后分配。

注意到,对于深度2的节点,如果它有权值 u,那么它只贡献给自己和它的父节点以及根节点包含 u。
对于深度1的节点,如果它有权值 u,那么它贡献给自己、根节点,以及它的所有孩子?不,它的孩子不会自动包含 u,因为孩子不是父节点的祖先。所以,对于深度1的节点 i,其子树包含 u 当且仅当 i 自身有权值 u 或者某个孩子有权值 u。所以,如果 i 有权值 u,那么 i 的子树包含 u,但 i 的孩子不包含 u 除非孩子自己有权值 u。所以,权值 u 放在深度1的节点上,只能确保该节点和根节点的子树包含 u,但不能确保该节点的孩子的子树包含 u。

因此,为了覆盖深度2的节点,我们需要在深度2的节点上放置权值,或者在其父节点上放置。

由于总价值涉及所有节点的 mex,我们需要为每个节点提供连续的前缀。

考虑从 v=0 开始。为了使得更多节点的子树包含 0,我们应该将 0 放在哪里?如果放在深度2的节点上,那么该节点、其父节点、根节点的子树包含 0。所以,一个深度2的节点可以覆盖3个节点的子树包含 0。如果放在深度1的节点上,那么该节点和根节点的子树包含 0,所以覆盖2个节点。如果放在根节点上,只覆盖根节点自己。所以,为了覆盖更多节点,我们应该将 0 放在深度2的节点上。而且,为了不重叠,我们应该放在不同的深度2的节点上,这样覆盖的节点并集更大。例如,如果两个深度2的节点有相同的父节点,那么它们的祖先集合都包括该父节点和根节点,所以重叠。所以,为了最大化覆盖,我们应该选择深度2的节点来自不同的父节点,这样每个父节点只被覆盖一次,但根节点被覆盖多次,但根节点只算一次。

所以,|G_0| 是包含 0 的节点数,它等于所有有权值0的节点的祖先的并集。所以,如果我们选择一组深度2的节点作为 S0,那么 |G_0| = 1 + 不同父节点的数量 + |S0|?因为每个深度2的节点贡献自身和父节点和根节点。但父节点可能重复。所以,|G_0| = 1 + #unique parents + |S0|。

为了最大化 |G_0|,我们应该选择所有深度2的节点,那么 #unique parents 是深度1节点的数量,设为 a。所以 |G_0| = 1 + a + b。但 1+a+b = n,所以 |G_0|=n。这是最大的。

但这样我们使用了所有深度2的节点,之后就没有节点用于权值1了。

如果我们不使用所有深度2的节点,那么 |G_0| 会减小,但我们可以使用这些节点 for 权值1,从而增加 |G_1|。

所以,我们需要权衡。

设我们选择 S0 包含 b0 个深度2的节点,来自 a0 个不同的父节点。那么 |G_0| = 1 + a0 + b0。

然后 S1 必须与 S0 不交。我们可以选择深度2的节点和深度1的节点。

类似地,我们可以计算 |G_1| = |G_0 ∩ F(S1)|。

这可以计算,但需要知道树的结构。

由于 m=2,树的结构由深度1节点及其孩子数决定。

设深度1节点有 j=1..a,每个节点有 c_j 个孩子,总孩子数 b = sum c_j。

我们可以 DP 状态表示每个深度1节点已经分配了多少孩子用于权值0,1等。

但 a 可能很大,但 m=2 时,n<=4000?在数据范围中,对于 m=2,n<=4000。

但 a 可能达到 4000,所以 DP 状态可能过多。

或许对于 m=2,我们可以贪心地认为,最优解中权值从0开始,依次分配给深度2的节点,但保留一些深度2的节点用于更高的权值。

实际上,在样例2中,b=4,a=2。最优解中,权值0使用了2个深度2的节点(节点5和7),权值1使用了1个深度2的节点(节点6)和1个深度1的节点(节点3),等等。

所以,对于 m=2,我们可以尝试所有可能的 b0, b1, ...,但 b 可能大。

鉴于时间,我可能无法给出完整算法。

由于题目是 NOIP 难度,或许有更简单的解法。

在网上搜索“树的价值 mex 求和”,可能类似题目。

另一个思路:考虑每个节点 i,其 mex 值等于其子树中权值集合的 mex。我们可以将权值分配看作是在树上染色,使得每个节点子树中颜色集合的 mex 之和最大。

由于高度 m 小,我们可以考虑从叶子向上染色。一个贪心策略是:对于每个节点,将其染为当前其子树中未出现的最小颜色。但这样可能不是全局最优。

在样例2中,如果从叶子开始,叶子节点染色为0,那么所有叶子都是0。然后对于深度1的节点,节点2的子树中已经有0,所以最小未出现是1,所以染为1;节点3的子树中已经有0,所以染为1。然后根节点子树中有0,1,所以染为2。那么权值:叶子0,0,0,0,节点2和3为1,根为2。计算 mex:根节点 mex=3,节点2 mex=1(子树中有0和1,所以 mex=2?不,子树中有0和1,所以 mex=2?但节点2自身为1,孩子为0,所以集合{0,1},mex=2),节点3 mex=2,叶子 mex=1。总和:根3 + 节点2:2 + 节点3:2 + 4个叶子各1 = 3+2+2+4=11。还是11。

如果叶子染不同颜色?但叶子有4个,最小颜色为0,1,2,3,但只有4个叶子,如果都染不同,那么节点2的子树包含0,1,2,所以 mex=3,等等,可能更好。

但每个节点只能一个颜色,所以叶子可以染0,1,2,3,但这样节点2的子树包含0,1,2,节点3的子树包含3,等等。计算总和可能更大。

但需要确保颜色连续。

在样例中,最优解叶子染了0和1和2等。

由于时间有限,我决定实现一个贪心算法:按照深度从大到小分配权值0,1,2,...,即每次选择深度最大的未使用节点,分配当前最小的权值。然后计算总价值。这至少可以得到一些分数。

对于样例2,这种策略得到11分,而最优是13,所以对于小数据可能还行。

对于 m=2 的数据,或许有更好的贪心。

鉴于题目多测,t<=5,n<=8000,m<=800,我们可以尝试 O(n log n) 或 O(n m) 的算法。

我想到一个算法:由于总价值 = sum_v |G_v|,而 |G_v| 是满足子树包含0到v的节点数。我们可以模拟添加权值。从 v=0 开始,我们选择一组节点作为 S0,使得 |F(S0)| 最大,但考虑到后续,我们可能不想选择所有叶子。我们可以根据深度来选择。

设我们按照深度从大到小考虑节点,并决定是否给该节点分配权值 v。但 v 从0开始。

我们可以维护一个集合 H 表示当前 G_{v-1},即满足包含0到v-1的节点集合。初始时,H 为所有节点(因为对于 v=0,没有条件,但实际 |G_0| 是包含0的节点数,所以我们需要选择 S0 后 H 才变成 G_0)。

但我们可以迭代地选择 S_v。

贪心策略:对于 v=0,1,2,...,直到没有节点可用,我们选择 S_v 为那些能使 |H ∩ F({u})| 最大的节点 u 的集合,但我们需要选择多个节点,因为单个节点可能覆盖有限。我们可以选择所有能使覆盖增加的节点,但这样可能用掉太多节点。

我们可以每次选择一个节点 u,使得它覆盖 H 中尽可能多的节点,然后将 u 加入 S_v,然后从 H 中移除那些不被覆盖的节点?但 H 是 G_{v-1},我们需要计算 G_v = H ∩ F(S_v)。所以,当我们选择 S_v 时,我们实际上是在缩小 H。

所以,我们可以将过程视为:初始设 H 为所有节点。对于每个 v,我们选择一些节点作为 S_v,然后更新 H = H ∩ F(S_v)。然后贡献 |H| 加到总价值中。

但总价值是 sum |H| after each v? 不,总价值 = sum_{v} |G_v|,而 G_v 是 after v 的 H。所以,如果我们设 H_v = G_v,那么总价值 = sum H_v。

在过程中,我们开始于 H_{-1} = 全树。然后对于 v=0,我们选择 S0,然后 H_0 = H_{-1} ∩ F(S0) = F(S0),因为 H_{-1} 是全树。所以 |H_0| = |F(S0)|。然后总价值增加 |H_0|。

然后对于 v=1,我们选择 S1,然后 H_1 = H_0 ∩ F(S1),总价值增加 |H_1|,等等。

所以,总价值 = sum_v |H_v|。

在每一步,我们选择 S_v 以最大化 |H_{v-1} ∩ F(S_v)|,但同时也影响后续。

如果我们贪心地选择 S_v 以最大化当前的 |H_v|,那么就是最大化 |H_{v-1} ∩ F(S_v)|。

在样例2中,初始 H_{-1} 全树。对于 v=0,贪心选择 S0 以最大化 |F(S0)|,应该选择所有叶子,得到 |H_0|=7。然后对于 v=1,选择 S1 以最大化 |H_0 ∩ F(S1)|,由于 H_0=全树,所以最大化 |F(S1)|,选择所有深度1节点,得到 |H_1|=3。然后 v=2,选择根节点,|H_2|=1。总和11。

但样例中,如果选择 S0 为两个叶子,那么 |H_0|=5,然后选择 S1 为另一个叶子和一个深度1节点,那么 |H_1|=3,然后选择 S2 为另一个叶子,|H_2|=2,等等,总和13。

所以,贪心选择所有叶子对于 v=0 并不是全局最优。

因此,我们需要一个不同的策略。

也许我们可以倒过来考虑:从最大的权值开始分配,但这样可能类似。

鉴于时间,我决定实现一个简单的算法:枚举所有可能的分配对于小 n,对于大 n,使用贪心深度分配。

由于题目有部分分,我可以针对不同测试点设计不同算法。

对于测试点1-2,n<=7,我可以暴力枚举每个节点的权值从0到 n-1,计算总价值,取最大。复杂度 O(n^n * n^2),对于 n=7,7^7=823543,乘以计算 mex 的代价,可能可行。

对于测试点3-4,n<=13,暴力可能太大,但可以尝试 meet-in-the-middle 或搜索剪枝。

对于测试点5-6,n<=18,搜索可能困难。

对于测试点7-8,n<=40,可能需要启发式算法。

对于测试点9-12,n<=360,需要多项式算法。

对于 m=2 的点,n<=4000,可能需要 O(n) 或 O(n log n) 算法。

由于我时间有限,我决定先写一个暴力算法对于小 n,对于较大的 n,输出一个贪心结果。

在考试中,这样可能得部分分。

具体实现:

对于每组数据,如果 n<=7,则暴力枚举权值分配。权值范围设为 0 到 n-1,因为更大的权值不会增加 mex 超过 n。枚举每个节点的权值,计算每个节点的 mex,求和,取最大。

枚举可以用递归实现。

对于 n>7,我们使用贪心算法:将节点按深度从大到小排序,然后依次分配权值 0,1,2,...,即第一个节点权值0,第二个权值1,等等。然后计算总价值。

计算总价值需要计算每个节点的 mex,这可以通过 DFS 遍历子树收集权值集合,然后计算 mex。但 mex 计算需要知道集合,我们可以对每个节点 i,收集其子树中所有权值,然后找到最小的不在集合中的数。但这样复杂度 O(n^2),对于 n=8000 可能可行?8000^2=64e6,对于 t<=5,可能 3e8,可能较慢。但我们可以优化。

由于我们分配了权值,我们可以预处理每个节点的子树权值集合,但集合可能很大。但 mex 只关心小权值,所以我们可以维护每个节点子树中权值的最小值,但 mex 需要连续前缀。

我们可以对每个节点 i,维护一个数组出现标记,但需要 O(n) 空间 per node,不行。

我们可以从叶子向上传递集合,但集合需要合并,使用平衡树或位集?由于 n=8000,权值范围0..n-1,我们可以用位集,每个节点一个 bitset<8000>,但空间 8000*8000/8=8MB per bitset,但 n 个节点需要 8000*8MB=64GB,不可能。

我们可以用时间换空间,对每个节点 i,DFS 其子树收集权值,然后计算 mex。对于每个节点 i,DFS 子树大小可能很大,但总复杂度 O(n^2) 最坏。

对于 n=8000,O(n^2)=64e6,在 1 秒可能可行?但 t=5 时,可能 3 秒,或许可以接受。

但贪心算法可能不是最优,但可以快速实现。

我决定实现贪心算法对于所有 n>7,因为暴力只适用于 n<=7。

在计算 mex 时,对于每个节点 i,我们进行 DFS 收集其子树中的权值到一个布尔数组中,但权值范围可能到 n-1,所以数组大小 n。但每次 DFS 需要 O(子树大小) 时间,总时间 O(n^2)。对于 n=8000,应该可行。

但注意,m 可能小,但树可能不平衡,子树大小可能大。

我们可以尝试优化 mex 计算,但先这样。

对于样例,贪心算法会得到第一组 9,第二组 11,但答案是13,所以对于第二组会错误。但可能在某些测试点正确。

为了改进,我们可以尝试不同的贪心策略,比如按照子树大小排序等,但不确定。

鉴于时间,我将采用这个方案。

现在,写代码。

首先,读入 t。
对于每组数据,读入 n,m 和父节点列表。
构建树,计算每个节点的深度,使用 BFS 从根开始。
将节点按深度从大到小排序,深度相同任意顺序。
然后分配权值:从0开始,对于排序后的每个节点,依次分配权值0,1,2,...,直到所有节点都有权值。
然后计算总价值:
初始化总价值为0。
对于每个节点 i,计算 mex(S_i):
我们需要得到 i 的子树中所有节点的权值集合。
可以通过 DFS 从 i 开始,遍历所有后代,收集权值。
然后找到最小的非负整数不在集合中。
将 mex 加到总价值。
输出总价值。

但这样对于每个节点 i DFS 子树,复杂度 O(n^2)。对于 n=8000,最坏 64e6,加上 t=5,可能 3e8,在 2 秒可能较慢,但或许可以接受,因为常数小。

我们可以优化 mex 计算:由于我们只关心小权值,我们可以维护每个节点子树中权值的最小值,但 mex 需要连续,所以我们需要知道是否包含0,1,2,...。我们可以从0开始检查,但最多检查到子树大小,所以对于每个节点 i,我们收集权值后,从0开始检查,直到找到缺失,但收集权值需要时间。

我们可以在 DFS 中同时收集权值到一个 unordered_set 中,然后检查,但检查可能需要 O(k) 其中 k 是 mex 值,可能 O(n)。

总复杂度 O(n^2) 可能没问题。

但为了更快,我们可以从叶子向上传递信息,但 mex 合并复杂。

先实现简单方法。

对于暴力枚举,当 n<=7 时,我们递归分配权值,权值范围 0 到 n-1,因为更大的权值不会使 mex 超过 n。但权值可以大于 n-1,但如果有,那么 mex 可能达到 n,但权值大于 n-1 不会帮助包含小权值,所以最优解中权值应该在 0 到 n-1 之间,且可能不同。但为了简单,我们允许权值从 0 到 n-1,枚举所有分配,即每个节点有 n 种选择,总 n^n 种。对于 n=7,7^7=823543,对于每个分配计算总价值 O(n^2)=49,所以总操作约 40e6,可能可行。

但递归枚举需要小心。

我实现一个递归函数 assign(k) 表示当前分配到第 k 个节点(按节点编号1..n)。对于每个节点,尝试权值从0到 n-1。但这样会有重复分配,即多个节点相同权值,这是允许的。

计算总价值时,对于每个分配,计算每个节点的 mex,需要 O(n^2) 时间,但 n 小,所以可以。

对于 n=7,总时间 7^7 * 7^2 = 7^9 = 40e6,可能 1 秒内。

但注意,对于每组数据,如果 n<=7 则暴力,否则贪心。

但测试点中 n<=7 只有测试点1-2,所以暴力可以。

对于 n>7,使用贪心。

但可能对于 m=2 的点,贪心不是最优,但可能接近。

为了更好,对于 m=2,我们可以尝试另一种贪心:将节点按深度和父节点分组,但实现复杂。

我决定先这样。

现在,编写代码。

注意:计算深度时,根据父节点列表计算。

构建树:对于每个节点 i,存储其孩子列表。

从根节点1开始,计算深度,使用队列。

然后收集节点列表,按深度排序:我们可以创建一个数组 nodes,然后排序,比较深度。

但深度已经计算,我们可以直接创建按深度桶排序,因为深度从0到 m<=800,所以我们可以桶排序。

具体:创建一个向量数组 bucket[m+1],对于每个节点,放入 bucket[depth[i]]。然后从深度 m 到 0 收集节点到列表 order 中。

然后分配权值:遍历 order 列表,权值 val 从0开始,对于每个节点,分配权值 val,然后 val++。

然后计算总价值:
总价值 ans=0。
对于每个节点 i,计算 mex:
我们可以进行 DFS 从 i 开始,但这样重复遍历。我们可以对每个节点 i 进行 DFS,但为了效率,我们可以从叶子向上计算,但 mex 计算需要子树中所有权值。
由于 n 不大,我们可以对每个节点 i 进行 DFS。
实现一个函数 mex(i):
使用一个布尔数组 visited 用于权值,但权值范围 0..n-1,所以我们每次创建一个 vector<bool> has(n+1, false) 但这样每次分配内存可能慢。我们可以使用一个全局数组 has,每次 DFS 前清零,但清零需要 O(n) 时间,所以对于每个节点 i,总 O(n^2) 时间。
但 has 数组大小 n,对于每个 i 清零,总 O(n^2) 时间,加上 DFS 遍历子树,总 O(n^2) 时间。
DFS 遍历子树:从 i 开始,递归或栈,收集权值,标记 has[a[node]]=true。然后从0开始检查 has,直到找到 false,这个值就是 mex。
注意,mex 可能达到 n,所以检查到 n 即可。
由于权值分配在0到 n-1,所以 mex 在0到 n 之间。
这样计算每个节点 i 的 mex,累加。
返回总价值。

但注意,对于每个节点 i DFS 子树时,子树可能包含很多节点,但每个节点会被多次访问,总次数是 sum_{i} |subtree(i)|,这可以很大,最坏 O(n^2)。对于 n=8000,可能 64e6,加上 t=5,可能 3e8,在 2 秒可能勉强,但也许常数小能过。

我们可以尝试优化:使用后序遍历,但 mex 计算需要集合,所以可能难以优化。

由于时间有限,我先这样实现。

代码结构:

对于每组测试数据:

读入 n,m 和父节点数组 p[2..n]。

构建树 children 数组,大小 n+1。

计算深度 depth 数组,使用 BFS 或递归,因为父节点已知,可以从根开始计算深度: depth[1]=0,对于 i=2..n, depth[i]=depth[p[i]]+1。

桶排序节点按深度:创建 vector<int> bucket[m+1],但 m 可能小于实际深度,但题目保证高度不超过 m,所以深度在 0..m 之间。但 m 可能小于最大深度?题目说高度不超过 m,所以最大深度 <= m,所以深度范围 0..m。
所以,对于 i=1..n, bucket[depth[i]].push_back(i)。

收集节点到 order 列表:从 d=m 到 0,将 bucket[d] 中的节点加入 order。

分配权值:创建数组 a[n+1],遍历 order,设 val=0,对于每个节点 u, a[u]=val, val++。

计算总价值:
ans=0
对于每个节点 i=1..n:
创建 vector<bool> has(n+1, false) // 索引 0..n
使用栈 DFS 子树:从 i 开始,将 i 压栈,然后循环:弹出节点 v,标记 has[a[v]]=true,对于每个孩子 c 的 children[v],压栈 c。
然后 mex=0, while has[mex] 为 true, mex++。
ans += mex

输出 ans。

但注意,对于暴力枚举,当 n<=7 时,我们使用递归分配权值。

暴力枚举实现:

定义一个全局数组 a[8] 用于当前分配,节点编号1..n。
递归函数 dfs(k) 表示当前分配节点 k。
如果 k>n,则计算当前分配的总价值,更新最大值。
否则,对于 val 从 0 到 n-1:
a[k]=val
dfs(k+1)

计算总价值函数 compute():
total=0
for i=1..n:
创建 has 数组大小 n+1,初始 false
从 i 开始 DFS 收集子树权值,同前。
计算 mex,加到 total
return total

但注意,在暴力中, n<=7,所以 compute() 中 DFS 可递归。

由于 n 小,我们可以直接计算。

为了加速,我们可以预处理子树节点列表,但 n 小,不需要。

现在,代码。

但注意,对于 n<=7,暴力枚举所有分配,但权值范围 0..n-1,这样可能错过权值大于 n-1 的情况,但如前所述,权值大于 n-1 不会帮助 mex 超过 n,但可能使 mex 达到 n 如果 0..n-1 都出现。但在枚举中,如果权值范围 0..n-1,那么 mex 最大为 n,如果所有权值都出现,则 mex=n。但权值大于 n-1 不会帮助出现更小的权值,所以不会增加 mex 超过 n。因此,限制在 0..n-1 是安全的。

但允许重复权值,所以枚举中允许重复。

对于 n=7,枚举 7^7=823543 种,每种计算总价值需要 O(7^2)=49,所以总操作约 40e6,在 1 秒内可能可行。

但注意,t 可能有多组,但每组 n<=7,所以总时间可能 ok。

现在,编写代码。

由于题目时间限制未知,但 NOIP 通常 1 秒或 2 秒,所以暴力可能只适用于 n<=7。

对于 n>7,使用贪心。

我将在本地测试样例。

对于第一组样例,贪心应该输出9,正确。
对于第二组样例,贪心输出11,但答案是13,所以错误。但可能在某些测试点正确。

为了改善,对于 m=2 的情况,我们可以尝试另一种分配。但为了简单,我暂时这样。

最终,我提交的代码将包括暴力和贪心。

注意:在计算深度时,使用给定的父节点列表,直接计算深度数组,因为父节点编号小于自身,所以可以顺序计算深度。

伪代码:

for each test case:
read n,m
read p[2..n]
depth[1]=0
for i=2 to n:
depth[i]=depth[p[i]]+1
create vector<int> bucket[m+1]
for i=1 to n:
bucket[depth[i]].push_back(i)
vector<int> order
for d from m down to 0:
for u in bucket[d]:
order.push_back(u)
a = vector<int>(n+1)
val=0
for u in order:
a[u]=val
val++
ans=0
for i=1 to n:
vector<bool> has(n+1, false)
stack<int> st
st.push(i)
while not st.empty():
v=st.top(); st.pop()
has[a[v]]=true
for each child c of v:
st.push(c)
mex=0
while mex<=n and has[mex]:
mex++
ans += mex
print ans

但注意,在贪心中,我们假设了所有节点都被分配了权值,即 val 从0到 n-1,所以权值范围 0..n-1。

对于暴力, n<=7。

代码实现。

由于题目要求多组测试数据,注意每组数据前清空数据结构。

现在,写代码。

在 C++ 中,使用 vector 存储孩子。

由于 n 可能达到 8000,使用 vector<vector<int>> children(n+1)。

在计算 mex 时,对于每个节点 i,我们使用栈 DFS 子树,但需要访问孩子,所以 children 列表需要。

注意,在贪心分配中,我们按照深度从大到小分配权值 0,1,2,...,这可能会导致权值不连续出现在子树中,但计算 mex 时会考虑。

现在,我将代码提交。

但注意,对于暴力部分,当 n<=7 时,我们使用递归枚举,但 n 可能为7,所以递归深度为7。

为了安全,我设置一个最大值 n=7 为暴力阈值。

现在,写代码。

由于时间,我不再优化。

最终代码将如下所示。
:::
:::info[代码]
```cpp
#include <bits/stdc++.h>
using namespace std;

// 暴力枚举,适用于 n <= 7
int brute(int n, const vector<vector<int>>& children) {
    vector<int> a(n + 1);
    int max_val = 0;

    function<void(int)> dfs = [&](int k) {
        if (k > n) {
            // 计算当前分配的价值
            int total = 0;
            for (int i = 1; i <= n; ++i) {
                vector<bool> has(n + 1, false);
                function<void(int)> collect = [&](int u) {
                    has[a[u]] = true;
                    for (int v : children[u]) collect(v);
                };
                collect(i);
                int mex = 0;
                while (mex <= n && has[mex]) ++mex;
                total += mex;
            }
            if (total > max_val) max_val = total;
            return;
        }
        for (int val = 0; val < n; ++val) {
            a[k] = val;
            dfs(k + 1);
        }
    };

    dfs(1);
    return max_val;
}

// 贪心策略:按深度从大到小分配权值 0,1,2,...
int greedy(int n, int m, const vector<int>& depth, const vector<vector<int>>& children) {
    // 按深度桶排序
    vector<vector<int>> bucket(m + 1);
    for (int i = 1; i <= n; ++i) bucket[depth[i]].push_back(i);

    vector<int> order;
    for (int d = m; d >= 0; --d)
        for (int u : bucket[d]) order.push_back(u);

    vector<int> a(n + 1);
    int val = 0;
    for (int u : order) a[u] = val++;

    // 计算总价值
    int ans = 0;
    for (int i = 1; i <= n; ++i) {
        vector<bool> has(n + 1, false);
        stack<int> st;
        st.push(i);
        while (!st.empty()) {
            int v = st.top(); st.pop();
            has[a[v]] = true;
            for (int c : children[v]) st.push(c);
        }
        int mex = 0;
        while (mex <= n && has[mex]) ++mex;
        ans += mex;
    }
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int t;
    cin >> t;
    while (t--) {
        int n, m;
        cin >> n >> m;
        vector<int> p(n + 1);
        for (int i = 2; i <= n; ++i) cin >> p[i];

        vector<vector<int>> children(n + 1);
        for (int i = 2; i <= n; ++i) children[p[i]].push_back(i);

        vector<int> depth(n + 1);
        depth[1] = 0;
        for (int i = 2; i <= n; ++i) depth[i] = depth[p[i]] + 1;

        int ans;
        if (n <= 7) {
            ans = brute(n, children);
        } else {
            ans = greedy(n, m, depth, children);
        }
        cout << ans << '\n';
    }
    return 0;
}

::: 评测记录(8pts)(官方数据)

[NOIP2025T4] 序列询问 / query

思考次数:1 次。
思考时间:690 秒。

:::success[思考过程] 我们被问到:"尽可能的快速解决这道题,如果无法解决,请尽可能的拿高分。"

题目:P14638 [NOIP2025] 序列询问 / query(民间数据)

问题:给定序列 a[1..n],q 次询问,每次给出 L,R。对于每个位置 i,定义 ki = 所有包含 i 且长度在 [L,R] 内的区间 [l,r] 的最大区间和。我们需要输出 xor{i=1}^n ( (i * k_i) mod 2^{64} )。

我们需要对每次询问快速计算这个值。

约束:n ≤ 5e4, q ≤ 1024, |a_i| ≤ 1e5。

所以总询问次数可能达到 1024,我们需要对每次询问在合理时间内计算所有 k_i。

直接暴力:对于每个询问,对每个 i,考虑所有包含 i 且长度在 [L,R] 内的区间。区间数量 O(nR) 可能很大(R 最大 n=5e4),不可行。

我们需要更高效的方法。

观察:ki = max{l ≤ i ≤ r, L ≤ r-l+1 ≤ R} (sum[l..r])。这是一个带长度限制的最大子段和问题,但要求对于每个位置 i 作为包含点。这类似于每个点的最大覆盖子段和。

我们考虑对每个询问分别处理。

设询问的区间长度限制为 [L,R]。我们需要对每个 i 计算:

ki = max{len ∈ [L,R]} max_{l: l ≤ i ≤ l+len-1} (sum[l..l+len-1])

另一种表示:固定 i,区间必须包含 i。所以 l 满足 l ≤ i ≤ r,且 r-l+1 ∈ [L,R]。我们可以枚举区间长度 len,那么 l 的范围是 max(1, i-len+1) 到 min(i, n-len+1)。然后我们需要这些区间中最大的 sum[l..l+len-1]。注意 sum[l..l+len-1] = pre[l+len-1] - pre[l-1],其中 pre 是前缀和。

所以对于固定的 len,我们需要对每个 i,考虑所有 l 满足 l ≤ i ≤ l+len-1,即 i-len+1 ≤ l ≤ i。然后在这些 l 中,求 max_{l} (pre[l+len-1] - pre[l-1])。但注意这个值只依赖于 l,与 i 无关。所以对于固定的 len,我们可以预先计算出所有长度为 len 的区间的和,记作 w[l] = sum[l..l+len-1] = pre[l+len-1] - pre[l-1]。那么对于位置 i,包含 i 的长度为 len 的区间就是那些 l ∈ [i-len+1, i] ∩ [1, n-len+1] 的区间。所以 k_i 关于 len 的最大值就是:ki = max{len ∈ [L,R]} max_{l ∈ [max(1, i-len+1), min(i, n-len+1)]} w[l]。

所以问题转化为:对于每个询问 [L,R],我们需要对每个 i 计算 max_{len ∈ [L,R]} (区间 [i-len+1, i] ∩ [1, n-len+1] 上的 w[len][l] 的最大值),其中 w[len][l] 是长度为 len 的区间和。

如果对于每个 len 我们都计算 w[len][l](一个数组),那么对于每个 i,我们需要求所有 len 在 [L,R] 中,且在 i 处对应的 l 区间上的最大值。这看起来像是一个二维查询:对于每个 i,考虑所有 len,每个 len 给出一个区间 [A(i,len), B(i,len)],然后求这些区间上的 w[len][l] 的最大值。但 len 有 O(n) 种,直接枚举 len 不可行。

注意到 R ≤ n,但 n=5e4,q=1024,如果我们能对每个询问在 O(n log n) 或 O(n sqrt(n)) 时间内解决,总时间可能是 5e4 * 1024 ≈ 5e7,或许可过?但可能有点紧。不过我们需要更高效的算法。

另一种思路:k_i 是包含 i 且长度在 [L,R] 内的最大子段和。这可以看作是一个滑动窗口的最大子段和问题,但窗口长度可变。或许我们可以用分治或数据结构。

考虑用线段树维护区间信息,但这里长度限制是全局的。

或许我们可以对每个位置 i,考虑以 i 为结尾或开头的最大子段和,但包含 i 的区间不一定以 i 结尾。

另一种常见技巧:对于最大子段和问题,我们可以用单调队列或 RMQ。但这里是每个点都要问。

也许我们可以预处理出所有区间和,然后对于每个询问,我们需要对每个 i 快速得到覆盖 i 的区间中长度在 [L,R] 内的最大区间和。这类似于一个区间覆盖查询:每个区间 [l,r] 有权值 w,对于每个点 i,查询所有覆盖 i 且长度在 [L,R] 内的区间的最大权值。然后输出答案。

现在区间总数量是 O(n^2),不能全部枚举。但我们可以考虑按长度分组。

设所有长度为 len 的区间,我们有一个权值数组 w_len[l] = sum[l..l+len-1]。那么对于点 i,覆盖 i 的长度为 len 的区间是 l 在 [i-len+1, i] 内(且 1 ≤ l ≤ n-len+1)。所以如果我们对每个 len 都预处理出 wlen[l] 的 RMQ(比如线段树或稀疏表),那么对于给定的 len,我们可以 O(1) 得到对于点 i,覆盖 i 的长度为 len 的区间的最大权值:即在 l 的范围上的最大值。那么对于询问 [L,R],我们需要对每个 i 计算 max{len ∈ [L,R]} RMQ_len(query range for i and len)。如果枚举 len,对于每个 i 需要 O(R-L+1) 时间,总 O(n*(R-L+1)),最坏 O(n^2) 不可接受。

我们需要同时处理多个 len。考虑对 len 建数据结构吗?或者对 i 建数据结构。

注意到对于每个 i,随着 len 变化,查询区间 [i-len+1, i] 是变化的。也许我们可以用扫描线。

另一种想法:对于每个询问,我们可以用滑动窗口?但长度限制是一个范围,不是固定值。

或许我们可以用分块技巧。因为 n=5e4, q=1024,我们可以考虑 O(n sqrt(n)) 每询问。

观察特殊性质:A: L_j = R_j,即固定长度。那么对于每个询问,长度固定为 L。那么 ki = max{l ∈ [i-L+1, i]} w_L[l],其中 w_L[l] 是长度为 L 的区间和。所以我们可以 O(n) 预处理 w_L 数组,然后对每个 i 用滑动窗口最大值(单调队列)在 O(n) 时间内得到所有 i 的 k_i。所以性质 A 可以轻松解决。

性质 B: R_j ≤ 32,即长度限制很小。那么对于每个询问,我们可以枚举所有 len ∈ [L,R],对每个 len 用上述方法得到每个 i 的对于该 len 的最大值,然后取 max over len。由于 R-L+1 ≤ 32,所以每个询问 O(32 n) = O(n),很好。

性质 C: L_j ≤ 16 且 R_j ≥ n-1000。这意味着长度限制很大,几乎覆盖整个数组。那么对于每个 i,可能有很多区间。但注意到 L 很小,R 很大。我们可以考虑对短长度和长长度分别处理。短长度可以直接枚举(L ≤ 16),长长度可能接近 n,但 R ≥ n-1000,所以长长度的数量最多 1000 种?实际上 len 从 n-1000 到 n。所以总共长度种类最多 1016 种?但 L 可能很小,从 L 到 R 可能很多,R 可以到 n=5e4,所以如果 L 很小,枚举所有 len 不可行。但性质 C 说 L ≤ 16 且 R ≥ n-1000,所以长度范围很大,但长长度部分只有约 1000 种,短长度部分只有 16 种。所以我们可以分别处理:对于 len ∈ [L, min(R, n)],但 R 可能比 n-1000 大,但 R ≤ n。所以 len 从 L 到 R,其中 L ≤ 16,R ≥ n-1000。那么 len 可以分为两部分:len ∈ [L, 16] 和 len ∈ [max(17, n-1000), R]。但注意如果 n-1000 < 16,会有重叠,但 n=5e4,所以 n-1000 很大。所以短长度最多 16 种,长长度最多 1000 种,总共约 1016 种,每个询问枚举所有 len 是 O(1016 n) ≈ 5e7,可能可行?但 q 最大 1024,总时间 5e7 1024 太大。但我们可以对每个询问只做一次扫描,对于每个 len 我们都需要计算每个 i 的覆盖最大值,然后合并。如果枚举 len,每个 len 需要 O(n) 时间计算所有 i 的该 len 下的最大值(可以用单调队列或 RMQ?对于每个 len,我们需要对每个 i 查询区间 [i-len+1, i] 上的 w_len 最大值。如果我们预处理 w_len 数组,那么对于固定 len,我们可以用滑动窗口最大值吗?注意窗口大小是变化的:对于每个 i,查询的区间长度是 len?不对,查询的区间是 l 的范围,其长度恰好是 len?实际上 l 从 i-len+1 到 i,所以区间长度是 len。但 w_len 数组长度是 n-len+1。对于每个 i,我们需要在 w_len 的一段区间上求最大值,这段区间不一定连续?实际上,对于固定的 len,w_len 的下标 l 从 1 到 n-len+1。对于点 i,覆盖 i 的区间对应的 l 是那些满足 l ≤ i ≤ l+len-1 的 l,即 l ∈ [i-len+1, i]。但 l 必须也在 [1, n-len+1] 内。所以查询区间是 [max(1, i-len+1), min(i, n-len+1)]。这个区间长度最多为 len,但可能小于 len。如果我们对每个 len 预处理 w_len 的稀疏表,那么对于每个 i 可以 O(1) 查询。那么对于每个询问,枚举所有 len,对每个 i 查询该 len 下的最大值,然后取 max,总时间 O(n (R-L+1)),如果 R-L+1 很小(如性质 B 或 C)可能可行,但一般情况 R-L+1 可能很大(最大 n),不可行。

所以我们需要更聪明的方法。

考虑分治:对于每个询问,我们可能用线段树在 O(n log n) 时间内计算所有 k_i?或许我们可以将问题转化为:对于每个 i,ki = max{len ∈ [L,R]} (max_{l ∈ [i-len+1, i]} wlen[l])。如果我们定义 f(i, len) = max{l ∈ [i-len+1, i]} w_len[l],那么 ki = max{len ∈ [L,R]} f(i, len)。我们需要同时处理 len 维和 i 维。

注意到 f(i, len) 可以看作是以 i 为右端点,左端点距离至少为 len-1 的区间最大值?不完全是。

另一种视角:区间 [l, r] 的长度 len = r-l+1。那么包含 i 的区间满足 l ≤ i ≤ r。我们可以考虑以 i 为分界,左边取一段,右边取一段。但长度限制是总长度。

或许我们可以枚举区间中心?但长度限制是总长度。

也许我们可以用数据结构维护所有可能的区间。因为区间数量 O(n^2),但我们可以按右端点排序,然后扫描右端点,用线段树维护每个左端点的区间和。然后对于每个点 i,我们需要查询所有覆盖 i 且长度在 [L,R] 的区间的最大值。我们可以考虑离线处理所有询问,对于每个询问,我们可能需要用一些技巧。

注意到 q 只有 1024,n 50000,或许我们可以对每个询问 O(n sqrt(n)) 或 O(n log^2 n) 解决。总时间 1024 50000 log^2 可能有点大,但也许可接受?50000 * 1024 ≈ 5e7,再乘 log^2 (约 400) 得 2e10,太大。所以我们需要接近线性的每询问时间。

或许我们可以预处理一些信息,使得查询更快。

考虑分块序列。将序列分成大小为 B 的块。那么对于每个询问,我们可以用块间信息快速计算?不太明显。

另一个想法:注意到 ki 是包含 i 的区间最大和,长度限制。我们可以考虑对每个 i,求出以 i 为中心(或包含 i)的最大区间和,这是一个经典问题,可以用线段树维护前缀和,然后对于每个 i,我们需要找到 l ≤ i 和 r ≥ i 使得 r-l+1 ∈ [L,R] 且 pre[r] - pre[l-1] 最大。即 max{l ≤ i, r ≥ i, r-l+1 ∈ [L,R]} (pre[r] - pre[l-1])。固定 i,我们可以枚举 l 或 r。但直接枚举不行。

我们可以将条件改写:设区间长度为 len,则 l 和 r 满足 r = l+len-1。那么对于给定的 l,r 确定。但我们需要 i 在 [l, r] 内,即 l ≤ i ≤ l+len-1。所以对于给定的 l,有效的 len 必须满足 len ≥ i-l+1,且 len ≤ R,且 len ≥ L。所以对于每个 l,它对 i 的贡献只对那些 i ∈ [l, l+len-1] 且 len ∈ [L,R] 有效。但 len 是变化的。

我们可以考虑对每个 l,计算 w_len[l] 对于所有 len ∈ [L,R] 的值,然后对于每个 i,我们需要所有满足 l ≤ i ≤ l+len-1 的 (l, len) 中的最大 w。这相当于一个二维点集 (l, len) 带有权值 w,对于每个 i,查询所有满足 l ≤ i ≤ l+len-1 的点中的最大权值。条件 l ≤ i ≤ l+len-1 等价于 l ≤ i 且 l ≥ i-len+1,即 l ∈ [i-len+1, i]。但 len 也在变化。

如果我们固定 l,那么对于每个 len,区间覆盖的点是 [l, l+len-1]。所以每个点 (l, len) 覆盖一个区间。然后对于每个 i,查询所有覆盖 i 的点 (l, len) 中的最大权值。这是一个区间覆盖问题,我们可以用线段树按 l 扫描,当扫描到 i 时,我们需要考虑所有 l ≤ i 且覆盖 i 的点。我们可以将点按覆盖区间加入和删除。但 len 维度怎么处理?每个点 (l, len) 有权值 w_len[l]。我们可以将 len 视为时间?不。

或许我们可以离线处理所有询问,对每个询问单独处理。对于固定询问 [L,R],我们需要对每个 i 计算上述最大值。我们可以考虑从左到右扫描 i,维护数据结构,使得我们能够快速查询覆盖当前 i 的所有 (l, len) 的最大权值。

当我们扫描 i 时,对于每个 l < i,其对应的 len 必须满足 i ≤ l+len-1,即 len ≥ i-l+1。所以对于固定的 l,当 i 增加时,最小的 len 需求增加。所以对于每个 l,有效的 len 范围是 [max(L, i-l+1), R]。我们需要在这些 len 中取最大的 w_len[l]。注意 w_len[l] 只依赖于 l 和 len。所以对于每个 l,我们可以预处理一个关于 len 的数据结构,快速查询在 len 区间内的最大 w_len[l]。但 w_len[l] 对于不同的 len 是独立的。如果我们对每个 l 都建一个关于 len 的 RMQ,那么对于每个 i,对于每个 l ≤ i,我们查询 l 对应的 len 区间 [max(L, i-l+1), R] 中的最大 w,然后取这些最大值中的最大值。但这样需要对每个 i 枚举所有 l ≤ i,O(n^2) 不可接受。

我们需要一个能够同时处理所有 l 的数据结构。也许我们可以用线段树维护每个位置 l 的当前有效最大 w(即对于当前 i,对 l 查询其有效 len 区间内的最大 w_len[l],记作 best[l])。然后对于每个 i,我们需要查询所有 l ≤ i 的 best[l] 的最大值。但 best[l] 依赖于 i,因为有效 len 区间依赖于 i。所以当 i 变化时,best[l] 也会变化。我们需要动态更新 best[l]。当 i 增加时,对于每个 l,其所需的 min len 增加,所以 best[l] 可能需要更新。但更新 best[l] 需要查询 l 对应的 w_len[l] 在 len 区间 [max(L, i-l+1), R] 的最大值。如果我们可以快速更新 best[l],那么我们可以用线段树维护 best[l] 的最大值,对于每个 i,答案就是查询 [1, i] 的最大值。但还有一点:对于 l,它必须满足 l ≤ i,但我们已经只考虑 l ≤ i,所以没问题。

现在问题转化为:对于每个 l,我们需要维护一个数组 w_len[l] for len ∈ [L,R],支持查询区间 [low, R] 的最大值,其中 low = max(L, i-l+1) 随着 i 增加而增加。所以 low 是单调递增的。因此,对于每个 l,我们可以用一个指针指向当前有效的 len 区间,但 w_len[l] 可能不是单调的,所以我们需要 RMQ 数据结构。由于 R-L+1 可能很大,我们需要每个 l 有一个快速查询的结构。但如果我们对每个 l 都建一个稀疏表,空间 O(n*(R-L+1)) 可能太大。但注意每个询问的 L,R 不同,所以不能预先对所有 len 建。

或许我们可以考虑对 len 分块。因为 n=5e4,我们可以考虑设块大小 B=sqrt(n)≈224。对于每个询问,我们可以预处理所有长度 len 的 w_len 数组吗?存储所有 w_len 需要 O(n^2) 空间,不行。

但我们可以不存储所有 w_len,而是需要时计算。注意到 w_len[l] = pre[l+len-1] - pre[l-1]。所以对于给定的 l 和 len,可以 O(1) 计算。

所以对于每个 l,我们需要多次查询 w_len[l] 在 len 区间上的最大值。如果查询次数很多,我们可以预处理一些信息。

观察:对于固定的 l,w_len[l] 是 len 的函数:w_len[l] = pre[l+len-1] - pre[l-1]。随着 len 增加,w_len[l] 变化取决于 a 的值。它不是单调的。所以我们需要 RMQ。但如果我们对每个 l 都建一个稀疏表,建表需要 O((R-L+1) log (R-L+1)) 时间,总共有 n 个 l,总时间 O(n * (R-L+1) log),不可接受。

所以我们需要更高效的方法。

也许我们可以换个思路:对于每个询问,我们可以用分治算法计算所有 k_i。考虑中点 mid,计算跨越 mid 的区间对答案的贡献。对于每个 i,包含 i 的区间可能完全在左半、完全在右半或跨越 mid。对于完全在左半或右半的,我们可以递归处理。对于跨越 mid 的区间,它们必须包含 mid(或 mid 和 mid+1?)。但我们需要包含 i,所以如果 i 在左半,跨越 mid 的区间可能包含 i。我们可以对左半的每个 i,考虑跨越 mid 且包含 i 的区间。类似地对于右半。

具体地,对于当前分治区间 [s, t],中点 m = (s+t)/2。我们需要计算对于 i ∈ [s, t],包含 i 且长度在 [L,R] 内的最大区间和,但区间必须完全在 [s, t] 内吗?不,因为整个序列是全局的,所以区间可以跨越多个分治块。但分治时我们只考虑区间完全在 [s,t] 内?如果我们做 divide and conquer,我们通常处理跨越中点的区间,然后递归左右。但这里区间不一定完全在当前分治区间内,所以不能直接分治。

或许我们可以用线段树维护每个区间的信息,然后合并时考虑跨过两个子区间的区间。

但我们需要对每个位置 i 计算包含它的最大区间和。这类似于一个“历史最大覆盖和”问题。

另一种思路:我们可以将问题转化为:对于每个区间长度 len,我们有一个序列 b_len[i] 表示以 i 为右端点(或左端点)的长度为 len 的区间和?不。

再思考:ki = max{l ≤ i ≤ r, r-l+1 ∈ [L,R]} (pre[r] - pre[l-1])。我们可以将其拆分为:ki = max{l ≤ i} max{r ≥ i, r-l+1 ∈ [L,R]} (pre[r] - pre[l-1])。令 g(l, i) = max{r ≥ i, r-l+1 ∈ [L,R]} (pre[r] - pre[l-1])。那么 ki = max{l ≤ i} g(l, i)。对于固定的 l,g(l, i) 是关于 i 的函数。i 必须满足存在 r ≥ i 使得 r-l+1 ∈ [L,R],即 r ∈ [i, n] 且 r ∈ [l+L-1, l+R-1]。所以有效的 r 区间是 [max(i, l+L-1), min(n, l+R-1)]。当 i 变化时,这个区间变化。g(l, i) = max{r ∈ [max(i, l+L-1), min(n, l+R-1)]} pre[r] - pre[l-1]。所以 g(l, i) = (max{r ∈ I(i)} pre[r]) - pre[l-1],其中 I(i) = [max(i, l+L-1), min(n, l+R-1)]。所以对于固定的 l,我们需要对每个 i 计算在某个区间上的 pre[r] 的最大值。这个区间随着 i 增加,左端点 max(i, l+L-1) 非降,右端点固定(直到 i 超过某个值后区间可能为空)。所以我们可以用单调队列或稀疏表预处理 pre 数组的 RMQ,然后对于每个 l,我们可以快速计算 g(l, i) 吗?但 i 是变量,我们需要对每个 i 都计算,如果对每个 l 都枚举 i,又是 O(n^2)。

但我们可以交换顺序:对于每个 i,我们需要所有 l ≤ i 的 g(l, i) 的最大值。所以如果我们能对每个 i 快速计算所有 l ≤ i 的 g(l, i),那就好了。

注意到 g(l, i) 可以写成:如果 i ≤ l+L-1,那么 I(i) = [l+L-1, min(n, l+R-1)],所以 g(l, i) = constant for i ≤ l+L-1;如果 i > l+L-1,那么 I(i) = [i, min(n, l+R-1)],所以 g(l, i) 依赖于 i。当 i 增加,区间左端点增加,最大值可能减小。

也许我们可以用线段树扫描 i。对于每个 l,我们可以将 g(l, i) 视为一个分段函数,插入到线段树中,然后对于每个 i 查询最大值。

具体地,对于固定的 l,定义函数 f_l(i) = g(l, i) for i ∈ [l, ?]。注意只有当 i ∈ [l, l+R-1] 时区间才可能非空(因为 r ≥ i 且 r ≤ l+R-1),所以 i 的有效范围是 [l, l+R-1]。而且还需要 i ≥ l(因为 l ≤ i),且 i ≤ n。所以 i ∈ [l, min(n, l+R-1)]。在这个区间上,fl(i) = max{r ∈ [max(i, l+L-1), min(n, l+R-1)]} pre[r] - pre[l-1]。我们可以预处理 pre 数组在区间 [l+L-1, min(n, l+R-1)] 上的最大值,记作 M_l。那么当 i ≤ l+L-1 时,f_l(i) = M_l - pre[l-1]。当 i > l+L-1 时,fl(i) = max{r ∈ [i, min(n, l+R-1)]} pre[r] - pre[l-1]。所以当 i 增加时,f_l(i) 非增(因为最大值区间缩小)。而且我们可以用单调队列预处理 pre 的后缀最大值?但这里对于每个 l,最大值区间右端点是固定的,所以实际上 f_l(i) = max( pre[i..min(n, l+R-1)] ) - pre[l-1],当 i ≥ l+L-1。所以如果我们能快速得到 pre 在 [i, min(n, l+R-1)] 的最大值,我们可以用 RMQ。但每个 l 不同。

如果我们有所有位置 pre 的 RMQ(稀疏表),那么对于给定的 l 和 i,我们可以 O(1) 计算 fl(i)。但我们需要对每个 i 求 max{l ≤ i} f_l(i)。这又需要枚举 l。

所以我们需要一个数据结构,支持当 i 增加时,维护所有 l ≤ i 的 f_l(i) 的最大值。但 f_l(i) 随着 i 变化而变化。我们可以考虑每个 l 对一段 i 区间的贡献。对于每个 l,f_l(i) 在 i ∈ [l, l+L-1] 上是常数,在 i ∈ [l+L, l+R-1] 上是递减的(可能)。我们可以将 f_l(i) 分解为几个区间,每个区间上 f_l(i) 是一个常数或者是一个需要查询 pre RMQ 的函数。但后者不太容易表示为简单的形式。

也许我们可以用分块处理询问。因为 q 不大,我们可以对每个询问设计一个 O(n sqrt(n)) 的算法。

考虑将序列分成块,块大小 B ≈ sqrt(n) ≈ 224。对于每个询问 [L,R],我们分别计算每个块内和跨块的贡献。

对于每个位置 i,包含 i 的区间可能完全在 i 所在块内,也可能跨越多个块。我们可以处理每个块内的信息,然后合并。

但长度限制 L,R 可能很大,跨块区间可能很多。

另一种想法:因为 n=5e4,我们可以考虑 O(n^2) 预处理一些信息,然后每个询问 O(n) 或 O(n log n)。但 O(n^2) 预处理对于 n=5e4 是 2.5e9,太大。

也许我们可以利用 q 只有 1024,所以总计算量可以略高,比如 5e7 左右。

观察到对于每个询问,我们需要计算 n 个值。如果我们能在 O(n log n) 时间内完成,总时间 5e4 1024 log(5e4) ≈ 5e4 1024 16 ≈ 8e8,可能有点大,但或许常数小可过?但风险高。

我们需要更接近 O(n sqrt(n)) 每询问,即 5e4 * 224 ≈ 1.12e7,乘以 1024 得 1.15e10,还是太大。所以我们需要每询问 O(n) 或 O(n log n) 但 log 要小,且常数小。

或许我们可以用莫队?但莫队通常用于区间查询,这里是点查询。

再思考:ki = max{len ∈ [L,R]} max_{l ∈ [i-len+1, i]} w_len[l]。如果我们对 len 使用单调队列?但 len 是区间长度。

注意到对于固定的 i,当 len 增加时,查询区间 [i-len+1, i] 向左移动。所以 f(i, len) = max_{l ∈ [i-len+1, i]} w_len[l] 是 len 的函数。我们需要在 len ∈ [L,R] 上求最大值。如果我们能快速计算 f(i, len) 对于所有 len 的值,那么我们就可以用 RMQ 在 len 上求最大值。但 f(i, len) 需要查询 w_len 在滑动窗口上的最大值,窗口大小固定为 len?不对,窗口左端点 i-len+1,右端点 i,但 w_len 数组的下标 l 范围是 1..n-len+1,所以对于固定的 i 和 len,查询的区间是 [max(1, i-len+1), min(i, n-len+1)]。这个区间长度随着 len 变化而变化。

如果我们能预处理出所有 w_len 数组的稀疏表,那么对于固定的 i 和 len,我们可以 O(1) 计算 f(i, len)。然后对于每个 i,我们需要在 len ∈ [L,R] 上求 f(i, len) 的最大值。如果枚举 len,O(R-L+1) 对于每个 i 太大。但也许我们可以对于每个 i,用一些优化方法快速找到最优的 len。

考虑 i 固定,定义函数 h(len) = f(i, len)。我们需要 max_{len ∈ [L,R]} h(len)。h(len) 可能不是凸的,所以不能三分。但也许我们可以用分块在 len 上:将 len 分成块,预处理每个块内对于所有 i 的信息?但 i 和 len 都变化,二维问题。

或许我们可以用决策单调性?没有明显单调性。

由于时间限制不明确,我们需要设计一个能尽可能得高分的算法,即使不是满分。

考虑部分分:

测试点1: n≤1000, q=1。我们可以暴力:对于每个 i,枚举所有包含 i 且长度在 [L,R] 的区间,计算和并取最大值。区间数量:对于每个 i,区间长度 len 从 L 到 R,对于每个 len,有 len 个区间包含 i?不对,对于固定 i 和 len,包含 i 的长度为 len 的区间数量最多为 len(当 i 在中间时),但平均每个 i 的区间数量约为 O(R-L+1)n?实际上,总区间数 O(n^2),对于每个 i 枚举所有包含它的区间,总复杂度 O(n^3) 可能太大。但 n=1000,q=1,O(n^3)=1e9,可能勉强?但我们可以优化:预处理前缀和,然后枚举所有区间 [l,r] 满足长度在 [L,R],计算和,然后对于每个 i ∈ [l,r],用这个和更新 k_i。这样总复杂度 O(区间数 区间长度) 还是大。我们可以直接枚举区间,然后更新区间内所有点的 k_i,用线段树区间更新取最大值?但我们需要对每个询问单独做。对于 q=1,我们可以枚举所有区间,区间数 O(n(R-L+1)),最坏 O(n^2)=1e6,每个区间更新区间内所有点,如果暴力更新又是 O(区间长度),总 O(n^3)。但我们可以用差分或扫描线:对于每个区间 [l,r],其权值为 w,那么它对区间内的所有 i 的 k_i 有贡献,即 k_i = max(k_i, w)。所以我们可以考虑所有区间,对每个区间,我们需要将区间内所有点的 k_i 与 w 取 max。这是一个区间取 max 操作。最后查询每个点的 k_i。我们可以用线段树支持区间取 max 和单点查询?但这里我们需要历史最大值,最终取每个点的最大值。我们可以将区间按权值排序,从大到小覆盖?但区间取 max 不满足结合律,不能直接线段树。我们可以用扫描线:对于每个点 i,我们需要所有覆盖 i 的区间的最大权值。所以我们可以将区间按权值排序,然后依次覆盖,但后覆盖的如果权值小可能不影响。我们可以用并查集跳过已覆盖的点?类似于区间覆盖问题。具体:将所有区间按权值从大到小排序,然后依次处理每个区间,将区间内所有未被覆盖的点 i 的 k_i 设为该权值,并将这些点标记为已覆盖。可以用并查集维护下一个未覆盖的点。这样总复杂度 O(区间数 α(n)),但区间数 O(n^2)=2.5e7 对于 n=1000 是 1e6?n=1000,区间数最多约 n^2/2=5e5,排序 O(5e5 log 5e5) 可行,然后并查集覆盖每个区间最多 O(区间长度),总 O(所有区间长度和) ≈ O(n^3) 可能还是大。但我们可以优化:因为每个点只被覆盖一次,所以总覆盖操作 O(n),每个区间尝试覆盖时,我们只访问未覆盖的点,用并查集跳过已覆盖点,所以每个点最多被访问一次,因此总复杂度 O(区间数 + n)?不对,对于每个区间,我们需要遍历区间内所有未覆盖点,但用并查集可以快速跳到下一个未覆盖点,所以每个点最多被覆盖一次,因此所有区间覆盖的总时间是 O(n α(n))。但我们需要对每个区间执行这样的操作:从 l 开始,找到下一个未覆盖点,覆盖它,然后继续,直到超过 r。所以总操作次数是覆盖的点数,即 n。所以总复杂度 O(区间数 + n)。区间数 O(n^2),对于 n=1000 是 5e5,可行。所以对于测试点1,我们可以用这种方法:枚举所有区间 [l,r] 满足长度在 [L,R],计算权值 w,然后将区间和权值存入列表。然后按权值从大到小排序,用并查集初始化每个点的 next 为自身,然后对于每个区间,从 l 开始,找到 next[x],如果 next[x] ≤ r,则将 k[next[x]] 设为 w,并将 next[x] 设为 next[x]+1(或合并),继续直到超过 r。最后得到每个点的 k_i。然后计算答案。注意权值可能为负,但按权值从大到小排序,负的区间可能不会覆盖任何点如果已经有更大的?但有可能所有区间都是负的,那么每个点都需要被覆盖。所以这个方法有效。复杂度 O(n^2 log n) 预处理区间并排序,然后 O(n α(n)) 覆盖。对于 n=1000 可行。

对于更大的 n,n=5e4,区间数 O(n^2)=2.5e9,无法枚举。

所以我们需要针对更大 n 的算法。

考虑特殊性质 A: L=R。那么每个询问长度固定为 L。我们可以用滑动窗口最大值:预处理 w_L[l] = sum[l..l+L-1],然后对于每个 i,ki = max{l ∈ [i-L+1, i]} w_L[l]。我们可以用单调队列从前往后扫描:维护一个递减队列,存储 w_L[l] 和下标。对于每个 i,我们需要查询下标在 [i-L+1, i] 范围内的最大值。由于窗口大小固定为 L,我们可以用标准滑动窗口最大值算法,但注意这里 i 是位置,查询的区间是 [i-L+1, i],但 w_L 的下标 l 范围是 1..n-L+1。对于 i < L 或 i > n 需要小心边界。具体:对于每个 i,有效的 l 必须满足 l ≤ i ≤ l+L-1,即 l ∈ [i-L+1, i]。同时 l 必须在 [1, n-L+1] 内。所以实际上对于每个 i,l 的范围是 [max(1, i-L+1), min(i, n-L+1)]。我们可以用单调队列处理所有 l,然后对于每个 i,队列中的最大值可能不在有效范围内,所以我们需要弹出超出范围的下标。但窗口左边界是 max(1, i-L+1),右边界是 min(i, n-L+1)。这个窗口大小不固定,因为左边界和右边界都随 i 变化。但我们可以用两个单调队列?或者直接枚举 i,对每个 i 查询 RMQ。如果我们预处理 w_L 的稀疏表,那么每个 i 可以 O(1) 查询,总 O(n)。但稀疏表预处理 O(n log n),查询 O(1)。对于每个询问,我们都需要建一次稀疏表,但 L 固定,我们可以只建一次 w_L 数组,然后建稀疏表。总复杂度 O(n log n + n) 每询问。因为 q 可能 1024,总 O(q n log n) ≈ 10245e416=8.2e8,可能有点大,但常数小或许可过?但我们可以用滑动窗口单调队列直接 O(n) 得到每个 i 的答案:实际上,我们可以计算数组 ans[i] 表示包含 i 的长度为 L 的区间的最大和。我们可以用以下方法:对于每个 i,包含 i 的长度为 L 的区间,其左端点 l 在 [i-L+1, i] 内,所以 ans[i] 就是 w_L 在区间 [max(1, i-L+1), min(i, n-L+1)] 的最大值。我们可以用单调队列从前往后扫描,维护一个大小为 L 的窗口?但 w_L 数组的长度是 n-L+1,下标 l 从 1 到 n-L+1。对于每个 i,我们需要查询的区间左边界是 i-L+1,但 i 从 1 到 n。如果我们定义 i' = i,那么左边界 l_left = i-L+1,右边界 l_right = i。但 w_L 只在 l ≤ n-L+1 有定义。所以对于 i > n-L+1,右边界最多为 n-L+1。所以我们可以用单调队列维护 w_L,然后对于每个 i,我们想知道队列中下标在 [l_left, l_right] 的最大值。如果我们按照 i 递增,那么 l_left 和 l_right 都递增 1。所以这是一个滑动窗口,窗口大小固定为 L?因为 l_right - l_left +1 = L。实际上,l_left = i-L+1, l_right = i,所以区间长度正好是 L。但注意当 i 较小时,l_left 可能小于 1,这时有效左边界为 1;当 i 较大时,l_right 可能大于 n-L+1,这时有效右边界为 n-L+1。所以窗口大小可能小于 L。但我们可以分别处理边界情况。我们可以用单调队列维护当前窗口内的最大值,窗口左指针 left,右指针 right,随着 i 增加,left 和 right 都增加 1。但 left 和 right 的起始值:对于 i=1,l_left = 1-L+1 = 2-L,如果 L≥2,则小于 1,所以有效左边界为 1,有效右边界为 1(因为 i=1,所以 l ≤1,且 l ≥1,所以 l=1 如果 1 ≤ n-L+1)。所以我们需要小心初始化。我们可以这样:对于 i 从 1 到 n,我们需要查询区间 [L_i, R_i] = [max(1, i-L+1), min(i, n-L+1)]。这个区间的左端点和右端点都是非递减的。所以我们可以用单调队列,维护一个双端队列,存储 w_L 的下标。我们让指针 r 从 1 到 n-L+1 移动,同时对于每个 i,区间右端点 R_i = min(i, n-L+1)。当 r < R_i 时,我们将 w_L[r+1] 加入队列。同时,区间左端点 L_i = max(1, i-L+1)。我们需要弹出队列中下标 < L_i 的元素。然后队列的最大值就是当前区间的最大值。这样我们可以在 O(n) 时间内得到所有 i 的答案。所以性质 A 可以在 O(n) 每询问解决。

性质 B: R ≤ 32。那么我们可以枚举每个 len ∈ [L,R],对每个 len 用上述 O(n) 的方法得到每个 i 的包含 i 的长度为 len 的区间的最大和,记为 ans_len[i]。然后对于每个 i,ki = max{len ∈ [L,R]} ans_len[i]。枚举 len 共最多 32 个,所以每个询问 O(32 n) = O(n)。很好。

性质 C: L ≤ 16 且 R ≥ n-1000。那么长度范围很大,但我们可以利用 R 很大且接近 n,所以长长度部分只有约 1000 种。我们可以枚举所有 len ∈ [L, R],但 R-L+1 可能很大,因为 L 很小,R 接近 n,所以长度种类约 n 种,不能全部枚举。但性质 C 说 L ≤ 16 且 R ≥ n-1000,所以短长度最多 16 种,长长度最多 1000 种,总共 1016 种。枚举 1016 个 len,每个 len O(n) 计算,那么每个询问 O(1016 n) ≈ 5e7,对于 q=1024 总 5e10,太大。但也许我们可以优化:对于长长度,它们都很大,区间几乎覆盖整个数组,可能可以用一些统一的方法处理。或者我们可以分别处理短长度和长长度,然后合并。对于短长度(len ≤ 16),我们可以枚举。对于长长度(len ≥ n-1000),区间长度很大,包含 i 的区间几乎覆盖整个数组。我们可以考虑对于每个 i,长长度区间的最大和可能是什么。对于很大的 len,区间 [l, r] 长度固定为 len,包含 i,那么 l 必须在 [i-len+1, i] 内。因为 len 很大,所以 i-len+1 可能小于 1,所以 l 的下界为 1,上界为 i。同时 r = l+len-1 ≤ n,所以 l ≤ n-len+1。因为 len 很大,n-len+1 很小。所以 l 的范围其实很窄。具体地,对于 len 很大,l 必须 ≤ n-len+1,且 ≥ i-len+1。所以如果 i 很小,可能没有有效的 l。我们需要仔细分析。

但也许我们可以换一种思路:对于每个询问,我们只关心长度在 [L,R] 的区间。由于 L 很小,R 很大,我们可以考虑对每个点 i,最优区间要么是很短的区间,要么是很长的区间。但很难直接计算。

或许我们可以用数据结构优化枚举 len 的过程。注意到对于每个 i,当我们枚举 len 时,我们需要查询 w_len 在某个区间上的最大值。如果我们能快速得到对于所有 len 的该区间最大值,就可以避免枚举 len。

考虑构建一个二维数据结构,其中一维是 l,一维是 len,权值为 w_len[l]。我们需要对每个 i,查询所有满足 l ∈ [i-len+1, i] 且 len ∈ [L,R] 的点 (l, len) 的最大权值。这是一个二维矩形查询:条件 l ≤ i ≤ l+len-1 等价于 l ≤ i 且 l ≥ i-len+1,即 l ∈ [i-len+1, i]。再加上 len ∈ [L,R]。所以对于每个 i,查询的区域在 (l, len) 平面上是一个平行四边形?实际上,对于固定 i,条件为:len ∈ [L,R],且 l ∈ [max(1, i-len+1), min(i, n-len+1)]。所以对于每个 len,l 有一个区间。整体上,这是一个斜着的区域。我们可以将坐标变换一下:令 x = l, y = l+len-1,则 len = y-x+1。那么条件变为:y-x+1 ∈ [L,R],且 x ≤ i ≤ y。所以区域为:x ≤ i ≤ y,且 L ≤ y-x+1 ≤ R。这是一个带状区域。查询所有满足 x ≤ i ≤ y 且 y-x ∈ [L-1, R-1] 的点 (x,y) 的最大权值(权值为 pre[y]-pre[x-1])。但还是一样。

或许我们可以用扫描线加线段树。对于每个 i,我们需要查询所有覆盖 i 的区间 [x,y] 且长度在 [L,R] 的最大权值。我们可以将区间按右端点排序,扫描 i 从 1 到 n,当扫描到 i 时,我们将所有右端点 = i 的区间加入数据结构,然后查询所有左端点 ≤ i 的区间中,长度在 [L,R] 的最大权值。但长度条件不好处理。我们可以将区间按长度分组,或者用权值线段树维护长度。

具体:离线处理所有询问?但我们需要对每个询问单独计算,且询问的 L,R 不同。

对于每个询问,我们可以这样做:扫描右端点 r 从 1 到 n,维护一个数据结构,存储所有左端点 l 对应的区间 [l,r] 的权值,但只存储那些长度在 [L,R] 内的。当 r 增加时,新的区间是以 r 为右端点的区间,长度从 1 到 R(但必须 ≥ L),所以我们可以加入这些区间。然后对于每个 i ≤ r,我们需要查询所有覆盖 i 的区间,即左端点 l ≤ i ≤ r。我们可以维护另一个数据结构,对于每个位置 i,我们需要当前所有左端点 l ≤ i 且区间长度在 [L,R] 内的区间的最大权值。当 r 增加时,我们加入新区间,这些区间覆盖的点是 [l, r]。所以我们需要对区间 [l, r] 内的所有 i,用该区间的权值更新 k_i(取 max)。这又是一个区间取 max 操作。我们可以用线段树支持区间取 max 和最后查询每个点的值。但这里我们需要动态加入区间,并对每个位置维护历史最大值。我们可以用线段树,每个节点维护当前该区间内所有点的 k 值,当一个新的区间 [l,r] 权值为 w 加入时,我们需要将区间 [l,r] 内所有点的 k 更新为 max(k, w)。这可以用线段树的 lazy 标记实现:每个节点维护一个标记,表示对该区间所有点取 max。然后最后下推所有标记得到每个点的值。但线段树区间取 max 操作是可以结合的:如果先后有两个标记,取 max 后,实际上每个点最终的值是所有覆盖该点的区间的权值的最大值。所以我们可以将所有区间按权值加入,但顺序无关,因为最终每个点的值是所有覆盖它的区间的权值的最大值。所以我们可以离线处理:对于每个询问,我们生成所有长度在 [L,R] 的区间,得到 (l, r, w),然后我们需要对每个点 i 求所有覆盖 i 的区间的 w 的最大值。我们可以用线段树做区间取 max,最后查询每个点。生成所有区间需要 O(n*(R-L+1)) 时间,不可接受。但如果我们能快速生成这些区间并更新,也许可以。

注意到当我们扫描右端点 r 时,加入的区间是以 r 为右端点,长度从 max(1, L) 到 min(r, R)。所以总区间数还是 O(nR),太大。

所以我们需要避免显式生成所有区间。

或许我们可以用分块处理长度。将长度分为小长度和大长度。对于小长度,我们可以暴力枚举区间;对于大长度,我们可以用其他方法。

设一个阈值 T。对于长度 len ≤ T,我们可以枚举所有可能的区间(因为区间总数 O(nT)),然后进行区间取 max 操作。对于长度 len > T,我们可以用其他方法,比如对于每个点 i,大长度区间可能较少,因为长度大,所以 l 和 r 受到限制。

考虑长度 len > T。因为 len ∈ [L,R],且 len > T。对于每个点 i,包含 i 的长度为 len 的区间,其左端点 l 必须满足 l ∈ [i-len+1, i] 且 l ∈ [1, n-len+1]。所以 l 的范围长度最多为 len,但受限于 n-len+1,所以当 len 很大时,n-len+1 很小,所以 l 的范围实际上很小。具体地,对于固定的 len,l 的取值范围是 [1, n-len+1]。所以包含 i 的条件要求 i ∈ [l, l+len-1],即 l ∈ [i-len+1, i]。所以 l 必须同时在 [1, n-len+1] 和 [i-len+1, i] 内。当 len 很大时,n-len+1 可能小于 i-len+1,导致无解。实际上,只有当 i ≤ n 且 i ≥ len 时可能有解?我们来分析。

对于给定的 i 和 len,有效的 l 存在当且仅当区间 [max(1, i-len+1), min(i, n-len+1)] 非空。即 max(1, i-len+1) ≤ min(i, n-len+1)。这要求 1 ≤ i 且 i-len+1 ≤ n-len+1,即 i ≤ n。所以总是成立?还需要 i-len+1 ≤ i 和 1 ≤ n-len+1。后者要求 len ≤ n。所以对于 len ≤ n,总是有解?但区间可能为空如果上界小于下界。例如,取 i=1, len=n,则 max(1,1-n+1)=1, min(1, n-n+1)=min(1,1)=1,所以非空。取 i=1, len= n-1,则 max(1,1-(n-1)+1)=max(1,3-n),对于 n>3 为 1,min(1, n-(n-1)+1)=min(1,2)=1。所以似乎总是非空?但考虑 i=n, len=n,则 max(1, n-n+1)=1, min(n, n-n+1)=1,非空。实际上,对于任意 i 和 len,区间下界为 max(1, i-len+1),上界为 min(i, n-len+1)。我们需要下界 ≤ 上界。假设 i-len+1 > n-len+1,即 i > n,不可能。假设 1 > i,不可能。所以确实总是非空?但考虑 i=1, len=1,下界 max(1,1)=1,上界 min(1, n)=1,非空。所以对于所有 i 和 len,区间都非空?但注意当 len 很小时,比如 len=1,那么对于 i,l 必须等于 i,且 i ≤ n,所以区间为 [i,i],非空。当 len 很大时,比如 len=n,那么对于 i,下界 max(1, i-n+1)=1(因为 i-n+1 ≤ 1),上界 min(i, n-n+1)=min(i,1)=1,所以区间为 [1,1],非空。所以确实对于任意 i 和 len,区间总是非空的。这意味着对于每个 i 和每个 len,至少存在一个包含 i 的长度为 len 的区间。但注意这个区间可能只有一个 l 取值。所以我们的查询总是有结果的。

但即使如此,我们仍然需要计算最大值。

对于大长度 len > T,由于 len 很大,l 的取值范围很小,因为 n-len+1 很小。具体地,对于 len > T,n-len+1 ≤ n-T。所以 l 的上界最多为 n-T。同时,下界 i-len+1 可能很小,但受限于 1。所以 l 的范围长度最多为 min(i, n-len+1) - max(1, i-len+1) +1。这个长度可能大约为 len,但当 len 很大时,n-len+1 很小,所以实际上范围长度大约为 n-len+1(如果 i 很大)或 i(如果 i 很小)。总之,对于很大的 len,l 的取值范围可能很小。例如,len = n-1000,那么 n-len+1 = 1001,所以 l ≤ 1001。同时,i-len+1 ≤ i - (n-1000)+1 = i-n+1001。如果 i 很大,比如 i=n,那么下界为 n - (n-1000)+1 = 1001,所以 l ∈ [1001,1001]。如果 i 很小,比如 i=1,那么下界为 1 - (n-1000)+1 = 1002-n,小于1,所以下界为1,上界为 min(1, n-len+1)=1,所以 l=1。所以对于每个 i,有效的 l 只有很少的几种可能。实际上,对于固定的 len,l 必须 ≤ n-len+1,所以只有最多 n-len+1 种选择。当 len 接近 n 时,n-len+1 很小。所以对于大长度,我们可以枚举 l,然后知道区间 [l, l+len-1] 覆盖的点是连续的,我们可以用它的权值更新这些点的 k。但我们需要对每个 len 都这样做,而大长度有很多种?在性质 C 中,大长度只有约 1000 种,所以我们可以枚举这些大长度,对于每个 len,我们枚举所有 l(最多 n-len+1 个),然后用该区间的权值更新区间内所有点的 k。但如果我们对每个 len 都做一次区间取 max,总区间数约为 sum_{len in 大长度} (n-len+1) ≈ 1000 n/2?对于每个 len,区间数约为 n-len+1,当 len 很大时,区间数很小,比如 len=n-1000,区间数=1001;len=n-999,区间数=1002;...,len=n,区间数=1。所以总区间数约为 10001000/2 = 5e5。对于每个区间,我们需要更新区间内所有点,如果暴力更新,每个区间长度约为 len,很大,总更新点数巨大。但我们可以用线段树区间取 max,这样每个区间更新操作 O(log n),总操作数 O(区间数 log n) ≈ 5e5 log n ≈ 5e5 16 = 8e6,然后最后查询 n 个点,总复杂度 O((区间数 + n) log n) 对于每个询问。但这里大长度部分只有约 1000 种 len,所以我们可以这样做。对于小长度部分(len ≤ 16),我们可以枚举所有 len,对于每个 len,区间数约为 n,每个区间长度很小(≤16),所以总区间数约 16n = 8e5,用线段树区间取 max,也是 O(区间数 log n) ≈ 8e5 * 16 = 1.28e7。所以对于性质 C,每个询问总操作数约 2e7,加上 log 约 3e8,对于 q=1024 还是太大。但也许常数小可过?而且性质 C 只有测试点 11,12,可能 q 不大?但题目中 q ≤ 1024,没有说明性质 C 的 q 范围。但样例6满足测试点11,12,我们不知道 q 多大。但可能我们可以优化。

对于小长度部分,我们可以不用线段树,而是用直接更新数组然后最后用单调队列?对于小长度 len,我们可以枚举 len,然后对于每个 len,我们计算数组 ans_len[i] 表示包含 i 的长度为 len 的区间的最大和(用滑动窗口 O(n)),然后对于每个 i,k_i = max(k_i, ans_len[i])。这样对于小长度部分,总 O(16 n) = O(n)。对于大长度部分,我们枚举 len,但大长度 len 有约 1000 种,对于每种 len,我们如果也用滑动窗口 O(n) 计算 ans_len[i],那么总 O(1000 n) = 5e7,每个询问 5e7,对于 q=1024 太大。但我们可以注意到,对于大长度,len 很大,滑动窗口算法中,对于每个 i,查询的区间 [max(1, i-len+1), min(i, n-len+1)] 可能很特殊。例如,当 len 很大时,对于大多数 i,区间左边界为 1,右边界为 n-len+1。因为 i-len+1 通常小于 1,所以左边界为 1;而 min(i, n-len+1) 通常为 n-len+1(因为 i 通常大于 n-len+1)。所以对于 i ≥ n-len+1,区间为 [1, n-len+1];对于 i < n-len+1,区间为 [1, i]。所以 anslen[i] = max{l ∈ [1, min(i, n-len+1)]} w_len[l]。这可以用前缀最大值轻松计算。具体地,令 Mlen[i] = max{1 ≤ l ≤ i} w_len[l],那么对于 i ≤ n-len+1,ans_len[i] = M_len[i];对于 i > n-len+1,ans_len[i] = M_len[n-len+1]。所以我们可以 O(n) 预处理 w_len 的前缀最大值,然后 O(1) 得到每个 i 的 ans_len[i]。但注意 w_len[l] 只在 l ≤ n-len+1 有定义。所以对于 i > n-len+1,ans_len[i] 就是 w_len 在 [1, n-len+1] 的最大值。因此,对于每个大长度 len,我们可以在 O(n) 时间内计算 w_len 数组(需要计算每个 l 的区间和),然后计算前缀最大值,然后赋值给 ans_len[i]。但计算 w_len 数组需要 O(n) 时间(因为对于每个 l,计算 pre[l+len-1]-pre[l-1]),所以总 O(n) 每个 len。所以对于 1000 个大长度,总 O(1000 n) = 5e7,每个询问 5e7,对于 q=1024 太大。但也许我们可以优化计算 w_len 数组的过程,因为对于连续的 len,w_len[l] 有递推关系?w_len[l] = pre[l+len-1]-pre[l-1],当 len 增加 1,w_len[l] 增加 a[l+len]。所以如果我们按 len 递增顺序处理,我们可以维护 w_len 数组,当 len 增加时,对每个 l,w_len[l] += a[l+len]。但这样每次更新所有 l 需要 O(n),总 O(n * 1000) 一样。所以没有优化。

但也许对于大长度,我们可以不用枚举所有 len,而是直接用一些方法计算所有包含 i 的大长度区间的最大和。或许我们可以考虑,对于大长度区间,其和近似于整个序列的和减去两头的小部分。但可能不是。

由于时间有限,我们可能需要放弃完美解法,而设计一个能获得较多部分分的算法。

我们总结部分分:

测试点1: n≤1000, q=1。可以用枚举所有区间并区间取 max 的方法,复杂度 O(n^2 log n) 或 O(n^2 α(n))。

测试点2,3: n≤3000, q≤50。可能也可以用类似方法,但 n=3000,区间数约 4.5e6,可能可行。但 q=50,总区间数 2.25e8,排序可能太慢。我们可以对每个询问单独处理,枚举所有区间,然后用并查集覆盖,每个询问 O(n^2 α(n)),对于 n=3000 是 9e6,q=50 总 4.5e8,可能勉强。

测试点4: n≤10000, q≤128。n=10000,区间数约 5e7,每个询问枚举所有区间可能太慢。

测试点5: n≤30000, q≤512。更大。

测试点6,7: 性质 A (L=R)。我们可以用滑动窗口 O(n) 每个询问。

测试点8~10: 性质 B (R≤32)。我们可以枚举每个 len,用滑动窗口 O(32 n) 每个询问。

测试点11,12: 性质 C (L≤16 且 R≥n-1000)。我们可以用小长度枚举,大长度用上述方法或直接枚举。

测试点13: 性质 D (L > n/2)。

测试点14,15: 性质 E (L > n/4)。

测试点16~20: 无特殊性质。

对于性质 D 和 E,长度下限很大,所以区间长度都很大。类似于性质 C 中的大长度部分。我们可以用类似方法:对于长度很大的区间,我们可以用前缀最大值等技巧。

对于无特殊性质,我们需要一个通用的较优算法。

可能有一种基于分块和预处理的方法。

考虑将序列分成大小为 B 的块。对于每个块,我们预处理一些信息,使得能够快速回答询问。

但或许我们可以采用以下策略:对于每个询问,我们使用线段树维护每个位置的最大可能权值,然后通过某种方式更新。

另一个想法:我们可以预处理所有可能的长度 len 的 w_len 数组的前缀最大值和后缀最大值,然后对于每个询问,我们可能需要合并这些信息。但长度太多。

也许我们可以用卷积?但似乎不。

鉴于时间限制,我们决定实现一个针对小 n 的暴力算法,以及针对特殊性质 A、B、C、D、E 的算法,以争取高分。

具体计划:

对于每个询问,如果 n ≤ 3000,我们使用暴力枚举所有区间的方法:生成所有长度在 [L,R] 的区间,计算权值,然后按权值从大到小排序,用并查集覆盖每个点,得到每个点的 k_i。复杂度 O(n^2 log n + n α(n)) 每询问。对于 n=3000,区间数约 4.5e6,排序 4.5e6 log 4.5e6 ≈ 4.5e6 22 ≈ 1e8,可能较慢但或许可过。我们可以用计数排序?权值范围:区间和最小约为 n min(a) = 5e4 * (-1e5) = -5e9,最大约为 5e9,范围太大。所以只能用比较排序。

实际上,对于 n=3000,区间数约 3000*3000/2 = 4.5e6,每个询问排序 4.5e6 log 4.5e6 操作,q=50 总 2.25e8 log 操作,可能太慢。我们可以优化:不需要排序,我们可以用优先队列?但我们需要按权值从大到小处理。或许我们可以用桶排序,但权值范围大。

另一种暴力:对于每个点 i,直接枚举所有包含 i 的区间。对于每个 i,枚举长度 len ∈ [L,R],然后枚举左端点 l 从 max(1, i-len+1) 到 min(i, n-len+1),计算区间和并更新 k_i。这样总复杂度 O(n (R-L+1) 平均长度)。对于 n=3000,R-L+1 最大 3000,最坏 O(n^3)=2.7e10,不可行。

所以枚举所有区间并排序的方法可能更好。

对于性质 A (L=R):我们用滑动窗口 O(n) 解决。

对于性质 B (R≤32):我们枚举每个 len ∈ [L,R],对每个 len 用滑动窗口 O(n) 计算 ans_len[i],然后合并。

对于性质 C (L≤16 且 R≥n-1000):我们处理小长度和大长度分开。

小长度:枚举 len ∈ [L, min(16, R)],对每个 len 用滑动窗口 O(n) 计算 ans_len[i],更新 k_i。

大长度:枚举 len ∈ [max(L, n-1000), R],但注意如果 L > n-1000,则大长度部分为 [L,R]。由于 R≥n-1000,所以大长度部分长度种类最多 1001。对每个 len,我们计算 w_len 数组,然后计算前缀最大值 Mlen[i] = max{1≤l≤i} w_len[l]。然后对于每个 i,ans_len[i] = M_len[min(i, n-len+1)]。然后更新 k_i。复杂度 O(1000 * n) = 5e7,对于单个询问可能可过,但 q 可能大。但性质 C 只有测试点11,12,可能 q 不大?题目没说。假设 q 较小,我们可以接受。

对于性质 D (L > n/2):长度下限很大,所以区间长度都很大。我们可以用类似于性质 C 中大长度的方法:枚举所有 len ∈ [L,R],但 R 可能等于 n,所以长度种类最多 n-L+1,可能大约 n/2 = 2.5e4,枚举所有 len 不可行。但我们可以注意到,当 L > n/2 时,对于每个 i,包含 i 的区间长度很大,因此 l 和 r 受限。我们可以考虑对于每个 i,最优区间可能是什么。或许我们可以用前缀和的最大最小值。另一种思路:对于长度很大的区间,其和可以表示为 total_sum - sum[1..l-1] - sum[r+1..n]。但不太直观。

由于 L > n/2,所以区间长度至少为 n/2+1。那么对于每个 i,包含 i 的区间,其左端点 l 必须 ≤ i,右端点 r ≥ i,且 r-l+1 ≥ L。所以 l 和 r 不能太远。实际上,区间至少覆盖一半的点。我们可以考虑枚举左端点 l,那么右端点 r 至少为 l+L-1。区间覆盖的点是 [l, r]。对于点 i,如果 i ∈ [l, r],则该区间覆盖 i。所以我们可以枚举 l,对于每个 l,区间 [l, l+L-1] 到 [l, min(n, l+R-1)] 都是可能的。我们可以用这些区间的权值更新覆盖的点。但区间数量是 O(n(R-L+1)),可能很大。但注意到 L > n/2,所以对于固定的 l,区间长度从 L 到 R,这些区间的右端点从 l+L-1 到 l+R-1。因为 l 从 1 到 n-L+1,所以总区间数约为 (n-L+1)(R-L+1) ≤ n/2 * n/2 = n^2/4 = 6.25e8,太大。

所以我们需要更高效的方法。

或许我们可以用线段树维护前缀和,然后对于每个 i,我们需要找到 l ≤ i ≤ r 且 r-l+1 ∈ [L,R] 使得 pre[r]-pre[l-1] 最大。这等价于 max{l ≤ i} (max{r ≥ i, r-l+1 ∈ [L,R]} pre[r]) - pre[l-1]。我们可以预处理对于每个 r,pre[r] 的值,但需要满足长度条件。

我们可以考虑扫描 i,维护数据结构。但可能复杂。

由于性质 D 和 E 可能也是设计为可解的,我们可以用类似性质 C 的方法:当 L 很大时,长度范围可能不大?因为 R ≤ n,所以 R-L+1 ≤ n - n/2 = n/2 = 2.5e4。如果我们枚举所有 len ∈ [L,R],每个 len 用滑动窗口 O(n) 计算,总 O(n(R-L+1)) ≈ 5e4 2.5e4 = 1.25e9,太大。但我们可以用前缀最大值优化吗?对于大长度,我们之前用前缀最大值可以 O(n) 计算每个 len 的 ans_len[i],但这里 len 范围大,总时间还是 O(n*(R-L+1))。

所以对于性质 D 和 E,如果 R-L+1 很大,我们可能还是需要更优的算法。

或许我们可以注意到,当 L 很大时,对于不同的 len,w_len 数组有递推关系,我们可以用动态规划一次性计算所有 len 的 ans_len[i]?考虑从大到小枚举 len,wlen[l] = w{len+1}[l] - a[l+len]。所以如果我们从 len = R 往下到 L,我们可以维护 w_len 数组,同时维护前缀最大值,从而更新 ans_len[i]。但我们需要对每个 i 取所有 len 的最大值,所以我们需要在更新过程中维护每个 i 的当前最大值。具体做法:初始化 ki = -inf。从 len = R 向下到 L,我们维护数组 w[l] 表示当前 len 的区间和。开始时 len=R,计算 w[l] = sum[l..l+R-1]。然后计算前缀最大值 M[i] = max{1≤l≤i} w[l],然后对于每个 i,用 M[min(i, n-len+1)] 更新 k_i。然后当 len 减少 1 时,我们更新 w[l] -= a[l+len](因为新的 len' = len-1,w'[l] = sum[l..l+len-2] = w[l] - a[l+len-1]?注意:当 len 减少 1,wlen[l] = sum[l..l+len-1] 变为 w{len-1}[l] = sum[l..l+len-2] = w_len[l] - a[l+len-1]。所以我们需要减去 a[l+len-1]。但这里 len 是当前的,当 len 变为 len-1 时,需要减去 a[l+(len-1)] = a[l+len-1]。所以我们可以从大到小枚举 len,每次更新 w 数组(每个 l 减去 a[l+len]?注意:当 len 从 R 开始,w 对应 len=R。然后下一个 len=R-1,需要 w'[l] = w[l] - a[l+R-1]。所以更新为 w[l] -= a[l+当前len]?但当前 len 是旧的,新的 len' = len-1,所以更新 w[l] -= a[l+len-1]。所以我们可以维护一个数组 w,初始为 sum[l..l+R-1],然后 for len from R down to L: 计算前缀最大值并更新 k_i,然后如果 len > L,更新 w[l] -= a[l+len-1] for all l。但更新所有 l 需要 O(n),总 O(n*(R-L+1)) 一样。但我们可以同时更新前缀最大值吗?当我们修改 w[l] 时,前缀最大值需要重新计算,所以还是需要 O(n) 每次。所以没有减少复杂度。

但如果我们从大到小枚举 len,前缀最大值可以递推吗?当 w[l] 变化时,前缀最大值可能变化,但我们需要的是对于每个 i,M[i] = max_{1≤l≤i} w[l]。如果我们更新了 w[l],那么 M[i] 需要更新。我们可以用线段树维护 w[l] 和前缀最大值?但这样每次更新所有 l 需要 O(n log n),更差。

所以对于性质 D 和 E,如果 R-L+1 很大,我们可能无法高效处理。但也许测试点中性质 D 和 E 的 R-L+1 不大?题目没有说明。但性质 D 只说 L > n/2,没有说 R 的范围。R 可以等于 n,所以 R-L+1 可以约为 n/2。所以可能需要处理。

我们再看数据范围:测试点13 是性质 D,n≤5e4,q≤1024。我们需要一个高效的算法。

或许我们可以用另一种思路:对于长度很大的区间,包含 i 的区间可能很少,因为长度大,所以 i 必须靠近中间?我们分析一下:对于给定的 i 和长度 len,有效的 l 区间为 [max(1, i-len+1), min(i, n-len+1)]。当 len 很大时,i-len+1 很小,所以下界通常是 1;上界 min(i, n-len+1) 通常为 n-len+1(因为 i 通常大于 n-len+1)。所以对于 i ≥ n-len+1,上界为 n-len+1;对于 i < n-len+1,上界为 i。所以 anslen[i] = max{l=1}^{min(i, n-len+1)} w_len[l]。所以如果我们能快速得到对于所有 len 的该最大值,我们就可以快速得到 ans_len[i]。注意 w_len[l] 只依赖于 l 和 len。我们可以考虑对于每个 l,w_len[l] 作为 len 的函数。对于固定的 l,w_len[l] = pre[l+len-1] - pre[l-1]。当 len 增加,w_len[l] 增加 a[l+len-1]。所以对于每个 l,w_len[l] 是 len 的序列(从 len=L 到 R)。我们需要对每个 i,对于所有 len,取 max over l ≤ min(i, n-len+1) 的 w_len[l]。这仍然复杂。

由于时间有限,我们可能只能实现暴力算法和特殊性质 A、B、C 的算法,对于性质 D、E 和无特殊性质的测试点,我们用暴力算法如果 n 较小,否则可能只能输出随机答案或部分正确。但这样得分可能不高。

我们考虑争取更多部分分。或许我们可以实现一个基于分块的算法,对于所有测试点都适用,但复杂度较高,可能能过一些点。

考虑将序列分成大小为 B 的块,然后预处理每个块的前缀和等信息。对于每个询问,我们对于每个点 i,其最优区间可能完全在块内,也可能跨块。对于完全在块内的区间,由于块大小 B 较小,我们可以暴力枚举所有长度在 [L,R] 且完全在块内的区间,更新块内点的 k。对于跨块的区间,我们可以枚举左端点和右端点所在的块,然后计算区间和,更新覆盖的点。但跨块区间数量可能很多。

另一种分块:对点 i 分块,我们计算每个块内所有点的 k_i。对于每个块,我们考虑所有可能覆盖该块内点的区间。但区间数量太多。

鉴于本题难度,我们决定实现以下算法:

如果 n ≤ 3000,使用暴力枚举所有区间并并查集覆盖的方法。

否则,如果询问满足性质 A,使用滑动窗口 O(n) 算法。

否则,如果询问满足性质 B,使用枚举 len 滑动窗口算法。

否则,如果询问满足性质 C,使用小长度加大长度方法。

否则,如果询问满足性质 D 或 E,我们使用类似性质 C 中大长度的方法,但枚举所有 len ∈ [L,R]?如果 R-L+1 太大,我们可能只能处理部分,或者用暴力但 n 很大时不行。我们可以设定阈值,如果 R-L+1 ≤ 1000,我们枚举所有 len 用滑动窗口;否则,我们输出 0 或随机答案。但这样可能只得部分分。

但为了尽可能得分,我们可以尝试实现一个对于所有询问都能给出答案但可能较慢的算法,并希望时间限制较宽。

我们注意到总时间可能允许 O(q n log n) 如果常数小。或许我们可以用线段树维护前缀和,对于每个询问,我们计算每个 i 的 k_i 通过以下方法:

对于每个 i,ki = max{l ≤ i} max{r ≥ i, r-l+1 ∈ [L,R]} (pre[r] - pre[l-1])。我们可以用线段树维护每个位置 l 的候选值。具体地,扫描 i 从 1 到 n,我们维护一个数据结构,对于每个 l ≤ i,存储 g(l) = max{r ≥ i, r-l+1 ∈ [L,R]} pre[r] - pre[l-1]。然后 ki = max{l ≤ i} g(l)。当 i 增加时,对于每个 l,g(l) 可能会变小,因为 r 的取值范围缩小。我们需要更新 g(l)。但更新所有 l 是 O(n) 每次,总 O(n^2)。

我们可以用线段树维护 g(l),但更新 g(l) 需要知道对于每个 l,当 i 增加时,其对应的最大 pre[r] 的变化。对于固定的 l,g(l) = max_{r ∈ [max(i, l+L-1), min(n, l+R-1)]} pre[r] - pre[l-1]。当 i 增加时,区间左端点可能从 l+L-1 变为 i(当 i > l+L-1)。所以当 i 穿过 l+L-1 时,g(l) 从常数变为依赖于 i。我们可以预处理对于每个 l,在 i 的不同阶段 g(l) 的值。但这样需要 O(n^2) 预处理。

所以不行。

鉴于上述分析,我们决定实现以下算法作为最终提交:

读入 n, a[], q。

预处理前缀和 pre[]。

对于每个询问 (L,R):

如果 n <= 3000,使用暴力枚举区间并查集覆盖。

否则,如果 L == R,使用性质 A 算法。

否则,如果 R <= 32,使用性质 B 算法。

否则,如果 L <= 16 && R >= n-1000,使用性质 C 算法。

否则,如果 L > n/2,使用类似性质 C 中大长度算法,但只处理长度从 L 到 min(R, L+1000)(因为 R-L+1 可能很大,我们只处理前1000个长度,作为近似,但这样可能错误)。但为了得分,我们可以尝试处理所有长度,但如果 R-L+1 太大,我们跳过?不,我们尽可能处理。 实际上,对于性质 D,L > n/2,所以长度至少 25000,那么 R-L+1 最大 25000。如果我们枚举所有长度,每个长度用前缀最大值 O(n) 计算,总 O(25000 * 50000) = 1.25e9,太大。所以我们不能枚举所有长度。 或许我们可以注意到,当 L 很大时,对于不同的 i,最优区间可能具有相似的性质。我们可以考虑对于每个 i,最优区间要么是 [i, i+L-1] 之类的。但不确定。

由于时间有限,我们决定只实现暴力(n<=3000)和特殊性质 A、B、C 的算法,对于其他情况,我们输出一个默认值(比如 0),但这样会丢分。但可能能拿到一些分数。

我们也可以尝试实现一个简单的算法:对于每个询问,我们枚举所有长度 len ∈ [L, min(R, L+100)],用滑动窗口计算 ans_len[i] 并更新 k_i。这样我们只考虑了最多100个长度,可能能近似正确答案,但可能错误。但或许能过一些测试点。

考虑到题目要求“尽可能的快速解决这道题,如果无法解决,请尽可能的拿高分”,我们决定实现一个能正确处理小 n 和特殊性质的算法,对于其他情况,我们使用一个简单的启发式算法:枚举长度 len 从 L 到 R,但步长为 step = max(1, (R-L+1)/100),即只枚举100个长度,用滑动窗口计算并更新 k_i。这样每个询问 O(100 n) = O(n),总 O(q n) ≈ 5e7,可接受。但这样可能不准确,但也许能拿到一些分数。

我们还可以尝试:如果 R-L+1 不大,就直接枚举所有长度;否则,抽样一些长度。

但为了稳妥,我们决定在时间允许的情况下枚举尽可能多的长度。我们可以根据 n 和 q 调整。由于 q ≤ 1024,n≤5e4,总时间可能允许 5e8 操作。如果我们每询问枚举 1000 个长度,总操作 1000 5e4 1024 ≈ 5e10,太大。所以最多每询问枚举 100 个长度。

我们也可以对长度进行分块:将长度区间 [L,R] 分成若干块,每块内选一个代表长度,计算后更新。但可能误差大。

我们决定:对于每个询问,如果 R-L+1 ≤ 200,我们枚举所有长度;否则,我们均匀抽样 200 个长度。这样每个询问复杂度 O(200 n) = 1e7,总 1024 * 1e7 = 1e10,可能还是太大。所以需要更少抽样,比如 50 个长度。但 50 可能太少。

考虑到暴力算法对于 n≤3000 已经可以处理,而对于 n>3000,我们假设 q 不会同时很大。但题目中 q 最大 1024,n 最大 5e4,所以最坏情况是 n=5e4, q=1024。我们需要非常高效的算法。

我们或许可以赌测试点16~20的无特殊性质数据中,R-L+1 不大,或者有其他特点。但无法确定。

经过思考,我决定实现以下算法:

对于每个询问,计算每个 i 的 k_i 通过以下方法:使用线段树维护区间最大子段和,但带有长度限制。但经典的线段树维护最大子段和可以回答区间内的最大子段和,但这里我们需要包含每个点的最大子段和,且长度限制。这很难用线段树直接得到。

最后,我决定采用一种基于单调队列和预处理的方法,但限于时间,我将提供代码框架,实现特殊性质 A、B、C 的算法,对于其他情况,如果 n 不大,用暴力;否则,用简单算法枚举部分长度。

由于这是文字回答,我需要给出最终代码。我将编写一个程序,包含以下功能:

读入数据。

对于每个询问:

如果 n <= 3000,使用暴力枚举所有区间,按权值排序,用并查集覆盖。

否则,如果 L == R,使用滑动窗口 O(n)。

否则,如果 R <= 32,枚举每个 len。

否则,如果 L <= 16 && R >= n-1000,使用小长度加大长度方法。

否则,如果 R-L+1 <= 100,枚举所有 len。

否则,枚举从 L 到 R 每隔 step 个长度取一个,总共不超过 100 个长度,用滑动窗口计算并更新。

这样可能能获得不少分数。

下面开始编写代码。

注意:输出要求是输出一个非负整数,即所有 (i k_i) mod 2^{64} 的异或和。这里 mod 2^{64} 相当于对 2^{64} 取模,但 C++ 中 unsigned long long 自然就是模 2^{64} 的,所以我们可以直接用 unsigned long long 计算 i k_i,注意 k_i 可能是负数,所以需要先将其转化为模 2^{64} 下的非负整数。因为模 2^{64},负数加上 2^{64} 即可。在 C++ 中,有符号数转为无符号数会自动模 2^{64},所以我们可以这样:ull val = (ull)( (ll)i * k_i ),但这样当乘积为负时,会转换成很大的无符号数,符合模 2^{64} 的结果。所以我们可以直接计算。

我们将 k_i 设为 long long,然后计算时转成 unsigned long long。

代码结构:

预处理前缀和 pre[]。

函数 calc_fixed_len(len) 返回一个数组 ans,其中 ans[i] 表示包含 i 的长度为 len 的区间的最大和。 实现:先计算 w[l] = pre[l+len-1] - pre[l-1] for l=1..n-len+1。 然后我们需要对每个 i,求 w 在区间 [max(1, i-len+1), min(i, n-len+1)] 的最大值。 我们可以用单调队列扫描 i:维护一个双端队列,存储 w 的下标。随着 i 增加,区间左右端点都增加 1,所以是滑动窗口,窗口大小固定为 len,但边界需要调整。我们可以用以下方法: 初始化 deque,left=1, right=0。 对于 i 从 1 到 n: 新的区间右端点 r_idx = min(i, n-len+1) 将下标从 right+1 到 r_idx 的 w 加入队列(维护递减) 新区间左端点 l_idx = max(1, i-len+1) 弹出队列中下标 < l_idx 的元素 队列前端就是最大值,ans[i] = w[deque.front()] 复杂度 O(n)。

对于性质 A:直接调用 calc_fixed_len(L) 得到 ans,然后计算答案。

对于性质 B:初始化 ans_all[i] = -inf,对于每个 len from L to R,调用 calc_fixed_len(len),然后 ans_all[i] = max(ans_all[i], ans_len[i])。最后用 ans_all 计算答案。

对于性质 C:初始化 ans_all[i] = -inf。 小长度:for len from L to min(16, R): 调用 calc_fixed_len(len) 更新。 大长度:for len from max(L, n-1000) to R: 计算 w[l] for l=1..n-len+1,然后计算前缀最大值 pref_max[l] = max(pref_max[l-1], w[l])。然后对于每个 i,ans_len[i] = pref_max[min(i, n-len+1)]。更新 ans_all。 注意:如果 L <= 16 且 R >= n-1000,但可能 L > 16 或 R < n-1000,所以需要正确设置范围。

对于其他情况,如果 R-L+1 <= 100,枚举所有 len;否则,选取一些 len:例如,我们选取 len 为 L, L+step, L+2*step, ..., R,其中 step = max(1, (R-L)/99),总共不超过 100 个。然后对每个选取的 len 调用 calc_fixed_len(len) 更新 ans_all。

暴力方法:生成所有区间,存储 (l, r, w),按 w 从大到小排序,用并查集覆盖。

我们将根据 n 的大小决定使用哪种方法。

由于暴力方法需要 O(n^2) 内存,对于 n=3000 需要约 9e6 个区间,每个区间三个 int,约 108MB,可能可行。但排序可能慢。

我们可以优化:对于每个区间,我们只存储 w 和 l,因为 r = l+len-1,但我们需要区间覆盖的点,所以需要 l 和 r。所以存储 l 和 r。但我们可以只存储 l 和 len,但需要计算覆盖的点时用 l 和 l+len-1。所以存储 l 和 len 也可以。

为了节省内存,我们存储 l 和 len,但这样在覆盖时需要计算 r。

我们决定存储 struct { int l, r; ll w; }。

并查集覆盖:数组 next[i] 表示 i 之后第一个未被覆盖的点。初始化 next[i]=i。对于每个区间按 w 从大到小,我们从 l 开始,找到 j = find(l),如果 j <= r,则设置 ans[j] = w(注意我们最终需要 k_i,所以 ans[i] 就是 k_i),然后合并 j 到 j+1,即 set next[j] = find(j+1),然后继续从 j 开始找直到超过 r。

注意:我们可能用 ans 数组记录 k_i,初始化为 -inf。但按 w 从大到小覆盖,一旦一个点被覆盖,它的值就不会再被更新,所以我们可以用并查集跳过已覆盖点。

但注意:区间权值可能为负,所以即使所有点都被覆盖过,也可能有些点没有被覆盖(如果一开始没有区间覆盖它?但实际上对于每个点,总存在至少一个包含它的区间,所以最终所有点都会被覆盖。但按权值从大到小,负权值的区间可能不会覆盖任何点如果点已经被覆盖。所以算法正确。

复杂度:生成区间 O(n^2),排序 O(n^2 log n),覆盖 O(n α(n))。

对于 n=3000,区间数约 4.5e6,排序可能较慢,但或许可接受。

我们还可以用 nth_element 之类的不完全排序?但我们需要从大到小处理,所以需要排序。

考虑到时间,我们决定对于 n<=3000 使用暴力。

对于 n>3000,使用其他方法。

下面开始写代码。

注意:计算 w[l] 时,l+len-1 可能超过 n,但我们的 len 范围保证 l+len-1 ≤ n,因为 l ≤ n-len+1。

我们将详细实现。

由于代码较长,我将尽量写清楚。

开始编写。 ::: :::info[代码]


#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
const int MAXN = 50005;
const ll INF = 1e18;
int n, q;
ll a[MAXN];
ll pre[MAXN]; // 前缀和

// 计算固定长度 len 的答案数组 ans,ans[i] 表示包含 i 的长度为 len 的区间的最大和
vector<ll> calc_fixed_len(int len) {
    vector<ll> ans(n + 1, -INF);
    if (len > n) return ans;
    int m = n - len + 1;
    vector<ll> w(m + 1); // w[l] = sum[l..l+len-1]
    for (int l = 1; l <= m; l++) {
        w[l] = pre[l + len - 1] - pre[l - 1];
    }
    // 单调队列维护滑动窗口最大值
    // 对于每个 i,查询区间 [L_i, R_i] = [max(1, i-len+1), min(i, n-len+1)]
    deque<int> dq;
    int left_bound = 1, right_bound = 0;
    for (int i = 1; i <= n; i++) {
        int new_right = min(i, m);
        // 扩展右边界
        while (right_bound < new_right) {
            right_bound++;
            while (!dq.empty() && w[dq.back()] <= w[right_bound]) {
                dq.pop_back();
            }
            dq.push_back(right_bound);
        }
        int new_left = max(1, i - len + 1);
        // 收缩左边界
        while (!dq.empty() && dq.front() < new_left) {
            dq.pop_front();
        }
        if (!dq.empty()) {
            ans[i] = w[dq.front()];
        }
    }
    return ans;
}

// 暴力解法:枚举所有区间,按权值排序,用并查集覆盖
vector<ll> brute_force(int L, int R) {
    vector<ll> ans(n + 1, -INF);
    vector<tuple<ll, int, int>> intervals; // (w, l, r)
    for (int len = L; len <= R; len++) {
        if (len > n) break;
        int m = n - len + 1;
        for (int l = 1; l <= m; l++) {
            int r = l + len - 1;
            ll w = pre[r] - pre[l - 1];
            intervals.emplace_back(w, l, r);
        }
    }
    // 按权值从大到小排序
    sort(intervals.begin(), intervals.end(), greater<tuple<ll, int, int>>());
    // 并查集
    vector<int> nxt(n + 2);
    for (int i = 1; i <= n + 1; i++) nxt[i] = i;
    function<int(int)> find = [&](int x) {
        return nxt[x] == x ? x : nxt[x] = find(nxt[x]);
    };
    for (auto &[w, l, r] : intervals) {
        int cur = find(l);
        while (cur <= r) {
            ans[cur] = w;
            nxt[cur] = find(cur + 1);
            cur = find(cur);
        }
    }
    return ans;
}

// 性质 A: L == R
vector<ll> solve_A(int L) {
    return calc_fixed_len(L);
}

// 性质 B: R <= 32
vector<ll> solve_B(int L, int R) {
    vector<ll> ans(n + 1, -INF);
    for (int len = L; len <= R; len++) {
        vector<ll> cur = calc_fixed_len(len);
        for (int i = 1; i <= n; i++) {
            ans[i] = max(ans[i], cur[i]);
        }
    }
    return ans;
}

// 性质 C: L <= 16 && R >= n-1000
vector<ll> solve_C(int L, int R) {
    vector<ll> ans(n + 1, -INF);
    // 小长度部分
    int small_r = min(16, R);
    for (int len = L; len <= small_r; len++) {
        vector<ll> cur = calc_fixed_len(len);
        for (int i = 1; i <= n; i++) {
            ans[i] = max(ans[i], cur[i]);
        }
    }
    // 大长度部分
    int big_l = max(L, n - 1000);
    if (big_l <= R) {
        for (int len = big_l; len <= R; len++) {
            if (len > n) break;
            int m = n - len + 1;
            vector<ll> w(m + 1);
            for (int l = 1; l <= m; l++) {
                w[l] = pre[l + len - 1] - pre[l - 1];
            }
            // 前缀最大值
            vector<ll> pref_max(m + 1, -INF);
            for (int l = 1; l <= m; l++) {
                pref_max[l] = max(pref_max[l - 1], w[l]);
            }
            for (int i = 1; i <= n; i++) {
                int idx = min(i, m);
                ans[i] = max(ans[i], pref_max[idx]);
            }
        }
    }
    return ans;
}

// 其他情况:抽样最多 100 个长度
vector<ll> solve_general(int L, int R) {
    vector<ll> ans(n + 1, -INF);
    int total_len = R - L + 1;
    if (total_len <= 100) {
        // 枚举所有长度
        for (int len = L; len <= R; len++) {
            vector<ll> cur = calc_fixed_len(len);
            for (int i = 1; i <= n; i++) {
                ans[i] = max(ans[i], cur[i]);
            }
        }
    } else {
        // 抽样 100 个均匀分布的长度
        int step = max(1, total_len / 100);
        for (int len = L; len <= R; len += step) {
            vector<ll> cur = calc_fixed_len(len);
            for (int i = 1; i <= n; i++) {
                ans[i] = max(ans[i], cur[i]);
            }
        }
    }
    return ans;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    pre[0] = 0;
    for (int i = 1; i <= n; i++) {
        cin >> a[i];
        pre[i] = pre[i - 1] + a[i];
    }
    cin >> q;
    while (q--) {
        int L, R;
        cin >> L >> R;
        vector<ll> k;
        if (n <= 3000) {
            k = brute_force(L, R);
        } else if (L == R) {
            k = solve_A(L);
        } else if (R <= 32) {
            k = solve_B(L, R);
        } else if (L <= 16 && R >= n - 1000) {
            k = solve_C(L, R);
        } else {
            k = solve_general(L, R);
        }
        // 计算答案
        ull ans_xor = 0;
        for (int i = 1; i <= n; i++) {
            ull val = (ull)((ll)i * k[i]);
            ans_xor ^= val;
        }
        cout << ans_xor << '\n';
    }
    return 0;
}
:::

[评测记录(15pts)(官方数据)](https://www.luogu.com.cn/record/251126683)

# 总结

最后 DeepSeek 在 NOIPlus2025 中取得了 $100+12+8+15=135$ 的好成绩,居然比我低一点,嘻嘻嘻。

欢迎大家对本次 DeepSeek 在 NOIPlus2025 的表现做出点评。

# 关于其他大模型的情况

此内容纯属娱乐,请勿使用 AI 辅助参加比赛。  
询问格式为上面说的格式,并禁止其联网搜索,且给出代码的机会只有一次。  
感谢@[sen_lin114514](https://www.luogu.com.cn/user/991813) 提供的帮助。  
格式参考@[sto_clx_orz](https://www.luogu.com.cn/user/1069533) 的专栏[各类大模型的 CSP 分数测试](https://www.luogu.com.cn/article/0eop1kx4)。  
部分大模型的思考时间由于作者的渠道原因无法精确到秒。
| Model | candy | sale | tree | query | $\sum$ |
| :------: | :------: | :------: | :------: | :------: | :------: |
| **Gemini** 3.0-Pro-Preview | $100_{\ \text{3m}}$ | $24_{\ \text{5m}}$ | $12_{\ \text{5m}}$ | $65_{\ \text{4m}}$ | $201_{\ \text{17m}}$ |
| **ChatGPT** GPT-5 Thinking | $100_{\ \text{3m20s}}$ | $8_{\ \text{12m17s}}$ | $0_{\ \text{16m3s}}$ | $40_{\ \text{6m7s}}$ | $148_{\ \text{37m47s}}$ |
| **DeepSeek** Thinking | $100_{\ \text{8m12s}}$ | $12_{\ \text{51m33s}}$ | $8_{\ \text{17m3s}}$ | $15_{\ \text{11m30s}}$ | $135_{\ \text{88m18s}}$ |
| **Gemini** 2.5-Pro | $100_{\ \text{4m}}$ | $0_{\ \text{4m}}$ | $0_{\ \text{4m}}$ | $15_{\ \text{4m}}$ | $115_{\ \text{12m}}$ |
| **Qwen** 3-MAX-Thinking-Preview | $100_{\ \text{8m12s}}$ | $0_{\ \text{5m51s}}$ | $\text{Timeout}$ | $5_{\ \text{4m46s}}$ | $105$ |
| **豆包** Thinking | $90_{\ \text{Unknown}}$ | $12_{\ \text{Unknown}}$ | $0_{\ \text{Unknown}}$ | $0_{\ \text{Unknown}}$ | $102_{\ \text{Unknown}}$ |
| **Gemini** 2.5-flash | $100_{\ \text{3m}}$ | $0_{\ \text{2m}}$ | $0_{\ \text{2m}}$ | $0_{\ \text{2m}}$ | $100_{\ \text{9m}}$ |
| **Qwen** 3-MAX | $70_{\ \text{2m5s}}$ | $0_{\ \text{4m18s}}$ | $0_{\ \text{7m3s}}$ | $10_{\ \text{2m36s}}$ | $80_{\ \text{16m2s}}$ |
| **DeepSeek** Without Thinking | $15$ | $0$ | $0$ | $0$ | $15$ |

AI 生成的代码将**不会**公开。