Canadian Computing Competition: 2013 Stage 1, Senior #4
You have a few minutes before your class starts, and you decide to compare the heights of your classmates. You don't have an accurate measuring device, so you just compare relative heights between two people: you stand two people back-to-back, and determine which one of the two is taller. Conveniently, none of your classmates are the same height, and you always compare correctly (i.e., you never make a mistake in your comparisons).
After you have done all of your comparisons, you would like to determine who the tallest person is between two particular classmates.
Input Specification
The first line contains two integers and
separated by one space.
, the number of people in the class, is an integer with
.
, the number of comparisons that have already been done, is
an integer with
. Each of the next
lines contains two distinct integers
and
(
) separated by a space, indicating that person number
was determined to be taller than person number
. Finally, the last line contains two distinct integers
and
(
) separated by one space: your goal is to determine, if possible, whether person
is taller than person
. Note that it may be the case that neither
nor
occur in the input concerning measurements between classmates, and each measurement between any two particular people will be recorded exactly once.
An additional subtask worth 33% of the points have been added to break incorrect solutions which AC on official test data. Data provided by
and .Output Specification
The output is one line, containing one of three possible strings:
- yes (if
is taller than
),
- no (if
is taller than
),
- unknown (if there is not enough information to determine the relative heights of
and
).
Sample Input 1
10 3
8 4
3 8
4 2
3 2
Output for Sample Input 1
yes
Sample Input 2
10 3
3 8
2 8
3 4
3 2
Output for Sample Input 2
unknown
Comments
I keep TLEing on the 3rd case in batch 5. I graded the code on cccgrader and it seems to work fine with everything except for the one case. Does the test case test for infinite loops because I can't find the error in my code. help :(
Since the original data were weak, an additional test case was added to buff the existing data to break incorrect solutions, and all submissions were rejudged.
I'm getting TLE on 6 and 7 (python 3). I tried submitting with pypy3 but I still seem to time out. I have no idea how to make it faster. Appreciate any help.
Try using a deque instead of a list. Popping will then take constant time.
Thanks for the tip, switching my input functions to sys readline ended up solving it.
Does anyone know why this submission is TLE'ing at the 6th and 7th batch? https://dmoj.ca/src/4193355 I don't know how to make it faster, could someone help me?
Submitting with PyPy3 instead of Python 3 solves the TLE issue. In the future, you can join the DMOJ Discord for help.
Ok I will, thank you by the way!
Help... I constantly got TLE on the last two subtasks. To reduce the time, I tried BFS, I tried HashSet, I tried BufferedReader, but the first task in the second last subtask always gives me TLE. Here's my code (java). I looked up solutions online, and they are all super similar to mine. Anyone knows what's wrong with my code?
Your method of storing the graph is very inefficient. Due to the high constraint, your code would be too slow. However, you are pretty close to the TL.
It's too slow.
This comment is hidden due to too much negative feedback. Show it anyway.
The issue isn't with python, your code just isn't very efficient. First of all, using "not in" to check if something is visited already is very slow. I'm pretty sure it just brute forces the entire array to check if the element is in there which makes it O(n) when checking if something is visited should be O(1). A better alternative is to check if the index of the element has already been marked as true. You also used "in" to check if person p/q is in the queue when instead you can just terminate bfs as soon as you encounter them. Also, you need to mark something as visited immediately after adding it to the queue rather than after retrieving it from the queue. This way you won't add the same element to the queue multiple times.
Not sure about that 80% calculation, but if you did any sort of checking over AC submissions, you'll see that there are many ACs in Python, so using it would not prevent you from getting your 10 points.
Feel like it would be weird if you came up to someone and started just measuring their height, but what do I know.
I think it's weirder that your class can have 100000 students.
Agreed
My code printed "unknown" but for some reason it "tle"d.
Plz check.
HashSets are pretty slow. If you change all your HashSets to ArrayLists you won't TLE anymore.
I thought HashSets has O(1) time while ArrayList has O(n)? I tried to convert HashSets into ArrayLists, but the time is not faster nor slower.
thx but i already switched to linkedlists.
This comment is hidden due to too much negative feedback. Show it anyway.
You are initializing an array of
. Try using an adjacency list instead.
This comment is hidden due to too much negative feedback. Show it anyway.
I think the main reason is just that your BFS algorithm is kind of weird. I recommend looking at some standard BFS implementations.
To fix your issue with going over the time limit I suggest learning how to use a BufferedReader.
This comment is hidden due to too much negative feedback. Show it anyway.
directional
I really like the fact that this problem goes for the realism. Its something that you rarely see in a programming contest. I appreciate CCC for acknowledging the fact that class sizes in Canada have become far too large. Join this petition to create classrooms where LESS than 100 000 have to be crammed together. I mean, how would it be even remotely possible to personally teach all of these children. Think of the children!
Screw doug ford!!
std::sort(students, students + numStudents);
I wish c++ worked in real life
memset(students_marks, 0, numstudents);