QOJ.ac

QOJ

حد الوقت: 1 s حد الذاكرة: 256 MB مجموع النقاط: 100 الصعوبة: [عرض] تفاعلية

#51. Popa

الإحصائيات

「彼は無法者にして名高き男、 勇敢なる Andrii Popa。

昼も夜も馬を駆り、 街道で年貢を取り立てる。 国中のどこでも 盗賊捕りたちは全力で逃げ出している」

— “Andrii Popa”, Phoenix

Ghiță は $N$ 個の正の整数の重みからなる $0$ 始まりの列 $S$ を持っています。彼はカルパティア山脈の王であるため、頂点の番号が $0, 1, \ldots, N - 1$ である二分木であって、次の条件を満たすものを構築したいと考えています。

  • 木の通りがけ順(中間順)走査によって、頂点が番号の昇順に得られる。二分木の通りがけ順走査は、根の左の子を根とする部分木の通りがけ順走査(左の子が存在する場合)、根の番号、根の右の子を根とする部分木の通りがけ順走査(右の子が存在する場合)をこの順に並べることで構成される。
  • 頂点 $x$ が頂点 $y$ の親であるならば、$S_x$ は $S_y$ を割り切る。

二分木とは、各頂点が最大で $2$ 個の子(それぞれ左の子、右の子と呼ばれる)を持つ木構造のデータ構造であることを思い出しましょう。

残念なことに、名高い無法者 Andrii Popa が列 $S$ を盗んでしまったため、Ghiță はもはや $S$ に直接アクセスすることができません。高度な技術(彼の携帯電話)を使うことで、彼は $S$ の任意の $2$ つの連続部分列 $[a, b]$ と $[c, d]$ について、$\gcd[a, b]$ と $\gcd[c, d]$ が等しいかどうかを知ることができます。ここで、$\gcd[x, y]$ は $S_x, S_{x+1}, S_{x+2}, \ldots, S_y$ の最大公約数です。残念ながらこの技術は非常に高価であり、Ghiță がこれを $Q$ 回より多く使用すると、多額の罰金を支払わなければなりません。この技術の使用回数を最大 $Q$ 回までに抑えて目的の木を構築し、彼を助けてください。これが可能であることは保証されています。条件を満たす任意の解が受理されます。

インタラクション

競技者はヘッダ popa.h(C / C++)をインクルードするか、popa.pas(Pascal)を実装しなければなりません。競技者は次の関数を実装する必要があります。

int solve(int N, int* Left, int* Right);
function solve(N: LongInt, var Left, Right: array of LongInt): LongInt;

この関数は木の根を返し、$\text{Left}_i$ と $\text{Right}_i$ にそれぞれ頂点 $i$ の左の子と右の子を設定しなければなりません。頂点 $i$ が左の子を持たない場合、$\text{Left}_i$ は $-1$ でなければなりません。頂点 $i$ が右の子を持たない場合、$\text{Right}_i$ は $-1$ でなければなりません。Left と Right は、すでに確保されたサイズちょうど $N$ の $2$ つの配列を指しています。

関数 solve は $1$ 回の実行中に最大 $5$ 回呼び出される可能性があります。グローバル変数の扱いには注意することをお勧めします。

競技者は次の関数を使用することができます。

int query(int a, int b, int c, int d);
function query(a, b, c, d: LongInt): LongInt;

この関数は、$0 \le a \le b < N$ かつ $0 \le c \le d < N$ のもとで $\gcd[a, b]$ が $\gcd[c, d]$ に等しいとき、かつそのときに限り $1$ を返し、そうでないときは $0$ を返します。

小課題

小課題 1(37 点)

  • $N = 100$
  • $Q = 10000$

小課題 2(24 点)

  • $N = 1000$
  • $Q = 20000$

小課題 3(39 点)

  • $N = 1000$
  • $Q = 2000$

入出力例

$S = [12, 4, 16, 2, 2, 20]$ に対するインタラクションの例は次の通りです。

solve の呼び出し query の呼び出し solve の呼び出し後
solve(6, Left, Right)
query(0, 1, 3, 5) は $0$ を返す
query(4, 5, 1, 3) は $1$ を返す
solve は $3$ を返す; Left は [-1, 0, -1, 1, -1, -1] を指す; Right は [-1, 2, -1, 4, 5, -1] を指す

注記

前の例に対して Ghiță が求めている種類の木の一例は次の通りです。

problem_51_9045a83d122fa86162a3e40ade701483.png

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.