Reminder: in case of any technical issues, you can use the lightweight website m1.codeforces.com, m2.codeforces.com, m3.codeforces.com. ×

### kingofnumbers's blog

By kingofnumbers, history, 3 years ago, ,

Hi,

This is to remind you that Google Code Jam Round 1B will be tomorrow at this time, Top 1000 will advance to 2nd round.

let's discuss the problems after the contest.

Good luck.

• +78

 » 3 years ago, # | ← Rev. 2 →   0 How to register the contest?Edit: "Coding has commenced! Registration is now closed." <== Okay :/
•  » » 3 years ago, # ^ |   +8 You can participate if you qualified during the Qualification Round.
 » 3 years ago, # |   +26 starts in 10 mins.GL & HF
 » 3 years ago, # |   -7 Very Bad round for me . I didn't understand why my solution fails on B . B had 40+ % accuracy. I tried to be Greedy it failed( At the back of my mind I had a kind of proof).Then I did a simply DP on integers but yet I recieved many WAs. Code . Can someone provide some trivial test ? I think my understanding of the statement is wrong!
•  » » 3 years ago, # ^ |   0 Well I solved in on small test, but failed on big one. Not sure why — maybe my solution is wrong, or just implementation (it is kinda complex, easy to make a mistake somewhere).
•  » » 3 years ago, # ^ |   0 Small passed. I did it by brute force.
•  » » 3 years ago, # ^ |   0 Input:1?6 31Expected Output:26 31
•  » » » 3 years ago, # ^ |   -8 How to solve second question for large input.
•  » » » » 3 years ago, # ^ |   +16 Go from left to right and try to assign digits either equal, or differing at most by 1 (to minimize the distance). If at some point prefixes differ, then you have to assign the rest free digits to 9 for the string with smaller prefix and assign all free digits to 0 for the other string. Otherwise, if you assign equal digits or they are given equal, just recurse further.Also, if you assign equal digits when both strings have "?" in this position, check only 0 0, it will minimize both scores.In such way the recursion never branches (or you can think that it has branches of length 1).
•  » » 3 years ago, # ^ |   0 1 ?5 10 This was in the test cases for small.
 » 3 years ago, # |   0 How to do C small?
•  » » 3 years ago, # ^ | ← Rev. 2 →   0 You can bruteforce it with simple recursion (trying to pick all possible combinations of valid participants). With careful implementation it passes.
•  » » 3 years ago, # ^ |   0 for Csmall write a bitmask DP by storing a mask of topics already used. Complexity O(2N * N * N).
•  » » 3 years ago, # ^ |   0 You can use dynamic programming. The state is the set of all already placed topics (represented as binary mask). To make a transition, just iterate through all possibilities to place a new topic, and check if it is faked. The complexity is O(2n * n2)
•  » » 3 years ago, # ^ |   +3 Split topics into 2 sets — fake and real. Then for each fake topic check if there are first and second word in 'real' topics set. Try all possible splits, 2^N for each test.
•  » » 3 years ago, # ^ |   0 It's simple: just check all the 2^n masks, O(n^2) for each mask. How to check it? For each topic marked as "fake" in this mask you should check whether the first word appears in the list of unfaked topics. Same for the second word. If both words do not appear — this mask can't be possible answer.
•  » » 3 years ago, # ^ |   0 My brute-force solution with complexity O(2n * n) following: Try all possible 2n mask, where 1 means, that topic if fake. The answer is maximum of bitcount(mask) where for each fake topic there are not fake topics with same first and second words. This check procedure can be done with O(n) complexity.
•  » » 3 years ago, # ^ |   +1 I did it with minimum edge cover. Build a bipartite graph and each entry is an edge connecting two vertices from the two sets. The answer is the total number of edges minus the minimum edge cover.
 » 3 years ago, # |   +16 Analysis can be found here.
•  » » 3 years ago, # ^ | ← Rev. 2 →   +58 I have a different solution to C than the analysis, and it does not involve being greedy at any stage. Consider the example they gave: HYDROCARBON COMBUSTION BIOMASS COMBUSTION QUAIL COMBUSTION QUAIL BEHAVIOR QUAIL CONTAMINATION GROUNDWATER CONTAMINATION GROUNDWATER HYDROLOGY Now, instead of finding minimum edge cover on the top graph, I simply find the maximum flow in the network below.The idea behind this is as follows. Let a single unit of flow represent a fake topic. Then it has to go through the middle edge, and only a single unit of flow can pass there. However, we have the additional restriction. Every word has to be in at least one legit topic. To enforce that the capacity of edges representing the words are their frequency minus one.
•  » » » 3 years ago, # ^ |   0 Can you show how you have enforced last condition by subtracting capacity by one? What is the final answer if flow is F. Isn't it F?
•  » » » » 3 years ago, # ^ |   +3 The topics contained in the flow found here are fakes, while the remaining topics are real.By reducing the capacity of each word by one, you ensure that each word has at least one unused topic remaining after the fake flow is constructed, i. e. that each word has at least one real topic.Imagine that after finding the fake flow, you subtract the fake flow from the graph, remove the word capacity bounds (but keep the topic capacity bounds) and find the maximum flow in the resulting graph. Then you’ll get the real flow, and it will incorporate all remaining topics due to the unbounded word capacities. By ensuring that this graph contains at least one topic involving each word, you ensure that the real topics cover all words, which is good. Conversely, if you hadn’t reduced the word capacities by one before finding the fake flow, the fake flow might have taken up all topics involving a particular word and you’d be left with no real topic covering that word, which would be bad.Of course, you want to minimize the number of real topics, so you want to minimize the number of edges remaining after subtracting the fake flow (because each remaining edge corresponds to a real topic), so you want to maximize the number of edges in the fake flow, so you want the fake flow to be maximal.
•  » » » 3 years ago, # ^ |   +10 I don't understand why they mentioned greediness. The answer is simply n — (number of different first words) — (number of different second words) + (size of maximum matching).
•  » » » » 3 years ago, # ^ |   +9 I'm guessing it's because rather than explaining how to get the size of the edge cover, they also wanted to explain how to construct the edge cover itself.
 » 3 years ago, # |   +59 when I see those large number of participants in GCJ I wonder are there a lot of competitive programmers who don't participate neither in CF nor in TC but only in GCJ?
•  » » 3 years ago, # ^ |   +28 I know a lot of guys who were active at CF/TC/CodeChef in past, and nowadays only participate in annual competitions like FHC, TCO, GCJ etc. A lot of people are active at online judges while preparing for ICPC, and then only participating in major competitions later.And also if you are considering active contestants, still a lot of them are only attending some small percentage of CF/TC contests, while trying not to miss events like GCJ.
•  » » » 3 years ago, # ^ |   +22 Also GCJ is quite friendly for languages like Python or even Sage, since you run everything locally and the time limit is a few minutes.
•  » » » 3 years ago, # ^ |   +19 but this reasoning is still not enough to cover the very large numbers of participants in GCJ, if you look on the number of participants of qualification round it is around 27,000 and 22,000 out of them qualified to round 1, which is even more than total number of accounts in CF without even removing the fake accounts :D also looking at the difficulty of today's round and the number of points required to qualify to 2nd round I can say that one need to be div1 coder in CF to be able to qualify to 2nd round (or have equivalent skills). 3,000 coders will advance to 2nd round which is more than the number of div1 accounts in CF, again without removing fake accounts :D
•  » » 3 years ago, # ^ | ← Rev. 2 →   +13 I think one of the main reasons is Googles brand (second place in Forbes rating after Apple). Every programming contest is positioning as a place for hiring of coders and about every coder wants to work at Google (of course the brand is not the only reason for that). So in GCJ are participating a lot of users who are not competing in other contests at all.
•  » » » 3 years ago, # ^ |   0 Google become most valuable company in the world not long time ago http://qz.com/607396/google-has-officially-dethroned-apple-as-the-worlds-most-valuable-company/
•  » » » » 3 years ago, # ^ |   +5 Actually I'm talking only about the Google brand. It seems I was wrong and Google on the third place according to Forbes rating.
 » 3 years ago, # |   -21 HOW to solve the 2nd question for large input.
 » 3 years ago, # |   +45 Very nice problems, as usual on GCJ.
 » 3 years ago, # |   0 Could someone upload a correct solution for the large practice data for task B? I've implemented mostly the same thing the analysis said, and the output does seem correct for the cases I can easily check by hand, but it's apparently incorrect for some. Probably a corner case...
•  » » 3 years ago, # ^ |   +13 You can download a solution of any participant in the scoreboard page: just set Solution Download checkbox.
 » 3 years ago, # |   -34 vi find(int freqs[]){ vi r; while(freqs['Z'-'A']-1 >= 0 && freqs['E'-'A']-1 >= 0 && freqs['R'-'A']-1 >= 0 && freqs['O'-'A']-1 >= 0){ freqs['Z'-'A']--; freqs['E'-'A']--; freqs['R'-'A']--; freqs['O'-'A']--; r.PB(0); } while(freqs['O'-'A']-1 >= 0 && freqs['N'-'A']-1 >= 0 && freqs['E'-'A']-1 >= 0){ freqs['O'-'A']--; freqs['N'-'A']--; freqs['E'-'A']--; r.PB(1); } while(freqs['T'-'A']-1 >= 0 && freqs['W'-'A']-1 >= 0 && freqs['O'-'A']-1 >= 0){ freqs['T'-'A']--; freqs['W'-'A']--; freqs['O'-'A']--; r.PB(2); } while(freqs['T'-'A']-1 >= 0 && freqs['H'-'A']-1 >= 0 && freqs['R'-'A']-1 >= 0 && freqs['E'-'A']-2 >= 0){ freqs['T'-'A']--; freqs['H'-'A']--; freqs['R'-'A']--; freqs['E'-'A']-=2; r.PB(3); } while(freqs['F'-'A']-1 >= 0 && freqs['O'-'A']-1 >= 0 && freqs['U'-'A']-1 >= 0 && freqs['R'-'A']-1 >= 0){ freqs['F'-'A']--; freqs['O'-'A']--; freqs['U'-'A']--; freqs['R'-'A']--; r.PB(4); } while(freqs['F'-'A']-1 >= 0 && freqs['I'-'A']-1 >= 0 && freqs['V'-'A']-1 >= 0 && freqs['E'-'A']-1 >= 0){ freqs['F'-'A']--; freqs['I'-'A']--; freqs['V'-'A']--; freqs['E'-'A']--; r.PB(5); } while(freqs['S'-'A']-1 >= 0 && freqs['I'-'A']-1 >= 0 && freqs['X'-'A']-1 >= 0){ freqs['S'-'A']--; freqs['I'-'A']--; freqs['X'-'A']--; r.PB(6); } while(freqs['S'-'A']-1 >= 0 && freqs['E'-'A']-2 >= 0 && freqs['V'-'A']-1 >= 0 && freqs['N'-'A']-1 >= 0){ freqs['S'-'A']--; freqs['E'-'A']-=2; freqs['V'-'A']--; freqs['N'-'A']--; r.PB(7); } while(freqs['E'-'A']-1 >= 0 && freqs['I'-'A']-1 >= 0 && freqs['G'-'A']-1 >= 0 && freqs['H'-'A']-1 >= 0 && freqs['T'-'A']-1 >= 0){ freqs['E'-'A']--; freqs['I'-'A']--; freqs['G'-'A']--; freqs['H'-'A']--; freqs['T'-'A']--; r.PB(8); } while(freqs['N'-'A']-2 >= 0 && freqs['I'-'A']-1 >= 0 && freqs['E'-'A']-1 >= 0){ freqs['N'-'A']-=2; freqs['I'-'A']--; freqs['E'-'A']--; r.PB(9); } return r; } Can somebody tell me what is wrong with this logic for problem A? (Besides the fact it is quite cumbersome), thanks
•  » » 3 years ago, # ^ |   -8 Also I have looked at a few solutions but I still dont get the idea those people have taken
•  » » » 3 years ago, # ^ |   0 Have you read the problem analysis? https://code.google.com/codejam/contest/11254486/dashboard#s=a&a=0
•  » » » » 3 years ago, # ^ |   0 No i wasnt aware of that analysis thanks, and thanks for the comment
•  » » 3 years ago, # ^ |   +6 Input string: FOURNINE Your program will take out a ONE, leaving FURNI, which can't be decomposed further.
•  » » » 3 years ago, # ^ |   0 I see, thanks
•  » » 3 years ago, # ^ |   0 As analysis say, you need to ensure that the order of your greedy is correct, which is not in this case. In the example TWOSEVEN, there are enough letters to take ONE and screw you over.
•  » » » 3 years ago, # ^ |   0 yea I was just reading the the analysis and I see now that my logic is the greedy impl there are talking about.
 » 3 years ago, # |   +210 Who invented that stupid upper bound on number of friends which is 30 -_-? Do Google's employees have less than 30 friends?
•  » » 3 years ago, # ^ |   +75 that is why google could not compete with facebook.
•  » » 3 years ago, # ^ |   +108 This is a way for you to decide who are you your real buddies.
•  » » 3 years ago, # ^ |   +21 Actually one page fits 30 people, so that's why.. :P
•  » » » 3 years ago, # ^ |   +22 Not actually correct. Back when one page of the full scoreboard contained only 25 entries, the number of friends was already 30.
•  » » 3 years ago, # ^ |   +5 I also think it's a stupid restriction, but since I can't keep track of even 30 people's performances anyway, I don't mind all that much.
 » 3 years ago, # |   0 Having qualified in this round, is it still going to be possible to take part in round 1C out of competition in real time? Or will I be limited to submitting after it's over?
•  » » 3 years ago, # ^ |   +17 Limited to submit only when it is over if you have passed 1A or 1B