4 changed files with 223 additions and 0 deletions
			
			
		- 
					3.gitignore
- 
					6day1/Main.cpp
- 
					2day1/Makefile
- 
					212day1/README.md
| @ -0,0 +1,6 @@ | |||||
|  | #include<bits/stdc++.h>
 | ||||
|  | using namespace std; | ||||
|  | 
 | ||||
|  | int main() { | ||||
|  |     ios_base::sync_with_stdio(0); cin.tie(0); | ||||
|  | } | ||||
| @ -0,0 +1,2 @@ | |||||
|  | CXX=g++-10 | ||||
|  | CXXFLAGS=-std=c++11 -O2 -Wall -Wextra -D_GLIBCXX_DEBIG -fsanitize=address -fsanitize=undefined | ||||
| @ -0,0 +1,212 @@ | |||||
|  | # Mindset | ||||
|  | 
 | ||||
|  | Although a lot of programming paradigms will disagree with this, a good start | ||||
|  | point for learning to do competitive programming is to see yourself as | ||||
|  | modifying a certain state over time. As CP does not heavily emphasize code | ||||
|  | quality (as you don't touch the code after submitting and getting it accepted), | ||||
|  | this state can be implemented in a variety of ways, particularly to | ||||
|  | increase your usage of time. | ||||
|  | 
 | ||||
|  | Before you delve into competitive programming as your gateway into programming, | ||||
|  | be aware of the consequences that it can have on your code quality as | ||||
|  | you move forward. | ||||
|  | 
 | ||||
|  | This logically follows from the structure of any given problem: you are given a | ||||
|  | set of inputs, and you are expected to spit out a stream of output. In a way, | ||||
|  | you have to use your algorithmic skills to, in some way, transform the | ||||
|  | input data into the output data. | ||||
|  | 
 | ||||
|  | # Variable Declaration | ||||
|  | 
 | ||||
|  | There is a clear difference between accessing and modifying already allocated | ||||
|  | memory versus initializing memory. Thus, in C++, you have two distinct methods | ||||
|  | to reference a variable (one upon initizliation and one when you are accessing | ||||
|  | it later on.) | ||||
|  | 
 | ||||
|  | In order to declare a variable, you use the following syntax: | ||||
|  | 
 | ||||
|  | ```cpp | ||||
|  | (type) (variable name); | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | If you want to both declare and initizlie, you use the following syntax: | ||||
|  | 
 | ||||
|  | ```cpp | ||||
|  | (type) (variable name) = (value); | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | Unless constant, variables can always be changed to reflect the information | ||||
|  | that you have at the current moment. | ||||
|  | 
 | ||||
|  | For instance, if you are implementing a binary search on an array, your search | ||||
|  | space will have both an upper and lower bound. This information can be | ||||
|  | represented by two integers that represent the indices of the array that you | ||||
|  | need to check. | ||||
|  | 
 | ||||
|  | ```cpp | ||||
|  | int left = 0, right = vec.size(); | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | ## Types | ||||
|  | 
 | ||||
|  | There are 5 main primitive types that you have to understand solidly in competitive | ||||
|  | programming. These are: | ||||
|  | 
 | ||||
|  | 1. int, which is a 32-bit signed integer | ||||
|  | 2. long long, a 64-bit signed integer | ||||
|  | 3. boolean , a value which is either true or false, | ||||
|  | 4. string, a sequence of characters (such as a word), | ||||
|  | 5. character | ||||
|  | 
 | ||||
|  | I will also enumerate the main data structures from the **standard library** | ||||
|  | that you ought to know in the following: | ||||
|  | 
 | ||||
|  | 1. vectors - arrays whose size can be increased or decreased | ||||
|  | 2. sets - data structures that can do insertion, search, and min/max | ||||
|  |    queries in logarithmic time (later), | ||||
|  | 3. gp_hash_table - can do search and insertion in O(1) time, but cannot do | ||||
|  |    min/max queries (later). | ||||
|  | 
 | ||||
|  | ### Picking variable names | ||||
|  | 
 | ||||
|  | In general programming, variable names are often an important step in writing | ||||
|  | code, as they significantly enhance code readability. As this is not an issue | ||||
|  | in competitive programming, shorter (typically 1-letter) variable names are | ||||
|  | used far more often. Typically speaking, these are the variable names that are | ||||
|  | used for their particular cases (in my case): | ||||
|  | 
 | ||||
|  | 1. Temporary values - **a, b, c, d, x, y, z** | ||||
|  | 
 | ||||
|  | 2. For loop counters - **i, j, k, l** | ||||
|  | 
 | ||||
|  | 3. Constants (that define the size or length of something) - **N, M, K** (In | ||||
|  | general, these constants will be referred to by their letters, so just | ||||
|  | stick to the ones they give you, don't confuse yourself).) | ||||
|  | 
 | ||||
|  | 4. Array indices/pointers (we refer to *pointers* when they represent | ||||
|  | indices on an array or data structure, not memory addresses) -  | ||||
|  | **\*ptr** | ||||
|  | 
 | ||||
|  | ### Further Explanations | ||||
|  | 
 | ||||
|  | As C++ has no runtime (and is only based on a compiler and linker for building), | ||||
|  | by using the syntax above, the compiler is notified of what **type** the variable is, | ||||
|  | and thus what functionality it has or does not have. The type system is a complicated | ||||
|  | field, and thus here, we will not focus on most of it (just remember why you need to | ||||
|  | use that particular syntax). | ||||
|  | 
 | ||||
|  | If the compiler can infer what your variable type is (when you both declare and  | ||||
|  | initialize), then you can get away with using the *auto* keyword. (This is generally | ||||
|  | discouraged for beginners, as it can lead to some nasty bugs) | ||||
|  | 
 | ||||
|  | 
 | ||||
|  | # Input/Output | ||||
|  | 
 | ||||
|  | The data in virtually all competitive programming contests (except for past | ||||
|  | USACO Contests) will pipe their input through standard input, and will likewise | ||||
|  | request that you send your output through standard output. This is fairly  | ||||
|  | simple with the cin/cout interface. | ||||
|  | 
 | ||||
|  | In order for you to use the cin/cout API, you must include the following | ||||
|  | at the top of the file: | ||||
|  | 
 | ||||
|  | ```cpp | ||||
|  | #include<iostream> | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | ### Example Analysis | ||||
|  | 
 | ||||
|  | Let us take a look at the following example: | ||||
|  | 
 | ||||
|  | ```cpp | ||||
|  | int x; | ||||
|  | cin >> x; | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | What did we just do there? The first part is fairly straightforward; based on | ||||
|  | the syntax, we know that a new variable was just declared named x. | ||||
|  | 
 | ||||
|  | Now what did the second line do? Although the implementation is more direct in | ||||
|  | other languages, cin breaks up your input stream into *tokens*. Each token is | ||||
|  | essentially a collection of characters without any whitespace in between them. | ||||
|  | 
 | ||||
|  | For instance, if your input stream was the following: | ||||
|  | 
 | ||||
|  | ```txt | ||||
|  | 1  2 3  | ||||
|  | 4 fifth | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | Your tokens would be "1", "2", "3", "4", and "fifth". | ||||
|  | 
 | ||||
|  | cin takes the next token that hasn't been consumed yet | ||||
|  | and sets the variable x equal to that value. Note that here, since the | ||||
|  | variable x has the type 'int,' x will be initialized to the value of the token, | ||||
|  | **the string being parsed as an integer**. | ||||
|  | 
 | ||||
|  | If we did the following instead, | ||||
|  | 
 | ||||
|  | ```cpp | ||||
|  | string s; | ||||
|  | cin >> s; | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | s would just be the next token. | ||||
|  | 
 | ||||
|  | ### On initializing variables | ||||
|  | 
 | ||||
|  | Unless you are explicitly going to get the value of the variable from standard | ||||
|  | input, always consider initializing them along with declaring them, so that | ||||
|  | they do not acquire garbage values. | ||||
|  | 
 | ||||
|  | ### cin with multiple variables | ||||
|  | 
 | ||||
|  | In order to input multiple variables in succession, you may write something | ||||
|  | analogous to the following example: | ||||
|  | 
 | ||||
|  | ```cpp | ||||
|  | int first, second, third; | ||||
|  | cin >> first >> second >> third; | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | Note that you can chain the ">>" operators together to input multiple variables. | ||||
|  | In this case, "first" will be the value of the first token, "second" will be the value | ||||
|  | of the second token, and "third" will be the value of the third token. | ||||
|  | 
 | ||||
|  | ## cout | ||||
|  | 
 | ||||
|  | The process for cout is a bit more straightforward. Let us say that we want to | ||||
|  | print the values of three variables, a, b, c, with a space separating the a and b | ||||
|  | and a new line separating b and c. Then our print statement would be the following: | ||||
|  | 
 | ||||
|  | ```cpp | ||||
|  | cout << a << " " << b << "\n" << c; | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | This results in the following output: | ||||
|  | 
 | ||||
|  | ```txt | ||||
|  | (value of a) (value of b) | ||||
|  | (value of c) | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | Here, the arrow signs are changed from a ">>" to a "<<". | ||||
|  | Additionally, as **cout does not format your output**, so make sure to test if  | ||||
|  | the format of your answer is correct before making any submissions to the judge. | ||||
|  | 
 | ||||
|  | ### Additional Note about endl | ||||
|  | 
 | ||||
|  | Sometimes, you will see competitive programmers do the following instead of what | ||||
|  | we wrote above: | ||||
|  | 
 | ||||
|  | ```cpp | ||||
|  | cout << a << " " << b << endl; | ||||
|  | cout << c; | ||||
|  | ``` | ||||
|  | 
 | ||||
|  | Unless the problem is *explicitly interactive*, you should **never** use this | ||||
|  | syntax. It is very time-consuming for the program to print to the console, | ||||
|  | and thus, for the most part, it will store its values in a temporary buffer | ||||
|  | (which is more efficient), and then dump all the values before the program | ||||
|  | finishes. I know of times when programmers received a TLE issue on a problem | ||||
|  | simply when they changed all of their endl to "\n". | ||||
						Write
						Preview
					
					
					Loading…
					
					Cancel
						Save
					
		Reference in new issue