基础 快排应用
o(n) 的时间内找出 第 k小的数
原理, 快排也是像二分的方法区分左右两个区间的内容
那么对于每一次排完序可以分成3个部分,左区间,中间,右区间,这个k一定在某一个区间中,那么我们只需要去判断它在哪一个区间递归进去即可。
code
var
void quick(int l,int r){
int i=l,j=r,mid=g[(l+r)>>1];
do{
while(g[i]<mid) i++;
while(g[j]>mid) j--;
if(i<=j) swap(g[i],g[j]),i++,j--;
}while(i<=j);
if(m<=j) quick(l,j);
else if(i<=m) quick(i,r);
else{
cout<<g[j+1]<<endl;
exit(0);
}
}
signed main(){
tle
cin>>n>>m;m++;
for(int i=1;i<=n;i++) cin>>g[i];
quick(1,n);
return 0;
}
卡特兰数 组合数学
对于某一些问题其实就是一个卡特兰数的组合,
对于
f
(
x
)
f(x)
f(x) 我们可以根据划分他前面
x
−
1
x-1
x−1的集合来得到
f
(
x
)
f(x)
f(x)
即对于
f
(
x
)
f(x)
f(x) 我们有
f
(
x
)
=
f
(
0
)
×
f
(
x
−
1
)
+
f
(
1
)
×
f
(
x
−
2
)
+
f
(
3
)
×
f
(
x
−
3
)
+
.
.
.
+
f
(
x
−
1
)
×
f
(
0
)
f(x) = f(0)\times f(x-1) + f(1)\times f(x-2) + f(3)\times f(x-3) + ... + f(x-1)\times f(0)
f(x)=f(0)×f(x−1)+f(1)×f(x−2)+f(3)×f(x−3)+...+f(x−1)×f(0)
var
signed main(){
tle
cin>>n;
g[0]=1,g[1]=1;
for(int i=2;i<=n;i++)
for(int j=0;j<i;j++)
g[i]+=g[j]*g[i-1-j];
cout<<g[n]<<endl;
return 0;
}