可以吃嗎
一連串明確的步驟跟指令,操作完可以得到特定的結果
pccorz
有兩種方法進選訓
選訓1J->2J(and APIO)->去玻利維亞/烏茲別克斯坦/?
pacybworzah
初選錄取 18 至 20 名為原則,先依年級分別錄取,高一(含 9 年級以下)、高二、高三 各年級最多先取前四名,其餘人數再依全體考生初選成績高低擇優錄取。
真的要開始講課了
(簡報是隨意趕快打好的,想看更細節的去資讀看pooh講義)
講師真的不會語法
所以我們來看從零開始的演算法競賽入門教學
如果\(\exists M,f(x)\leq g(x)\times M,\forall x\)
那我們說\(f(x)=O(g(x))\)
int a[maxn];
for(int i=1;i<=n;i++){
for(int j=i;j<=n;j+=i){
a[i]++;
}
}
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寫的 |
什麼時候要看常數
記得看終止條件
int fib(int n){
if(n<=1)return 1;
return fib(n-1)+fib(n-2);
}
int gcd(int a,int b){
if(a%b==0)return b;
return gcd(b,a%b);
}
ll inv(ll a){
return a==1?1:(p-p/a)*(inv(p%a))%p;
}
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的分界
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
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
有一個先遞減再遞增(嚴格)的函數\(f(x)\)
怎麼找(靠近)最低點?
戳戳戳
我們戳兩個點然後來看一下會怎樣
在\([a,b]\)裡戳到\(a<x<y<b\)
三個case看看看,就發現都超好
在大多數的時間我們通常在凸(凹)函數上三分搜
因為凸(凹)函數可以互相加之後還是凸(凹)函數
沒時間打了==
我們來看神神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
偷自己的簡報