徐沣

徐沣

二叉树代码(先序)

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];
}