QOJ.ac

QOJ

시간 제한: 1 s 메모리 제한: 256 MB 총점: 100 난이도: [표시] 인터랙티브

#51. Popa

통계

"הוא פורע חוק והוא מפורסם, Andrii Popa האמיץ.

יומם ולילה הוא רוכב, הוא גובה את המס שלו מהדרך הראשית ובכל מקום במדינה לוכדי הגנבים בורחים מהר ככל יכולתם"

— "Andrii Popa", Phoenix

ל-Ghiță יש סדרה $S$ הממוספרת החל מ-$0$ של $N$ משקלים שלמים חיוביים. מאחר שהוא מלך הקרפטים, הוא רוצה לבנות עץ בינארי שצמתיו בעלי אינדקסים $0, 1, \ldots, N - 1$ כך שמתקיים:

  • סריקת תוכן (inorder traversal) של העץ מניבה את הצמתים בסדר עולה של האינדקסים. סריקת תוכן של עץ בינארי מורכבת מסריקת התוכן של תת-העץ ששורשו בבן השמאלי של השורש (אם בן כזה קיים), אחריה האינדקס של השורש, ואחריה סריקת התוכן של תת-העץ ששורשו בבן הימני של השורש (אם בן כזה קיים).
  • אם צומת $x$ הוא האב של צומת $y$, אזי $S_x$ מחלק את $S_y$.

נזכיר כי עץ בינארי הוא מבנה נתונים עצי שבו לכל צומת יש לכל היותר שני בנים, הנקראים הבן השמאלי והבן הימני.

לרוע המזל, פורע החוק המפורסם Andrii Popa גנב את הסדרה $S$, ו-Ghiță אינו יכול עוד לגשת אליה ישירות. באמצעות טכנולוגיה מתקדמת (הטלפון הנייד שלו), הוא יכול, עבור כל שתי תת-סדרות רציפות $[a, b]$ ו-$[c, d]$ של $S$, לברר האם $\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$ בדיוק שכבר הוקצו.

הפונקציה solve עשויה להיקרא לכל היותר $5$ פעמים במהלך הרצה בודדת. אנו ממליצים להיזהר בשימוש במשתנים גלובליים.

המתחרה רשאי להשתמש בפונקציה הבאה:

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

פונקציה זו תחזיר $1$ אם ורק אם $\gcd[a, b]$ שווה ל-$\gcd[c, d]$, כאשר $0 \le a \le b < N$ ו-$0 \le c \le d < N$, ו-$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.