板子

一些板子

弱智板子

  • 快读快写

点击查看代码
inline int read(){
	char ch=getchar();
	int x=0,f=1;
  	while(!isdigit(ch)) if(ch=='-') f=-1,ch=getchar();
  	while(isdigit(ch)) x=(x<<1)+(x<<3)+(ch^48),ch=getchar();
  	return x*f;
}
inline void print(int n){
    if(n<0){
        putchar('-');
        n*=-1;
    }
    if(n>9) print(n/10);
    putchar(n%10+'0');
}
  • __int128(39位)

点击查看代码
__int128 read(){
	__int128 res=0;
	char scan[50];
	scanf(" %s",scan);
	for(int i=0;i<strlen(scan);i++){
		res*=10;
		res+=scan[i]-'0';
	}
	return res;
}
void print(__int128 num){
	if(num>9){
		print(num/10);
	}
	putchar(num%10+'0');
}
  • BFS

点击查看代码
void bfs(int x){//初始化略
	q.push(x);
	vis[x]=true;
	while(!q.empty()){
		int t=q.front();
		printf("%d ",t);
		q.pop();
		for(int i=1;i<=n;i++){
			if(g[t][i]&&!vis[i]){
				q.push(i);
				vis[i]=true;
			}
		}
	}
}
  • DFS

点击查看代码
void dfs(int x){//初始化略
	vis[x]=true;
	printf("%d ",x);
	for(int i=1;i<=n;i++){
		if(!vis[i]&&g[x][i]){
			dfs(i);
		}
	}
}
  • 整数二分

点击查看代码
bool check(int x){
	int l=1,r=n,ans=0;
	while(l<=r){
		int mid=(l+r)>>1;
		if(check(mid)){
			ans=mid;
			r=mid-1;
		}
		else l=mid+1;
	}
	printf("%d",ans);
}
  • 埃氏筛

点击查看代码
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++) a[i]=1;
	for(int i=2;i<=n;i++){//从2开始
		if(a[i]==0) continue;
		for(int j=i;j<=n/i;j++){
			a[i*j]=0;
		}
	}
	for(int i=2;i<=n;i++){
		if(a[i]) printf("%d\n", i);
	}
	return 0-0;
}
  • 线性筛

点击查看代码
int n,vis[maxn],prim[maxn],cnt;
void get(){
	for(int i=2;i<=n;i++){
		if(!vis[i]){
			prim[++cnt]=i;
		}
		for(int j=1;j<=cnt&&i*prim[j]<=n;j++){
			vis[i*prim[j]]=1;
			if(!i*prim[j]) break;
		}
	}
}

  • 堆优化Dijkstra

点击查看代码
priority_queue<pair<int,int> > q;//>与>之间加空格
void addedge(int x,int y,int z){
	to[++tot]=y;
	nxt[tot]=h[x];
	w[tot]=z;
	h[x]=tot;
}
void dij(int x){
	memset(dis,0x3f,sizeof(dis));
	dis[x]=0;
	q.push(make_pair(0, x));
	while(q.size()){
		x=q.top().second;
		q.pop();
		if(vis[x]) continue;
		vis[x]=true;
		for(int i=h[x];i;i=nxt[i]){
			int y=to[i];
			if(dis[y]>dis[x]+w[i]){
				dis[y]=dis[x]+w[i];
				q.push(make_pair(-dis[y],y));
			}
		}
	}
}
  • Spfa(屎怕)

点击查看代码
void addedge(int x,int y,int z){
	to[++tot]=y;
	nxt[tot]=h[x];
	w[tot]=z;
	h[x]=tot;
}
void spfa(int x){
	memset(dis,0x3f,sizeof(dis));//初始化
	dis[x]=0;
	queue<int> q;
	q.push(x);
	vis[x]=true;
	while(q.size()){
		x=q.front();
		q.pop();
		vis[x]=false;
		for(int i=h[x];i;i=nxt[i]){
			int y=to[i];
			if(dis[y]>dis[x]+w[i]){
				dis[y]=dis[x]+w[i];
				if(!vis[y]){
					q.push(y);
					vis[y]=true;
				}
			}
		}
	}
}
  • 倍增LCA

点击查看代码
for(int j=1;j<30;j++){//初始化
	for(int i=1;i<=n;i++){
		f[i][j]=f[f[i][j-1]][j-1];
	}
}
int lca(int x,int y){
	if(dep[x]<dep[y]) swap(x,y);
	int d=dep[x]-dep[y];
	for(int i=0;i<30;i++){
		if(d&(1<<i)) x=f[x][i];
	}
	if(x==y) return x;
	for(int i=29;i>=0;i--){
		if(f[x][i]!=f[y][i]){
			x=f[x][i];
			y=f[y][i];
		}
		if(f[x][0]==f[y][0]) break;
	}
	return f[x][0];
}
  • DP

赞美mz-xs
https://www.cnblogs.com/mz-xs/p/17981541
  • 同余方程

点击查看代码
int exgcd(int a,int b,int &x,int &y){
	if(b==0){
		x=1;
		y=0;
		return a;
	}
	int ret=exgcd(b,a%b,x,y);
	int t=x;
	x=y;
	y=t-a/b*y;
	return ret;
}
  • 最长上升子序列

点击查看代码
void out(int x){
	if(x==0) return;
	out(pre[x]);
	printf("%d ",a[x]);
}
void LIS(){//n为原序列长度,a[]为原序列
	int ans=1,te=0;
	for(int i=1;i<=n;i++){
		f[i]=1;
		for(int j=1;j<i;j++){
			if(a[i]>a[j]&&f[i]<f[j]+1){
				f[i]=f[j]+1;
				pre[i]=j;
				if(ans<f[i]){
					ans=f[i];
					te=i;
				}
			}
		}
	}
	printf("max=%d\n",ans);
	out(te);
}
  • 矩阵

点击查看代码
struct Mat{
	int a[maxn][maxn];
	void zero(){
		memset(a,0,sizeof(a));
	}
	void one(){
		zero();
		for(int i=1;i<=n;i++){
			a[i][i]=1;
		}
	}
	void resize(int x,int y){
		n=x,m=y;
	}
	Mat operator +(const Mat &A) const{
		Mat res;
		res.resize(n,m);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				res.a[i][j]=a[i][j]+A.a[i][j];
			}
		}
		return res;
	}
	Mat operator -(const Mat &A) const{
		Mat res;
		res.resize(n,m);
		for(int i=1;i<=n;i++){
			for(int j=1;j<=m;j++){
				res.a[i][j]=a[i][j]-A.a[i][j];
			}
		}
		return res;
	}
	Mat operator *(const Mat &A) const{
		Mat res;
		res.resize(n,n);
		res.zero();
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				for(int k=1;k<=n;k++){
					res.a[i][j]=((long long)a[i][k]*A.a[k][j]+res.a[i][j])%mod;
				}
			}
		}
		return res;
	}
};
Mat qpow(Mat A,int b){
	Mat res;
	res.one();
	while(b){
		if(b&1) res=res*A;
		A=A*A;
		b>>=1;
	}
	return res;
}
  • Lucas

点击查看代码
ll qpow(ll x,ll y){
	ll ret=1;
	while(y){
		if(y&1) ret=x*ret%mod;
		x=x*x%mod;
		y>>=1;
	}
	return ret;
}
ll C(ll x,ll y){
	if(x<y) return 0;
	return f[x]*qpow(f[y],mod-2)%mod*qpow(f[x-y],mod-2)%mod;
}
ll Lucas(ll x,ll y){
	if(y==0) return 1;
	return C(x%mod,y%mod)*Lucas(x/mod,y/mod)%mod;
}
ll ycl(){//预处理
	f[0]=1;
	for(int i=1;i<=mod;i++){
		f[i]=f[i-1]*i%mod;
	}
}
  • 匈牙利算法

点击查看代码
bool find(int x){
    for(int i=h[x];i;i=nxt[i]){
        int y=to[i];
        if(!vis[y]){
            vis[y]=true;
            //如果邻接点t是非匹配点,则找到一条增广路,匹配
            //如果t已匹配过,但是能重新匹配,则也找到一条增广路
            //让y与x匹配
            if(!f[y]||find(f[y])){
                f[y]=x;
                return true;
            }
        }
    }
    return false;
}
int x_G(){//匈牙利算法求最大匹配
    int ans=0;
    for(int i=1;i<=n;i++){
        memset(vis,false,sizeof(vis));
        if(find(i)) ans++;
    }
    return ans;
}

为啥折磨多板子

posted @ 2024-04-10 12:03  Mx_Gms  阅读(36)  评论(0)    收藏  举报