junikimm717
4 years ago
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