给你一颗有根树,每个节点有一个逃脱代价 $t_u$,每个节点到达自己的父亲有一个代价 $f_u$,到达自己的孩子 $v$ 有一个代价 $g_v$。
每次给你一个 $u, k$,询问从 $u$ 出发,如何选取一个节点 $v$,使得从 $u$ 到 $v$ 的路径上每个点都距离根节点的边数不低于 $k$,且到达该点的代价加上从该点逃脱的代价尽量小?你有非常多组询问,你只需要每次回答最小的总代价。
输入格式
第一行包含八个非负整数 $n, m, \mathrm{SA}, \mathrm{SB}, \mathrm{SC}, t_1, t_2$,其中 $n$ 表示树的节点数,$m$ 表示询问次数。
接下来一行输入 $n$ 个非负整数 $t_i$。
接下来 $n - 1$ 行,每行输入 $3$ 个整数 $p_i, f_i, g_i$,$i$ 从 $2$ 开始编号,$p_i$ 是 $i$ 的父亲节点,保证 $p_i < i$。
为了减少输入和输出量,询问和输出可以认为由以下代码接管,注意下文中的 length[] 数组意为:第 $i$ 项是 $i$ 节点到根节点经过的边数。你要解决询问的部分是其中的 query() 函数。你可以在主程序中处理完 length[] 数组后调用一次 solve() 函数。
unsigned int SA, SB, SC;
int n, m, t1, t2;
unsigned int rng61() {
SA ^= SA << 16;
SA ^= SA >> 5;
SA ^= SA << 1;
unsigned int t = SA;
SA = SB;
SB = SC;
SC ^= t ^ SA;
return SC;
}
long long query(int u, int k);
void solve() {
long long lastans = 0, output = 0;
while (m--) {
int u = (rng61() ^ (t1 * lastans)) % n + 1;
int k = (rng61() ^ (t1 * lastans)) % (length[u] + 1) * t2;
lastans = query(u, k);
output ^= lastans + m;
}
printf("%lld\n", output);
}
你可以在下发文件中的 lyric/template.cpp 中找到这份代码。
输出格式
由上文中的 output 变量给出输出。
样例数据
样例 1 输入
10 10 629647033 688064407 427303738 1 1 8 7 16 11 7 20 18 9 16 6 1 3 13 2 8 11 3 12 3 4 20 3 5 10 14 3 19 8 7 9 8 8 12 18 6 10 10
样例 1 输出
23
样例 1 解释
下面是本样例的实际每次询问和答案:
4 2
10
1 0
8
6 2
16
10 6
6
6 4
16
6 0
16
6 2
16
6 3
16
10 0
6
1 0
8
数据范围
对于 $100\%$ 的数据,$1\le n\le 3\times 10^5, 1\le m \le 6\times 10^6, 0\le t_1, t_2 \le 1$,输入的其余整数均在 $0$ 至 $10^9$ 之间。
对于 $0\%$ 的数据,保证 $m \le 5\times 10^7$。
| 测试点 | $n$ | $m$ | $t_1$ | $t_2$ |
|---|---|---|---|---|
| $1$ | $=10$ | $=n$ | $0$ | $0$ |
| $2$ | $=10$ | $=n$ | $0$ | $1$ |
| $3$ | $=10$ | $=n$ | $1$ | $0$ |
| $4$ | $=10$ | $=n$ | $1$ | $1$ |
| $5$ | $=10^2$ | $=n$ | $0$ | $0$ |
| $6$ | $=10^2$ | $=n$ | $0$ | $1$ |
| $7$ | $=10^2$ | $=n$ | $1$ | $0$ |
| $8$ | $=10^2$ | $=n$ | $1$ | $1$ |
| $9$ | $=3,000$ | $=n$ | $0$ | $0$ |
| $10$ | $=3,000$ | $=n$ | $0$ | $1$ |
| $11$ | $=3,000$ | $=n$ | $1$ | $0$ |
| $12$ | $=3,000$ | $=n$ | $1$ | $1$ |
| $13$ | $=10^5$ | $=n$ | $0$ | $0$ |
| $14$ | $=10^5$ | $=n$ | $0$ | $1$ |
| $15$ | $=10^5$ | $=n$ | $1$ | $0$ |
| $16$ | $=10^5$ | $=n$ | $1$ | $1$ |
| $17$ | $=3\times 10^5$ | $=n$ | $0$ | $0$ |
| $18$ | $=3\times 10^5$ | $=n$ | $0$ | $1$ |
| $19$ | $=3\times 10^5$ | $=2\times10^6$ | $1$ | $0$ |
| $20$ | $=3\times 10^5$ | $=2\times10^6$ | $1$ | $1$ |
| $21,22$ | $=3\times 10^5$ | $=2\times10^6$ | $0$ | $1$ |
| $23,24$ | $=3\times 10^5$ | $=6\times10^6$ | $0$ | $1$ |
| $25$ | $=3\times 10^5$ | $=6\times10^6$ | $1$ | $1$ |
故事
那段童话般的时光,一带而过。兰长大了,世界变了。
总不能伪造空中楼阁吧?我不愿这么做,可是……事已至此,我必须让她见一见“新世界”。
茫然、惊愕。这是她第一次见到时的样子。尽管我们预演过千百遍。
成长?不,我不承认!为什么世界非得是这个样子?为什么世界要打碎每一个梦境?而我不得不放她去感受那份“无援和恐惧”?
饶了我吧,我可做不到还故作欣慰,或者大义凛然地说,这是什么“成长”。
我怕战争和仇恨的烈火熏坏她的双眼;
我怕愚昧的泥污感染她的清澈;
我怕世间的冰棱熄灭她的炽热。
她在原来的画室呆坐了一整天,呆呆地看着曾经绘制的星空。
第二天,她有一根头发白了。
“那些艺术……还有意义吗!”
是啊,画画是野蛮的,写诗是野蛮的。
我曾回答过她的十万个为什么。但今天我却不知答案。
或者说,我不知道该怎么回答,她。只好低着头,咬紧牙。
“……对不起。”
那座殿堂轰然倒塌了。如同泉涌。
天上的星星也在流血。
我要带着兰一同离开这个地方。
而离开的办法,只能从远古的符文中寻找答案。
远古魔法的符文系统十分复杂,它的字母种类数不胜数,时间紧迫,我不打算告诉这些细节了,我只会告诉你一颗有根树,你可以认为从根到一个节点的路径就代表着一个字符串。我随身携带的符文也可以用一个节点 $u$ 表示。树上每个节点都可以带我们离开,如果我现在持有的符文是节点 $u$ ,则需要消耗 $t_u$ 的时间用来发动。但是我持有的符文同时是可以修改的,这同样需要时间。我抹去符文的最后一个字,即从位于节点 $u$ 变成位于其父亲,这需要 $f_u$ 的时间,也可以变成位于其一个儿子 $v$,这需要 $g_v$ 的时间。
此外还有一个限制:在任何时候,我需保证字符串长度不能低于 $k$,字符串长度就是根节点到我所在节点经过的边数。
我想请你帮我的是,如何使用最短的时间完成逃离?我可能会给你多个问题,时间紧迫,请你尽快告诉我答案。
歌词
在无趣人生之中,撞出水花,
在烟火虹霓之中,做梦想家,
逆光而来的剪影,心跳一霎,
——“ 那是你啊。”
在平淡际遇之中,时光发芽,
在空旷教室大喊,未曾声沙,
我眼中所有色彩,最明亮的,
——“只有你啊。”