Το πάρκο με τα συντριβάνια (parks)
Σε ένα κοντινό πάρκο, υπάρχουν συντριβάνια, αριθμημένα από
έως
. Κάθε συντριβάνι αντιστοιχεί σε ένα σημειό στο διδιάστατο επίπεδο. Συγκεκριμένα, το
-οστό συντριβάνι (
) είναι ένα σημείο (
,
) όπου οι συντεταγμένες
και
είναι άρτιοι ακέραιοι αριθμοί. Οι θέσεις όλων των συντριβανιών είναι διαφορετικές.
Ο Τιμόθεος ο αρχιτέκτων έχει αναλάβει να κατασκευάσει μερικούς δρόμους και να τοποθετήσει ένα παγκάκι σε κάθε δρόμο. Κάθε δρόμος είναι ένα οριζόντιο ή ένα κατακόρυφο ευθύγραμμο τμήμα μήκους , του οποίου τα άκρα είναι δύο διαφορετικά συντριβάνια. Οι δρόμοι πρέπει να κατασκευαστούν έτσι ώστε να μπορεί κάποιος να ταξιδέψει από οποιοδήποτε συντριβάνι προς οποιοδήποτε άλλο συντριβάνι, κατά μήκος των δρόμων. Αρχικά δεν υπάρχει κανένας δρόμος στο
πάρκο.
Για κάθε δρόμο, ακριβώς ένα παγκάκι πρέπει να τοποθετηθεί στο πάρκο και να αντιστοιχιστεί (δηλαδή, να τοποθετηθεί έτσι ώστε να βλέπει) αυτόν το δρόμο. Κάθε παγκάκι πρέπει να τοποθετηθεί σε κάποιο σημείο (,
) έτσι ώστε οι συντεταγμένες
και
να είναι περιττοί ακέραιοι αριθμοί. Οι θέσεις όλων των παγκακιών πρέπει να είναι διαφορετικές. Ένα παγκάκι που βρίσκεται στη θέση (
,
) μπορεί να αντιστοιχιστεί με ένα δρόμο μόνο αν και τα δύο άκρα του δρόμου είναι κάποια από τα σημεία (
,
), (
,
), (
,
) και (
,
). Για παράδειγμα, ένα
παγκάκι στη θέση (
,
) μπορεί να αντιστοιχιστεί μόνο σε κάποιον από τους δρόμους που ορίζονται από τα εξής τέσσερα ευθύγραμμα τμήματα: (
,
) - (
,
), (
,
) - (
,
), (
,
) - (
,
), (
,
) - (
,
).
Βοηθήστε τον Τιμόθεο να αποφασίσει αν είναι δυνατό να κατασκευαστούν δρόμοι και παγκάκια έτσι ώστε να πληρούνται όλοι οι παραπάνω περιορισμοί. Αν αυτό είναι εφικτό, δώστε του μία δυνατή λύση. Αν υπάρχουν περισσότερες λύσεις που ικανοποιούν όλους τους περιορισμούς, δώστε του οποιαδήποτε από αυτές.
Λεπτομέρειες υλοποίησης
Πρέπει να υλοποιήσετε την παρακάτω συνάρτηση:
int construct_roads(int[] x, int[] y)
,
: δύο πίνακες μήκους
. Για κάθε
(
), το συντριβάνι
βρίσκεται στο σημείο (
,
), όπου οι συντεταγμένες
και
είναι άρτιοι ακέραιοι αριθμοί.
- Αν η κατασκευή είναι εφικτή, η συνάρτηση αυτή πρέπει να κάνει ακριβώς μία κλήση στη συνάρτηση build (βλ. παρακάτω) για να δώσει τη λύση και στη συνέχεια πρέπει να επιστρέφει
1
. - Διαφορετικά, η συνάρτηση αυτή πρέπει να επιστρέφει
0
χωρίς να κάνει καμία κλήση στη συνάρτηση build. - Η συνάρτηση αυτή θα κληθεί ακριβώς μία φορά.
Η υλοποίησή σας μπορεί να καλεί την ακόλουθη συνάρτηση για να δώσει μία εφικτή κατασκευή των δρόμων και μία τοποθέτηση των παγκακιών:
void build(int[] u, int[] v, int[] a, int[] b)
- Έστω
το συνολικό πλήθος των δρόμων που θα κατασκευαστούν.
,
: δύο πίνακες μήκους
, που παριστάνουν τους δρόμους που θα κατασκευαστούν. Οι δρόμοι είναι αριθμημένοι από
έως
-
. Για κάθε
(
), ο
-οστός δρόμος συνδέει τα συντριβάνια
και
. Κάθε δρόμος πρέπει να είναι ένα οριζόντιο ή ένα κατακόρυφο ευθύγραμμο τμήμα μήκους
. Δύο διαφορετικοί δρόμοι μπορούν να έχουν το πολύ ένα κοινό σημείο (ένα συντριβάνι). Όταν κατασκευαστούν οι δρόμοι, πρέπει να είναι δυνατό να ταξιδέψει κανείς από οποιοδήποτε συντριβάνι σε οποιοδήποτε άλλο κατά μήκος των δρόμων.
,
: δύο πίνακες μήκους
, που παριστάνουν τα παγκάκια. Για κάθε
(
), ένα παγκάκι τοποθετείται στη θέση (
,
), και αντιστοιχεί στο δρόμο
. Δεν μπορούν να τοποθετηθούν δύο παγκάκια στην ίδια θέση.
Παραδείγματα
Παράδειγμα 1
Έστω η εξής κλήση:
construct_roads([4, 4, 6, 4, 2], [4, 6, 4, 2, 4])
Αυτό σημαίνει ότι υπάρχουν 5 συντριβάνια:
- το συντριβάνι
βρίσκεται στη θέση (
,
),
- το συντριβάνι
βρίσκεται στη θέση (
,
),
- το συντριβάνι
βρίσκεται στη θέση (
,
),
- το συντριβάνι
βρίσκεται στη θέση (
,
),
- το συντριβάνι
βρίσκεται στη θέση (
,
).
- Είναι δυνατό να κατασκευαστούν οι ακόλουθοι
δρόμοι, καθένας από τους οποίους συνδέει δύο συντριβάνια, και να τοποθετηθούν τα αντίστοιχα παγκάκια:
Αριθμός δρόμου | Αριθμός συντριβανιών που συνδέει | Θέση του αντίστοιχου παγκακιού |
0 | 0, 2 | (5, 5) |
1 | 0, 1 | (3, 5) |
2 | 3, 0 | (5, 3) |
3 | 4, 0 | (3, 3) |
Η λύση αυτή φαίνεται στο ακόλουθο σχήμα:
Για να δώσει αυτή τη λύση, η συνάρτηση construct_roads πρέπει να κάνει την εξής κλήση:
build([0, 0, 3, 4], [2, 1, 0, 0], [5, 3, 5, 3], [5, 5, 3, 3])
Στη συνέχεια πρέπει να επιστρέψει 1
.
Προσέξτε ότι σε αυτή την περίπτωση, υπάρχουν περισσότερες λύσεις που ικανοποιούν τους περιορισμούς και ότι όλες θα θεωρηθούν σωστές. Για παράδειγμα, είναι επίσης σωστό να κληθεί
build([1, 2, 3, 4], [0, 0, 0, 0], [5, 5, 3, 3], [5, 3, 3, 5])
και στη συνέχεια να επιστραφεί 1
.
Παράδειγμα 2
Έστω η εξής κλήση:
construct_roads([2, 4], [2, 6])
Το συντριβάνι βρίσκεται στη θέση (
,
) και το συντριβάνι
βρίσκεται στη θέση (
,
). Εφόσον δεν υπάρχει τρόπος να κατασκευαστούν δρόμοι έτσι ώστε να ικανοποιούνται οι περιορισμοί, η
συνάρτηση construct_roads πρέπει να επιστρέφει
0
χωρίς να κάνει καμία κλήση της build.
Περιορισμοί
(για κάθε
)
και
είναι άρτιοι ακέραιοι (για κάθε ~0 \le i \le n - 1).
- Δεν υπάρχουν δύο συντριβάνια που να βρίσκονται στην ίδια θέση.
Υποπροβλήματα
- (
βαθμοί)
=
(για κάθε
)
- (
βαθμοί)
(για κάθε
)
- (
βαθμοί)
(για κάθε
)
- (
βαθμοί) Υπάρχει το πολύ ένας τρόπος να κατασκευαστούν οι δρόμοι, έτσι ώστε να είναι δυνατό να ταξιδέψει κανείς από οποιοδήποτε συντριβάνι σε οποιοδήποτε άλλο, κατά μήκος τους.
- (
βαθμοί) Δεν υπάρχουν τετράγωνα διαστάσεων \(2 × 2\) με τέσσερα συντριβάνια στις κορυφές τους.
- (
βαθμοί) Χωρίς επιπλέον περιορισμούς.
Υποδειγματικός βαθμολογητής
Ο υποδειγματικός βαθμολογητής διαβάζει την είσοδο ως εξής:
- γραμμή
:
- γραμμή
+
(
):
Η έξοδος του υποδειγματικού βαθμολογητή είναι ως εξής:
- γραμμή
: η τιμή επιστροφής της construct_roads
Αν η τιμή επιστροφής της construct_roads είναι
και η build(
,
,
,
) καλείται, ο βαθμολογητής επιπρόσθετα εκτυπώνει:
γραμμή
:
- γραμμή
+
(
):
Comments