#CSPSMNS01D. 虚树

虚树

【题目描述】

有一棵 𝑛𝑛 个节点,边权是正整数的树,和一个 1𝑛1 ∼ 𝑛 的排列 𝑝𝑝。 有 𝑄𝑄 次询问,每次给出 𝑙,𝑟,𝑘𝑙, 𝑟, 𝑘,你需要回答在 𝑝𝑝 的区间 [𝑙,𝑟][𝑙, 𝑟] 中选 𝑘𝑘 个点,问这 𝑘𝑘 个点构成的虚树的边权和最大是多少。

样例下载:sample.zip

解码函数

inline void decode(int &l, int &r, int &k, i64 lstans, int testop) {
    lstans %= 19260817;
    if(testop) {
        l ^= lstans; l = (l % n + n) % n + 1;
        r ^= lstans; r = (r % n + n) % n + 1;
        if(l > r) std :: swap(l, r);
        k ^= lstans;
        k = (k % std :: min(r - l + 1, 100)) + 1;
     }
}

【输入格式】

第一行一个整数 idid,表示测试点编号,样例编号为 0。

第二行两个整数 opop, 𝑛𝑛,表示是否 强制在线和树的大小。

接下来 𝑛1𝑛 − 1 行,每行三个正整数 𝑢𝑖𝑢_𝑖 , 𝑣𝑖𝑣_𝑖 , 𝑤𝑖𝑤_𝑖,表示 𝑢𝑖𝑢_𝑖 , 𝑣𝑖𝑣_𝑖 之间有一条边权为 𝑤𝑖𝑤_𝑖 的边。 接下来一行 𝑛𝑛 个数,表示排列 𝑝𝑝

接下来一行一个整数 𝑄𝑄,表示询问个数。

接下来 𝑄𝑄 行,每行三个正整数 𝑙,𝑟,𝑘𝑙, 𝑟, 𝑘,含义如题。

op=1op = 1,则当前测试点强制在线,每次的 𝑙,𝑟,𝑘𝑙, 𝑟, 𝑘 需要调用下发的解码函数。

【输出格式】

输出包含若干行,对于每个询问输出一行一个正整数表示答案。

【样例 1 输入】

0
0 8
2 1 168841147
3 2 185715402
4 3 225620062
5 2 229186192
6 1 56387677
7 1 912381225
8 6 897978762
6 8 4 1 3 2 5 7
10
1 4 1
3 8 4
1 3 2
2 8 3
3 4 1
1 5 5
1 6 1
3 7 2
3 6 4
1 4 3

【样例 1 输出】

0
1721744028
1534543050
2446924275
0
1534543050
0
640521656
580176611
1534543050

【备注】

测试点编号 nn QQ kk opop 特殊性质
1 8 10 8 0
2 1
3 100 100 0
4 1
5 1000 10000 0
6 1
7 200000 1000 0
8 1
9 − 10 10000 2 0
11 100 树形态随机
12 1
13 0 1 的度数为 n − 1
14 1
15 − 16 0 l = 1, r = n
17 − 18 r − l + 1 ≤ 100
19
20 1