nik_exists's blog

By nik_exists, 3 months ago, In English

This blog post is inspired by RobinFromTheHood's blog post.

Creating Problems

After Codeforces Round 1074 (Div. 4) ended, I received many questions about how to write a contest along with how the proposal process works, so I thought that I might write a blog post all about it. I'll be mentioning different problems I made throughout the round setting process, and copying from this post, I'll be denoting final problems in bold, and I'll be denoting the $$$n$$$-th iteration of a problem by putting that many apostrophes after it: e.g A' is the first iteration of problem A, A'' is the second, and so on. Similarly, I won't go into detail about why a problem wasn't used.

I started competitive programming on Codeforces in the summer of 2024, though I had dipped my toes into it with some in person competitions and Advent Of Code before then; even before that, I used to practice coding on sites like Codewars. Even back then, I was thinking of problems: I came up with problems B' and C' back in November 2024.

Sometime in March, I made problem F', and planned to propose it to USACO, though I ended up getting cold feet and not submitting it.

Sometime during April, I decided to try writing a contest for Codeforces, inspired by RobinFromTheHood's blog post about making his own round. I had initially planned to propose the round as a Div3 (to the person who commented that this round feels like a Div3 shifted over by one problem, you're partly correct on that :) ). During the summer, I made problems A', D', and E', G'. I didn't really like G', so I scrapped it and thought the problemset would be good for a Div4, and I turned problems A', B', C', D', E', F' into B, C, D'', E'', F'', and G. I added A to finish the problemset. I had made a rough preparation of the problems in Polygon.

Proposing the contest

My first thought was to send a message to Vladosiya, thinking that I could do the same thing as RobinFromTheHood when proposing his round. However, I was unable to get in contact with him and after a couple of weeks of being left on unread, I decided to dm cry, who accepted the proposal. After waiting for him to get to the next arena in Clash Royale do his very important coordinator work, he rejected problem E'', accepted problem E''', changed D'' into D''', and made a couple of other changes. After the problemset was approved, I prepared my problemset completely in Polygon, and we went off to the testing phase.

Testing

I won't go too much into detail on this, but we removed F'' and moved E''' to F because testers thought it was too difficult to just be an E. When trying to come up with a new E, I came up with H. Finally, I came up with E (or rather buffed a problem that I had thought of a while back), which after some internal back and forth, was accepted.

A week before the round, I learned that D'' was already used in another contest a while back, and since D''' was just a buffed version of D'', we removed it from the round, and I took another idea I had a while back and turned it into D

Confusing? I know, I suck at writing. Anyways, here's a AI summary since I'm too lazy to rewrite the above section

AI Summary

During the round

I was super excited for the round, and when it finally started, it was a bit hectic but also super fun!

I was admittedly nervous about something going terribly wrong with the contest; my main concern was with problem H, where I worried that the internal solution would TLE or that something else would go wrong. With that being said, almost everything went well; there was an pretty major issue in regards to one of the problems, but it thankfully affected a negligible number of solutions (if you were affected, you should have been contacted), and there was also a typo in a statement. Huge thanks to golomb and ThatOnePythonUser for catching these issues.

About cheaters

As one would probably expect from a Division 4 round, there were a lot of cheaters. The automated cheating checks haven't run yet, but once they do, you should expect to see most cheaters removed from the leaderboard (and then I'll go and purge some more once that's done). For reporting cheaters after the automated checks, DM me about them and I'll try to investigate.

A couple of notes

I've seen a lot of complaints about problem difficulty, and while I agree the problems are a bit harder, I don't believe the difficulty was super unfair; with that being said, I'm aware that H was very much on the harder side for a div4 (though not unheard of, looking at Codeforces Round 971 (Div. 4)). I fully didn't expect there to be many H solves, and if you want to ignore it, A-G already makes a full div4 problemset. H is there to challenge out of competition solvers along with provide participants with a hard problem to upsolve (I fully encourage you to try it, while there are many different solutions, the editorial solution doesn't require any complex data structures and is really nice!). With that being said, I think the estimated difficulty of H is 2200, though looking at other platforms, it seems I may have underestimated the difficulty.

Also, if I didn't respond to your private message, my apologies, CF is really restrictive on the amount of people I can send DMs to, so it creates a bit of a hassle. Also, a lot of them were asking how to set a round, which I'm covering in here.

Finally, apologies for the hacks (primarily on E); I didn't think an edgecase that a lot of people dealt with.

How to set your own contest

I'll be talking about Div3 / Div4 rounds below. I'm not super famililar with the proposal process for Div 1/2 rounds, though note that in order to propose a Div 1 / Div 2 round, you must either have a rating of 2100+ or have previously set a round.

I'm also going to discuss my way of proposing it and my recommendations. I do know that many people propose a contest before having a problemset finished; I don't personally feel like this is the best way to go, but that might just be a me thing. With that being said, if you have no previous problemsetting experience, I'd encourage you to at least think of problems before submitting a proposal; it might be a bit awkward if you've proposed a contest that you can't come up with problems. I acknowledge that setting one contest doesn't make me an expert at all, and if anyone with more experience would like to correct me, please do.

Firstly, don't cheat. I doubt a single coordinator is going to work with you if you've recently / you're actively cheating in contests. Now that I've eliminated half of the people reading this, let me continue.

Secondly, you need to gather a problemset. For Div3 / 4, you need 7 — 8 problems. A couple of notes about these problems:

  • Run your problems through https://yuantiji.ac/ , which is a similarity checker for problems. This can help you ensure that the problem you're submitting hasn't already been used in a previous contest.
  • Ensure that your problems aren't knowledge checks, or problems where almost the entirety of the difficulty is based on whether you know a specific datastructure. Note that standard problems are fine (and probably encouraged for Div 3/4), and the line between standard and knowledge check can sometimes be difficult to determine, at least in my opinion
  • Don't overcomplicate a problem just to make it more difficult. Don't add queries to a problem where the only difference between the old and new problems is a boring implementation of a datastructure. Note that problems where applying the data structure in a non-trivial way is perfectly fine.
  • Stealing from the CodeChef problemsetting guidelines: "You can't just take 3 unrelated problems and smash them together. If the statement of your problem looks like several independent problems, your problem is bad.".
  • Lastly, don't use AI to make problems. AI (at the moment) makes garbage problems / copies problems from other sources, and while I know there is research that improve an LLM's ability to create problems, simply asking ChatGPT "give me a good div3F" is not going to give you a good, unique problem 99% of the time. With that being said, while I haven't done this personally, you can try using ChatGPT for inspiration (i know there was one Div2D that was based off of a chatgpt problem, but I don't remember which one it was)

Additionally, note that making problems isn't trivial, and it can often take you time to come up with good problems, so don't worry if you're struggling. There are many ways to make problems; for the div4, they came from a combination of modifying other problems (for example, 2185G - Mixing MEXes was made by modifying https://usaco.org/index.php?page=viewproblem2&cpid=1492 ), problems just popping into my head (e.g 2185D - OutOfMemoryError), along with actively working and trying to come up with a problem (kinda 2185E - The Robotic Rush) .

Then, once you have a problemset, you should probably get someone to review the problemset before you propose it. This can be a friend or otherwise someone you trust; I'm willing to review them, just DM me on Discord (idk if I want to post my username publicly here, but you can just dm me and I'll send it) or Codeforces.

Finally, you can propose it to a coordinator, of which there are 3 (that I know of at least): cry, soullless, and Vladosiya. They'll guide you from there.

I really hope this blog inspires you to give writing a contest a shot; it's an amazing experience (plus, we all know we need more Div4 rounds :) ). If you have any questions, please leave a comment or DM me.

  • Vote: I like it
  • +90
  • Vote: I do not like it

»
3 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

"Don't overcomplicate a problem just to make it more difficult. Don't add queries to a problem where the only difference between the old and new problems is a boring implementation of a datastructure."

This seems like 80% of my ideas and the other 20 is still a data structure application but it's slightly harder... I can't seem to make original problems...

»
3 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

cry can I host a round?

»
3 months ago, hide # |
 
Vote: I like it 0 Vote: I do not like it

Congratulations on your successful round! Thank you for sharing your experience. It's super impressive that you prepared all the questions (I had two co-authors). Also the AI issue is much more challenging now. Back then, I was very naive about AI; I did some checks on the free version of ChatGPT (which wasn't very good then) and hoped that was enough.

  • »
    »
    3 months ago, hide # ^ |
     
    Vote: I like it 0 Vote: I do not like it

    tysm, for both the comment and inspiring me to set this round.

    It's super impressive that you prepared all the questions (I had two co-authors).

    tbc, cry did a lot of modification of the problems in polygon, which I'll mainly chalk down to my inexperience with the platform. That being said, Polygon makes it really simple to prepare problems (when it's not giving my a 503 error), and it was also over winter break, so I had a lot of free time on my hands.

    In regards to AI... yeah it's super annoying. I was really hoping that AI wouldn't be able to AK the contest, and while it did struggle (somehow) on D, E, and H, we did end up having to skip a lot of cheaters during the contest. Thankfully, we added a couple of measures to make AI cheating much more obvious (if you know you know :) ), and cry has seen enough GPT submissions to know if someone is cheating a good amount of the time, so we thankfully were catch a decent amount of people.