C++竞赛向火车头

部署运行你感兴趣的模型镜像

可以直接复制,后面是常用算法,包括图论、数论、树论和常见的算法

注意:这部分请不要在csp/NOIP/NOI中使用

#pragma GCC optimize(3)
#pragma GCC target("avx")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("inline")
#pragma GCC optimize("-fgcse")
#pragma GCC optimize("-fgcse-lm")
#pragma GCC optimize("-fipa-sra")
#pragma GCC optimize("-ftree-pre")
#pragma GCC optimize("-ftree-vrp")
#pragma GCC optimize("-fpeephole2")
#pragma GCC optimize("-ffast-math")
#pragma GCC optimize("-fsched-spec")
#pragma GCC optimize("unroll-loops")
#pragma GCC optimize("-falign-jumps")
#pragma GCC optimize("-falign-loops")
#pragma GCC optimize("-falign-labels")
#pragma GCC optimize("-fdevirtualize")
#pragma GCC optimize("-fcaller-saves")
#pragma GCC optimize("-fcrossjumping")
#pragma GCC optimize("-fthread-jumps")
#pragma GCC optimize("-funroll-loops")
#pragma GCC optimize("-fwhole-program")
#pragma GCC optimize("-freorder-blocks")
#pragma GCC optimize("-fschedule-insns")
#pragma GCC optimize("inline-functions")
#pragma GCC optimize("-ftree-tail-merge")
#pragma GCC optimize("-fschedule-insns2")
#pragma GCC optimize("-fstrict-aliasing")
#pragma GCC optimize("-fstrict-overflow")
#pragma GCC optimize("-falign-functions")
#pragma GCC optimize("-fcse-skip-blocks")
#pragma GCC optimize("-fcse-follow-jumps")
#pragma GCC optimize("-fsched-interblock")
#pragma GCC optimize("-fpartial-inlining")
#pragma GCC optimize("no-stack-protector")
#pragma GCC optimize("-freorder-functions")
#pragma GCC optimize("-findirect-inlining")
#pragma GCC optimize("-fhoist-adjacent-loads")
#pragma GCC optimize("-frerun-cse-after-loop")
#pragma GCC optimize("inline-small-functions")
#pragma GCC optimize("-finline-small-functions")
#pragma GCC optimize("-ftree-switch-conversion")
#pragma GCC optimize("-foptimize-sibling-calls")
#pragma GCC optimize("-fexpensive-optimizations")
#pragma GCC optimize("-funsafe-loop-optimizations")
#pragma GCC optimize("inline-functions-called-once")
#pragma GCC optimize("-fdelete-null-pointer-checks")
#pragma GCC optimize(2)

以下可以随意使用

#define re register
#define il inline
#define ls u<<1
#define rs u<<1|1
#define lowbit(x) (x&-x)
#define PII pair<int,int>
#define mp make_pair
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
#define clr(x) memset(x,0,sizeof(x))
#define ll long long
#define ld long double
#define pi acos(-1.0)


#define il inline
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?0:*p1++)
char buf[1<<20],*p1,*p2;
template <typename T>
il void read(T &x)
{
	x=0;int f=1;char ch=getchar();
	while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+(ch^48);ch=getchar();}
	x*=f;
}
template <typename T>
il void write(T x)
{
	if(x<0) putchar('-'),x=~x+1;
	if(x>9) write(x/10);
	putchar(x%10^48);
}
il char getc()
{
	char ch=getchar();
	while(ch=='\n'||ch=='\r'||ch==' ') ch=getchar();
	return ch;
}


int n,m,dis[N][N];
void Floyd()
{
	read(n),read(m);
	memset(dis,0x3f,sizeof dis);
	for(int i=1;i<=n;i++) dis[i][i]=0;
	for(int i=1,u,v,w;i<=m;i++)
	{
		read(u),read(v),read(w);
		dis[u][v]=dis[v][u]=min(dis[u][v],w);
	}
	for(int k=1;k<=n;k++)
		for(int i=1;i<=n;i++)
			for(int j=1;j<=n;j++)
				if(i^j&&i^k&&j^k&&dis[i][k])
					dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
}

// 无优化
int n,m,s,dis[N];
bool vis[N];
struct Edge
{
	int v,w;
};
vector<Edge> g[N];
void Dijkstra(int s)
{
	for(int i=1;i<=n;i++) dis[i]=INF;
	dis[s]=0;
	for(int i=1;i<n;i++)
	{
		int mindis=INF,u;
		for(int j=1;j<=n;j++)
			if(!vis[j]&&mindis>dis[j])
				mindis=dis[j],u=j;
		vis[u]=1;
		for(auto [v,w]:g[u])
			if(!vis[v]&&dis[v]>mindis+w)
				dis[v]=mindis+w;
	}
}

// 堆优化
int n,m,s,dis[N];
bool vis[N];
priority_queue<PII,vector<PII>,greater<PII>> q;
struct Edge
{
	int v,w;
};
vector<Edge> g[N];
void Dijkstra(int s)
{
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0,q.push(mp(0,s));
	while(!q.empty())
	{
		int u=q.top().se;q.pop();
		if(vis[u]) continue;
		vis[u]=1;
		for(auto [v,w]:g[u])
			if(dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				if(!vis[v]) q.push(mp(dis[v],v));
			}
	}
}


int n,m,dis[N];
struct Edge
{
	int u,v,w;
};
vector<Edge> e;
bool Bellman_Ford(int s)
{
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0;
	bool flag=false;
	for(int i=1;i<=n;i++)
	{
		flag=false;
		for(auto [u,v,w]:e)
		{
			if(dis[u]==INF) continue;
			if(dis[v]>dis[u]+w)
				dis[v]=dis[u]+w,flag=true;
		}
		if(!flag) break;
	}
	return flag;
}



int n,m,dis[N],cnt[N];
bool vis[N];
struct Edge
{
	int v,w;
};
vector<Edge> g[N];
queue<int> q;
bool SPFA(int s)
{
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0,vis[s]=1;
	q.push(s);
	while(!q.empty())
	{
	    int u=q.front();
		q.pop(),vis[u]=0;
	    for(auto [v,w]:g[u])
			if(dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				cnt[v]=cnt[u]+1;
				if(cnt[v]>=n) return false;
				if(!vis[v]) q.push(v),vis[v]=1;
			}
  	}
	return true;
}



int n,m,dis[N],cnt[N];
bool vis[N];
struct Edge
{
	int v,w;
};
vector<Edge> g[N];
queue<int> q;
bool SPFA(int s)
{
	memset(dis,0x3f,sizeof(dis));
	dis[s]=0,vis[s]=1;
	q.push(s);
	while(!q.empty())
	{
	    int u=q.front();
		q.pop(),vis[u]=0;
	    for(auto [v,w]:g[u])
			if(dis[v]>dis[u]+w)
			{
				dis[v]=dis[u]+w;
				cnt[v]=cnt[u]+1;
				if(cnt[v]>=n) return false;
				if(!vis[v]) q.push(v),vis[v]=1;
			}
  	}
	return true;
}



int n,m,fa[N];
struct Edge
{
	int u,v,w;
}e[M];
int find(int x)
{
	return fa[x]==x?x:fa[x]=find(fa[x]);
}
void Kruskal()
{
	int mst=0,tot=0;
	for(int i=1;i<=n;i++) fa[i]=i;
	sort(e+1,e+1+m,[](Edge a,Edge b){return a.w<b.w;});
	for(int i=1;i<=m;i++)
	{
		int x=find(e[i].u),y=find(e[i].v);
		if(x==y) continue;
		fa[x]=y,mst+=e[i].w;
		if(++tot==n-1) break;
	}
	printf("%d",mst);
}


int n,m,dis[N];
bool vis[N];
struct Edge
{
	int v,w;
};
vector<Edge> e[M];
void Prim()
{
	int u=1,tot=1,mst=0;
	memset(dis,0x3f,sizeof(dis));
	while(tot<n)
	{
		for(auto [v,w]:g[u])
			if(!vis[v]&&dis[v]>w) dis[v]=w;
		int mindis=INF;
		++tot,vis[u]=1;
		for(int i=1;i<=n;i++)
			if(!vis[i]&&mindis>dis[i])
				u=i,mindis=dis[i];
		mst+=mindis;
	}
	printf("%d",mst);
}


int n,m,s,dis[N];
bool vis[N];
priority_queue<PII,vector<PII>,greater<PII>> q;
struct Edge
{
	int v,w;
};
vector<Edge> g[N];
void Prim()
{
	int mst=0,tot=0;
	memset(dis,0x3f,sizeof(dis));
	dis[1]=0,q.push(mp(0,1));
	while(!q.empty()&&tot<n)
	{
		int u=q.top().se;
		if(vis[u]) continue;
		++tot,mst+=q.top().fi;
		vis[u]=1,q.pop();
		for(auto [v,w]:g[u])
			if(dis[v]>w)
				dis[v]=w,q.push(mp(dis[v],v));
	}
	printf("%d",mst); 
}


int n,m,f[N][21],dep[N];
vector<int> g[N];
void dfs(int u,int fa)
{
	f[u][0]=fa,dep[u]=dep[fa]+1;
	for(int i=1;i<=19;i++)
		f[u][i]=f[f[u][i-1]][i-1];
	for(auto v:g[u])
		if(v^fa) dfs(v,u);
}
int LCA(int u,int v)
{
	if(dep[u]<dep[v]) swap(u,v);
	for(int i=19;~i;i--)
		if(dep[u]-dep[v]>=(1<<i)) u=f[u][i];
	if(u==v) return u;
	for(int i=19;~i;i--)
		if(f[u][i]^f[v][i])
			u=f[u][i],v=f[v][i];
	return f[v][0];
}



int n,m,fa[N],dep[N],siz[N],hs[N];
vector<int> g[N];
void dfs1(int u,int fath)
{
	fa[u]=fath,dep[u]=dep[fath]+1;
	siz[u]=1,hs[u]=-1;
	for(auto v:g[u])
	{
		if(v==fath) continue;
		dfs1(v,u),siz[u]+=siz[v];
		if(hs[u]==-1||siz[v]>siz[hs[u]]) hs[u]=v;
	}
}
int top[N];
void dfs2(int u,int t)
{
	top[u]=t;
	if(~hs[u]) dfs2(hs[u],t);
	for(auto v:g[u])
		if(v^fa[u]&&hs[u]^v) dfs2(v,v);
}
int LCA(int u,int v)
{
	while(top[u]^top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		u=fa[top[u]];
	}
	if(dep[u]<dep[v]) swap(u,v);
	return v;
}



int n,m,st[N][21],dfn[N],cnt;
vector<int> g[N];
int get(int x,int y)
{
	return dfn[x]<dfn[y]?x:y;
}
void dfs(int u,int fa)
{
	st[dfn[u]=++cnt][0]=fa;
	for(auto v:g[u])
		if(v^fa) dfs(v,u);
}
int LOG[N];
void st_init()
{
	LOG[0]=-1;
	for(int i=1;i<=n;i++) LOG[i]=LOG[i>>1]+1;
	int p=LOG[n];
	for(int k=1;k<=p;k++)
		for(int s=1;s+(1<<k)<=n+1;s++)
			st[s][k]=get(st[s][k-1],st[s+(1<<(k-1))][k-1]);
}
int LCA(int u,int v)
{
	if(u==v) return u;
	u=dfn[u],v=dfn[v];
	if(u>v) swap(u,v);
	int k=LOG[v-u];
	return get(st[u+1][k],st[v-(1<<k)+1][k]);
}








// 高精度
// C = A + B, A >= 0, B >= 0
vector<int> add(vector<int> &A, vector<int> &B)
{
    if (A.size() < B.size()) return add(B, A);
 
    vector<int> C;
    int t = 0;
    for (int i = 0; i < A.size(); i ++ )
    {
        t += A[i];
        if (i < B.size()) t += B[i];
        C.push_back(t % 10);
        t /= 10;
    }
 
    if (t) C.push_back(t);
    return C;
}


// C = A - B, 满足A >= B, A >= 0, B >= 0
vector<int> sub(vector<int> &A, vector<int> &B)
{
    vector<int> C;
    for (int i = 0, t = 0; i < A.size(); i ++ )
    {
        t = A[i] - t;
        if (i < B.size()) t -= B[i];
        C.push_back((t + 10) % 10);
        if (t < 0) t = 1;
        else t = 0;
    }
 
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}


// C = A * b, A >= 0, b >= 0
vector<int> mul(vector<int> &A, int b)
{
    vector<int> C;
 
    int t = 0;
    for (int i = 0; i < A.size() || t; i ++ )
    {
        if (i < A.size()) t += A[i] * b;
        C.push_back(t % 10);
        t /= 10;
    }
 
    while (C.size() > 1 && C.back() == 0) C.pop_back();
 
    return C;
}


// A / b = C ... r, A >= 0, b > 0
vector<int> div(vector<int> &A, int b, int &r)
{
    vector<int> C;
    r = 0;
    for (int i = A.size() - 1; i >= 0; i -- )
    {
        r = r * 10 + A[i];
        C.push_back(r / b);
        r %= b;
    }
    reverse(C.begin(), C.end());
    while (C.size() > 1 && C.back() == 0) C.pop_back();
    return C;
}




// 求n的第k位数字: n >> k & 1
// 返回n的最后一位1:lowbit(n) = n & -n

// shuangzhizhen
for (int i = 0, j = 0; i < n; i ++ )
{
    while (j < i && check(i, j)) j ++ ;
 
    // 具体问题的逻辑
}
常见问题分类:
    (1) 对于一个序列,用两个指针维护一段区间
    (2) 对于两个序列,维护某种次序,比如归并排序中合并两个有序序列的操作



vector<int> alls; // 存储所有待离散化的值
sort(alls.begin(), alls.end()); // 将所有值排序
alls.erase(unique(alls.begin(), alls.end()), alls.end());   // 去掉重复元素
 
// 二分求出x对应的离散化的值
int find(int x) // 找到第一个大于等于x的位置
{
    int l = 0, r = alls.size() - 1;
    while (l < r)
    {
        int mid = l + r >> 1;
        if (alls[mid] >= x) r = mid;
        else l = mid + 1;
    }
    return r + 1; // 映射到1, 2, ...n
}




// 将所有存在交集的区间合并
void merge(vector<PII> &segs)
{
    vector<PII> res;
 
    sort(segs.begin(), segs.end());
 
    int st = -2e9, ed = -2e9;
    for (auto seg : segs)
        if (ed < seg.first)
        {
            if (st != -2e9) res.push_back({st, ed});
            st = seg.first, ed = seg.second;
        }
        else ed = max(ed, seg.second);
 
    if (st != -2e9) res.push_back({st, ed});
 
    segs = res;
}

// 扩展欧几里得算法 (ax + by = gcd(a,b))
ll exgcd(ll a, ll b, ll &x, ll &y)
{
    if (!b) { x = 1; y = 0; return a; }
    ll d = exgcd(b, a % b, y, x);
    y -= a / b * x;
    return d;
}

// 逆元 (a^{-1} mod p)
ll inv(ll a, ll p = MOD)
{
    ll x, y;
    exgcd(a, p, x, y);
    return (x % p + p) % p;
}

ll fac[N], inv_fac[N];

// 组合数计算 (预处理阶乘和逆元)
void init (int n = 1e5)
{
    fac[0] = 1;
    REP1(i, n) fac[i] = fac[i - 1] * i % MOD;
    inv_fac[n] = inv(fac[n], MOD);
    FORD(i, n, 1) inv_fac[i - 1] = inv_fac[i] * i % MOD;
}

ll C(int n, int k)
{
    if (k < 0 || k > n) return 0;
    return fac[n] * inv_fac[k] % MOD * inv_fac[n - k] % MOD;
}

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值