# 競程介紹
----
## 講師自介
- handle: owoovo_shih
- 全國賽一等
- 選訓二階
- 在APIO被逆( ~~版本更新受害者~~ )
---
# 競程是啥
可以吃嗎
----
## 演算法
一連串明確的步驟跟指令,操作完可以得到特定的結果
----
## 競技程式
- 在題目的條件下設計演算法在一定的限制下解決問題
- 不要求code好不好看 會動就好
- 通常好好寫不會多於250行
- 即時評測
----
## 題目
- 題序
- 記憶體限制、時間限制
- 數據範圍
- 範例測資
----
## 題型
- batch
- interactive
- two steps
- output only
----
## [verdict](https://tioj.ck.tp.edu.tw/about/verdicts)
---
# 學習資源
----
## 實體的
- 建中讀書會
- 資訊之芽
- IOIC
- IONC,APCSC(講師沒去過)
----
## 學習網站
- 從零開始的演算法競賽入門教學
- 建中校培講義(大部分人首推2016)
- OI Wiki
- USACO Guide
- CP-Algorithms
- topic-list([Shahjalal Shohag](https://blog.shahjalalshohag.com/topic-list/), [YouKn0wWho](https://youkn0wwho.academy/topic-list))
- 各個選手自己的blog
----
## 線上比賽
- codeforces(通常打到大概12點或1點)
- atcoder(開心日本時區)
- meta hacker cup(每年一次,作息破壞者)
- 補題很重要
----
## 刷題網站
- CSES
- codeforces (list [1](https://cftracker.netlify.app/contests),[2](https://cf.kira924age.com/#/table/) ,[random mashup](https://randommashupgenerator.netlify.app/))
- atcoder ([list](https://kenkoooo.com/atcoder/#/table/), typical 90, dp contest)
- cs academy
- TIOJ, OJDL
- [NTUCPC judge](https://oj.ntucpc.org/)
- zerojudge(不推)
- luogu
- oj.uz, OI checklist
---
# 比賽們
----
## 團體賽
- ytp(8月):前十可以做專題
- 成大賽(8月):要去台南
- HP codewar(10月):聽說有抽獎
- ISSC:聽說很怪
- NPSC(12月):非常好,但每校決賽只取三隊
![image](https://hackmd.io/_uploads/HyUxVVVtA.png =13%x)pccorz
----
## 怎麼進選訓/當國手
有兩種方法進選訓
- 學科能競:校內->北市->全國
- 初選
選訓1J->2J(and APIO)->去玻利維亞/烏茲別克斯坦/?
----
## 教練 我想打能競
- 校內初選:取大約25人和一些高一的保障名額
- 複選:取11(應該)個和去年全國賽一二等當校隊
- 也因為這樣所以高二以下的全國一二等會拿到TIOJ管理員然後他們要負責隔年的校內賽
- 北市賽(11月):取10個去打全國賽
- 全國賽(12月):3個一等獎和7個二等獎能進選訓
![image](https://hackmd.io/_uploads/H1YlmEEFC.png =200x)pacybworzah
----
## 能競輸了QQ
- 初選資格:海選或apcs實作3或有當年度全國賽
- 初選(3月):
> 初選錄取 18 至 20 名為原則,先依年級分別錄取,高一(含 9 年級以下)、高二、高三 各年級最多先取前四名,其餘人數再依全體考生初選成績高低擇優錄取。
----
## 選訓
- 有兩階段(3,4月),每一階段有兩周
- 取12個人進二階,4個人當國手
- 每周一場模考
- 用模考分數(占最多)、平時成績、APIO算成績
----
## 選訓生活
- 捷絲旅
- 做題、vir OI
- 聽課
- 體育課
- 怪話集
- 邪惡表格
![image](https://hackmd.io/_uploads/H1DxnVNYC.png =1000x)
----
![messageImage_1722201587137](https://hackmd.io/_uploads/B1RbUENY0.jpg)
----
![image](https://hackmd.io/_uploads/S1luUVVKA.png)
----
![image](https://hackmd.io/_uploads/ry5Jw4VF0.png)
---
# 其他事
- 關於公假
- 關於段考免考
---
# 閒聊時間結束!
真的要開始講課了
(簡報是隨意趕快打好的,想看更細節的去資讀看pooh講義)
----
# C++語法
----
講師真的不會語法
所以我們來看[從零開始的演算法競賽入門教學](https://emanlaicepsa.github.io/2020/10/21/0-index/)
---
# 複雜度
----
如果$\exists M,f(x)\leq g(x)\times M,\forall x$
那我們說$f(x)=O(g(x))$
----
```=cpp
int a[maxn];
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j+=i){
a[i]++;
}
}
```
----
```=cpp
for(int i=0;i<(1<<n);i++){
for(int j=0;j<n;j++){
if(i&(1<<j)){
//do something O(1)
}
}
}
```
----
一秒可以跑$10^8\sim 10^9$次操作
| 範圍 | 對應的複雜度 |
|----------------|--------------|
| $n \leq 10$ | $O(n!)$ |
| $n \leq 20$ | $O(2^n)$ |
| $n \leq 500$ | $O(n^3)$ |
| $n \leq 5000$ | $O(n^2)$ |
| $n \leq 10^5$ | $O(n\log n)$ |
| $n \leq 10^6$ | $O(n)$ |
| $n \leq 10^{18}$ | $O(\log n)$ |
pacybwoah寫的
----
什麼時候要看常數
---
# [遞迴](https://www.google.com/search?q=%E9%81%9E%E8%BF%B4)
----
記得看終止條件
----
```=cpp
int fib(int n){
if(n<=1)return 1;
return fib(n-1)+fib(n-2);
}
```
```=cpp
int gcd(int a,int b){
if(a%b==0)return b;
return gcd(b,a%b);
}
```
```=cpp
ll inv(ll a){
return a==1?1:(p-p/a)*(inv(p%a))%p;
}
```
```=cpp
int tem[maxn];
void c(int pos,int use){
//if(n-use<k-pos)return;
if(pos==k){
//do something
return;
}
for(int i=use+1;i<=n;i++){
tem[pos]=i;
c(pos+1,i);
}
}
```
---
# 二分搜
----
## 終極密碼
----
## 為什麼可以戳一半
000000000111111111111
----
## 實作
左閉右開:我們想要找到1,0的分界
```=cpp
int l=minn,r=maxn;
while(l<r-1){
int m=(l+r)>>1;
if(check(m)){
r=m;
}else{
l=m;
}
}
```
(我們想要開心的保證l永遠是0,r永遠是1,那最後$[l,r]$就會是01分界)
----
左閉右閉:在我們想找第一個1
```=cpp
int l=minn,r=maxn;
while(l!=r){
int m=(l+r)>>1;
if(check(m)){
r=m;
}else{
l=m+1;
}
}
```
推薦在不知道要不要加一時去想$[l,l+1]$的case
----
## 一些些題目
[typical90_a](https://atcoder.jp/contests/typical90/tasks/typical90_a)
[tioj 1337](https://tioj.ck.tp.edu.tw/problems/1337)
[tioj 2194](https://tioj.ck.tp.edu.tw/problems/2194)
----
## 三分搜
----
有一個先遞減再遞增(嚴格)的函數$f(x)$
怎麼找(靠近)最低點?
----
戳戳戳
我們戳兩個點然後來看一下會怎樣
在$[a,b]$裡戳到$a<x<y<b$
三個case看看看,就發現都超好
----
在大多數的時間我們通常在凸(凹)函數上三分搜
因為凸(凹)函數可以互相加之後還是凸(凹)函數
----
## [che](https://dmoj.ca/problem/cco18p4)
---
# 雙指針/單調
----
沒時間打了==
我們來看神神pooh
---
# 前綴和/差分
----
有個數列$a_i$,問$\displaystyle\min_{j\leq i} a_j$ for all i
有個數列$a_i$,問$\displaystyle\sum_{j\leq i} a_j$ for all i
有個數列$a_i$,問一些$(i,j)$的$\displaystyle\sum_{i\leq k\leq j} a_k$
----
為什麼+可以
----
有關前綴的詢問->前綴和
有關區間的詢問(有反元素的運算($+,\oplus,\times,\cdots$))->前綴和
----
多一些些維度?
好好數數
---
# 分治
----
再次來看神神pooh
---
# greedy
----
偷自己的[簡報](https://slides.com/owoovo/greedy)
---
# dp
----
[偷偷偷](https://slides.com/becaido/gdp#/3)
----
觀察題
[agc062b](https://atcoder.jp/contests/agc062/tasks/agc062_b)
[oi暴雷](https://oj.uz/problem/view/JOI22_copypaste3)
{"title":"競程介紹","description":"資讀第一堂課","contributors":"[{\"id\":\"80534ff6-e4c7-48c5-88c7-d13ac225a4c2\",\"add\":5546,\"del\":368}]"}