QOJ.ac

QOJ

時間限制: 3 s 記憶體限制: 512 MB 總分: 100

#350. 旅行詩

统计

根付き木が与えられます。各ノードには脱出コスト $t_u$ があり、ノードから親へ移動するコストは $f_u$、子 $v$ へ移動するコストは $g_v$ です。

毎回 $u, k$ が与えられます。ノード $u$ から出発し、あるノード $v$ を選択して移動することを考えます。このとき、移動経路上のすべてのノードについて、根からの辺の数(深さ)が $k$ 以上である必要があります。この条件を満たしつつ、「$u$ から $v$ への移動コスト」と「$v$ での脱出コスト」の合計を最小化してください。クエリは非常に多いため、各クエリに対して最小の合計コストを答えてください。

入力

1行目に8つの非負整数 $n, m, \mathrm{SA}, \mathrm{SB}, \mathrm{SC}, t_1, t_2$ が与えられます。ここで $n$ は木のノード数、$m$ はクエリ数です。

続く1行に $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

注記

このサンプルの各クエリと回答は以下の通りです。

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$ 未満になってはならない。文字列の長さとは、根ノードから現在地までの辺の数である。

君に頼みたいのは、最短時間で脱出する方法だ。複数の問題を出すかもしれない。時間がないので、できるだけ早く答えを教えてほしい。

歌詞

無趣な人生の中で、水しぶきを上げて、

花火とネオンの中で、夢想家になる、

逆光から来るシルエット、心拍が一瞬、

——「それは君だ。」

 

平坦な出会いの中で、時が芽吹き、

空っぽの教室で叫ぶ、声は枯れず、

私の瞳に映るすべての色彩、最も明るいのは、

——「君だけだ。」

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.