9/10 資訊能競培訓
自我介紹
我們在這幹嘛
校內複賽 | 10/8 | 選校隊(11 + 4) |
北市賽 | 11月? | 前二等獎進全國 (我猜10個?) |
全國賽 | 12月(19)日 | 前二等獎進資奧一階選訓 (10個) |
選訓??
入營考 | 3月嗎 | 選20人進一階 (資格!年級保障!) |
資奧一階 | 3月嗎 | 模考*2 選12人進二階(推薦、亞太) |
資奧二階 | 4月嗎 | 模考*2 選4人當國手 |
國際資奧 | 6月 | 新加坡go go 金銀銅牌 |
除此之外
ISSC | 10/17 報名剩九天 |
一校最多報兩隊 找其它校? 聽說有國際賽 |
HP codewars | 11月? | 參加、吃、抽、奇怪項目 |
NPSC | 11月初賽 12月決賽 |
初賽取25隊,一校最多3隊! 吃、氣球 不知為何推? |
YTP | 暑假? | 吃爆 最容易賺錢 適合同分 |
三人團體賽!!!
除此之外
享受想題、解題的樂趣!
為人類謀幸福
變強的方法
寫題目
寫題目
寫題目
TIOJ
codeforces
請補充QQ
所以,到底競程是啥?
欸不是,大家都比過初賽了ㄅ
如何解題
1.思考性質(optional)
2.設計算法
3.驗證複雜度
4.開寫
*小測資很重要
(時間)複雜度
一個描述演算法執行時間的函式
舉例來說
班上有\(n\)個人,我們想要知道哪兩個人一起玩兩人三腳最快,於是把所有兩人一組的可能都試過,並假設一次只能讓一組進行兩人三腳,且必須花費10秒(常數時間)
時間複雜度\(T(n) = \frac{n(n-1)}{2}\times 10 = 5n^2 - 5n\)
Big-O
\(\exist M \in \R^+,x_0 \in \R,s.t. \forall x \geq x_0,|f(x)| \leq M|g(x)| \)
\(f(x) = O(g(x)) \)
簡單來說
保留最高(增長最快)項,常數bye bye
\(T(n) = 5n^2 + 5n = O(n^2)\)
莫非定律
函式中有多個變數?
神秘數字
一秒\(10^8\)(左右)
Ex. \(O(n^2)\) 最多可以跑到\(10^4\)左右
Q&A
為甚麼要去掉低次項跟常數?
簡潔
常數去掉不會有事嗎?
...卡常數的題不該出現在世界上
空間複雜度
1.一樣,只是用來描述所使用的空間大小
3.空間複雜度小於等於時間複雜度
STL(我會的部分)
演算法
#include<iostream>
#include<algorithm>
using namespace std;
int A[5] = {2,4,1,3,5};
int main()
{
sort(A,A+5);//O(nlogn)
cout << *lower_bound(A,A+5,4) << endl;//O(logn)
cout << *upper_bound(A,A+5,4) << endl;//O(logn)
}
//reverse
pair
#include<iostream>
#include<utility>
#include<algorithm>
using namespace std;
int main()
{
pair<int,int> A[3];
A[0] = {1,4};
A[1] = {5,2};
A[2] = {0,10};
sort(A,A+3);
for(int i = 0;i < 3;i++)
{
cout << A[i].first << " " << A[i].second << endl;
}
}
容器
Stack
Queue
#include<iostream>
#include<stack>
using namespace std;
stack<int> stk;
int main()
{
stk.push(5);
stk.push(3);
cout << stk.size() <<endl;
cout << stk.top() << endl;
stk.pop();
//通通O(1)
}
#include<iostream>
#include<stack>
using namespace std;
queue<int> que;
int main()
{
que.push(5);
que.push(3);
cout << que.empty() <<endl;
cout << que.front() << endl;
que.pop();
//通通O(1)
}
priority_queue
取出最大值的queue
#include<iostream>
#include<queue>
using namespace std;
int main()
{
priority_queue<int,vector<int>,greater<int> > pq;
// 照打 小於函式
pq.push(5);//O(logn)
pq.push(3);
pq.push(4);
cout << pq.top() <<endl;//O(1)
pq.pop();//O(logn)
cout << pq.top() <<endl;
pq.pop();
cout << pq.top() <<endl;
pq.pop();
}
vector
可變長度陣列?
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> vec = {1,2,3};
int main()
{
vec.clear();
vec.push_back(0);
vec.push_back(8);
vec.push_back(5);
vec.push_back(9);
vec.pop_back();//以上都O(1)
cout << vec[0] <<endl;
sort(vec.begin(),vec.end());//想成指標
for(auto x : vec)
{
cout << x << " ";
}
}
deque
double-ended queue
#include<iostream>
#include<deque>
using namespace std;
int main()
{
deque<int> deq;
deq.push_back(1);
deq.push_back(4);
deq.push_front(5);
deq.push_front(3);
cout << deq[2] << endl;
deq.pop_back();//以上都O(1)
for(auto x : deq)
{
cout << x << " ";
}
}
set
有序集合?
#include<iostream>
#include<set>
using namespace std;
int main()
{
set<int> st;
st.insert(5);
st.insert(3);
st.insert(8);
st.insert(5);
st.erase(3);//以上都O(logn)
for(auto x : st)
cout << x << " ";
cout << endl;
cout << (*st.begin()) <<endl;//O(1)
cout << (*prev(st.end())) << endl;//O(1)
cout << st.count(5) <<endl;//O(logn)
cout << *st.lower_bound(3) << endl;//O(logn)
}
multiset
#include<iostream>
#include<set>
using namespace std;
int main()
{
multiset<int> st;
st.insert(5);
st.insert(3);
st.insert(8);
st.insert(5);
st.erase(3);//以上都O(logn)
for(auto x : st)
cout << x << " ";
st.erase(st.find(5));//O(logn)
}
unordered_set
#include<iostream>
#include<unordered_set>
using namespace std;
int main()
{
unordered_set<int> st;
s.reserve(32768); //聽說會變快
s.max_load_factor(0.25); //聽說會變快
st.insert(5);
st.insert(3);
st.insert(8);
st.insert(5);
st.erase(3);//以上都O(1)
for(auto x : st)
cout << x << " ";
}
unordered_multiset
map
有序映射
#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int main()
{
map<int,int> mp;
mp[4] = 3;
mp[5] = 9;
mp.insert({3,9});//以上都O(logn)
for(auto x : mp)
{
cout << x.first << " " << x.second << endl;
}
cout << mp.count(8) <<endl;//O(logn)
cout << mp[8] <<endl;//O(logn)
cout << mp.count(8) <<endl;
}
multimap(沒用過)
unordered_map
unorderd_multimap
習題
ZJ b298
ZJ c123
ZJ b231
TIOJ 1807
bitset
#include<bits/stdc++.h>
using namespace std;
int main()
{
bitset<10>a(6);
bitset<10>b("111");
cout << a << endl;
cout << b <<endl;
b.reset();//O(N)
b[2] = 1;
cout << a.to_ulong() + b.to_ulong() <<endl;//O(N)
cout << (a ^ b) << endl;//32 times faster?
}
deck
By Zi-Hong Xiao
deck
- 1,663