Task: | Coins |
Sender: | HIIT AND RUN |
Submission time: | 2018-05-26 14:47:44 +0300 |
Language: | Java |
Status: | READY |
Result: | TIME LIMIT EXCEEDED |
test | verdict | time | |
---|---|---|---|
#1 | TIME LIMIT EXCEEDED | -- | details |
#2 | TIME LIMIT EXCEEDED | -- | details |
#3 | TIME LIMIT EXCEEDED | -- | details |
#4 | TIME LIMIT EXCEEDED | -- | details |
#5 | TIME LIMIT EXCEEDED | -- | details |
Code
//package lol; import java.util.*; public class C { public static void main(String[] args) { Scanner io = new Scanner(System.in); int n = io.nextInt(); TreeSet<Integer> l = new TreeSet<>(); TreeSet<Integer> r = new TreeSet<>(); List<Integer> backtrackActions = new ArrayList<>(2*n); for (int i=0; i<n; i++) { int coin = io.nextInt(); int leftOrRight = io.nextInt(); backtrackActions.add(coin); backtrackActions.add(leftOrRight); if (leftOrRight == 1) l.add(coin); else r.add(coin); } // asetetaan "to" se mis on isoin TreeSet<Integer> to = r; TreeSet<Integer> from = l; if (!l.isEmpty()) { if (r.isEmpty() || l.last() > r.last()) { to = l; from = r; } } Integer largest = to.last(); // iterate vikavastaus -> actionit -> 2.vika vastaus -> actionit -> ... List<String> ans = new ArrayList<>(n); PriorityQueue<Integer> pq = new PriorityQueue<>(); int countRemovedSmalls = 0; int i=backtrackActions.size()-1; while (true) { int smallestInFrom = (from.isEmpty() ? 0 : from.first()); //System.out.println("smallestInFrom " + smallestInFrom); //System.out.println("to == r ? " + (to == r ? true : false)); // vastaus int countSmallerThanFromSmallest = Math.max(0, smallestInFrom - 1 - countRemovedSmalls); int isojaMatchaavia = to.size() - countSmallerThanFromSmallest; //System.out.println("debug " + isojaMatchaavia + " " + from.size() + " " + countSmallerThanFromSmallest); if (isojaMatchaavia >= from.size()) ans.add(to == r ? "<" : ">"); else ans.add("?"); // actioni alkaa if (i <= 2) break; int leftOrRight = backtrackActions.get(i--); int coin = backtrackActions.get(i--); //System.out.println("Removing " + coin); if (coin < smallestInFrom) { to.remove(coin); countRemovedSmalls++; } else if (coin == smallestInFrom) { from.remove(coin); countRemovedSmalls++; int newSmallest = (from.isEmpty() ? 0 : from.first()); while (!pq.isEmpty() && pq.peek() < newSmallest) { pq.poll(); countRemovedSmalls++; } } else if (coin == largest) { to.remove(coin); largest = (to.isEmpty() ? null : to.last()); //System.out.println("largest " + largest); if (largest == null || (!from.isEmpty() && from.last() > largest)) { // swap to and from TreeSet<Integer> helper = from; from = to; to = helper; largest = to.last(); } pq.add(coin); } else { if (leftOrRight == 2) r.remove(coin); else l.remove(coin); pq.add(coin); } } Collections.reverse(ans); for (String s : ans) System.out.println(s); } }
Test details
Test 1
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 175878 1 146174 1 4939 2 181388 1 ... |
correct output |
---|
> > > > > ... |
user output |
---|
(empty) |
Test 2
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 1 2 2 1 3 2 4 1 ... |
correct output |
---|
< > < > < ... |
user output |
---|
(empty) |
Test 3
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 1 1 2 1 3 1 4 1 ... |
correct output |
---|
> > > > > ... |
user output |
---|
(empty) |
Test 4
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 1 1 2 1 3 1 4 1 ... |
correct output |
---|
> > > > > ... |
user output |
---|
(empty) |
Test 5
Verdict: TIME LIMIT EXCEEDED
input |
---|
200000 188909 2 58944 1 26824 1 143263 2 ... |
correct output |
---|
< < ? < < ... |
user output |
---|
(empty) |