徐沣
二叉树代码(先序)
void dfs(int now){
if(now==0){
return ;
}
printf("%d ",now);
dfs(tree[now][0]);
dfs(tree[now][1]);
}
二叉树代码(中序)
void dfs2(int now){
if(now==0){
return ;
}
dfs2(tree[now][0]);
printf("%d ",now);
dfs2(tree[now][1]);
}
二叉树代码(后序)
void dfs3(int now){
if(now==0){
return ;
}
dfs3(tree[now][0]);
dfs3(tree[now][1]);
printf("%d ",now);
}
组合
#include <bits/stdc++.h>
using namespace std;
const int N=30;
int a[N];
int n,r;
void write(int cnt,int now){
if(now>n){
if(cnt==r){
for(int i=0;i<cnt;i++){
printf("%3d",a[i]);
}
printf("\n");
}
return ;
}
a[cnt]=now;
write(cnt+1,now+1);
write(cnt,now+1);
}
int main(){
cin>>n>>r;
write(0,1);
return 0;
}
排列
#include <bits/stdc++.h>
using namespace std;
bool vis[20];
int ans[20];
int n;
void dif(int now){
if(now>n){
for(int i=1;i<now;i++){
printf("%5d",ans[i]);
}
cout<<endl;
return ;
}
for(int i=1;i<=n;i++){
if(vis[i]==0){
vis[i]=1;
ans[now]=i;
dif(now+1);
vis[i]=0;
}
}
}
int main(){
cin>>n;
dif(1);
return 0;
}
欧拉筛
void init(int n){
flag[1]=1;
for(i=2;i<=n;i++){
if(flag[i]==0){
p[tot]=i;
tot++;
}
for(j=0;j<tot;j++){
if(i*p[j]>n) break;
flag[i*p[j]]=1;
if(i%p[j]==0) break;
}
}
}
二分模板(递推)
int find(int x){
int l=1;
int r=n;
int cnt=-1;
while(l<=r){
int mid=(l+r)/2;
if(a[mid]==x){
cnt=mid;
break;
}
if(a[mid]>x)
r=mid-1;
if(a[mid]<x)
l=mid+1;
}
return cnt;
}
二分模板(递归)
int find2(int l,int r,int num){
if(l>r) return -1;
int mid(l+r)/2;
if(a[mid]==num) return mid;
else if(a[mid]>num)
return find2(left,mid-1,num);
else
return find2(mid+1,r,num);
}
快速幂
int mypow(int a,int b){
if(b==0) return 1;
if(b==1) return a;
if(b%2==1){
int ret=mypow(a,b/2);
return 1LL*a*ret*ret;
}
else{
int ret=mypow(a,b/2);
return 1LL*ret*ret;
}
}
合并排序
void merge(int a[],int n,int b[],int m){
int i=0,j=0,cnt=0;
while(i<n&&j<m){
if(a[i]<b[j]){
c[cnt]=a[i];
cnt++;
i++;
}
else{
c[cnt]=b[j];
cnt++;
j++;
}
}
while(i<n)
c[cnt++]=a[i++];
while(j<m)
c[cnt++]=b[j++];
}
归并排序
void mergesort(int l,int r){
if(l==r)
return ;
int mid=(l+r)/2;
mergesort(l,mid);
mergesort(mid+1,r);
int i=l;
int j=mid+1;
int con=l;
while(i<=mid&&j<=r){
if(a[i]<=a[j]){
b[con]=a[i];
con++;
i++;
}
else{
b[con]=a[j];
con++;
j++;
}
}
while(i<=mid){
b[con]=a[i];
con++;
i++;
}
while(j<=r){
b[con]=a[j];
con++;
j++;
}
for(int i=l;i<=r;i++)
a[i]=b[i];
}