首页 > 编程语言 >常见算法的拓展

常见算法的拓展

时间:2023-01-15 15:00:29浏览次数:58  
标签:code int text 常见 拓展 large 算法 maxn d%

  • \(\large\text{Floyed--最小环}\)

题目链接

思路:枚举环上一条路径 \(i\) 至 \(j\),那么该环一定由是一条 \(k\) 至 \(i\) 的边和该路径再加 \(j\) 至 \(k\) 的边。在取最小值时要判 \(i\not=j\)。

code:

点击查看代码
int n,m,ans=inf/10,e[107][107],dis[107][107];
void solve(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			e[i][j]=dis[i][j]=inf/10;
		}
	}
	for(int i=1,u,v,w;i<=m;i++){
		scanf("%d%d%d",&u,&v,&w);
		e[u][v]=e[v][u]=dis[u][v]=dis[v][u]=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)ans=min(ans,dis[i][j]+e[k][i]+e[j][k]);
			}
		}
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n;j++){
				dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
			}
		}
	}
	if(ans==inf/10)printf("No solution.");
	else printf("%d",ans);
}
  • \(\large\text{埃筛--区间筛}\)

题目链接

思路:若 \(n\) 为合数,那么他的最小质因子 \(\leq\sqrt n\)。筛出 \([1,\sqrt n]\) 中的所有质数,再对要求范围内的所有数进行埃筛即可。

code:

点击查看代码
int n,m,k,ans,pm[maxn];
bool vis[maxn];
void solve(){
	const int mxn=1<<16;
	for(int i=2;i<=mxn;i++){
		if(!vis[i])pm[++k]=i;
		for(int j=1;j<=k&&pm[j]<=mxn/i;j++){
			vis[i*pm[j]]=true;
			if(i%pm[j]==0)break;
		}
	}
	scanf("%lld%lld",&n,&m);
	mems(vis,false);
	for(int i=1;pm[i]*pm[i]<=m;i++){
		for(int j=(max(2ll,(n-1)/pm[i]+1))*pm[i];j<=m;j+=pm[i]){
			vis[j-n+1]=true;
		}
	}
	for(int i=1;i<=m-n+1;i++)ans+=!vis[i];
	printf("%lld",n==1?ans-1:ans);
}
  • \(\large\text{矩阵乘法+Floyed--倍增Floyed}\)

题目链接

思路:\(i\) 到 \(j\) 经过 \(x+y\) 条边的最短路等于对于每个 \(k\) 点,\(i\) 到 \(k\) 的最短路加上 \(k\) 到 \(j\) 的最短路的最小值。

code:

点击查看代码
int n,m,s,t,tot,bk[1007];
struct matrix{
	int e[maxn][maxn];
	matrix operator*(const matrix x)const{
		matrix res;
		for(int i=1;i<=tot;i++){
			for(int j=1;j<=tot;j++){
				res.e[i][j]=inf/2;
				for(int k=1;k<=tot;k++){
					res.e[i][j]=min(res.e[i][j],e[i][k]+x.e[k][j]);
				}
			}
		}
		return res;
	}
}st;
matrix qpow(matrix x,int y){
	y--;matrix res=x;
	while(y){
		if(y&1)res=res*x;
		x=x*x;
		y>>=1;
	}
	return res;
}
void solve(){
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for(int i=1;i<=200;i++){
		for(int j=1;j<=200;j++){
			st.e[i][j]=inf/2;
		}
	}
	while(m--){
		int u,v,w;
		scanf("%d%d%d",&w,&u,&v);
		if(!bk[u])bk[u]=++tot;
		if(!bk[v])bk[v]=++tot;
		st.e[bk[u]][bk[v]]=st.e[bk[v]][bk[u]]=w;
	}
	matrix ans=qpow(st,n);
	printf("%d",ans.e[bk[s]][bk[t]]);
}
  • \(\large\text{树状数组——权值树状数组上倍增}\)

先咕着,等找到合适的例题再补上。

  • \(\large\text{树状数组——离线处理}\)

题目链接

思路:以右端点为关键字排序,通过记录已经出现过的种类实现去重,最后以前缀和的方式计算答案。

code:

点击查看代码
int n,m,d[maxn],lst[maxn],ans[maxn],e[maxn];
struct node{
	int l,r,id;
	bool operator<(const node &x)const{return r<x.r;}
}q[maxn];
inline int lowbit(int x){return x&(-x);}
void update(int x,int y){
	while(x<=n){
		e[x]+=y;
		x+=lowbit(x);
	}
}
int query(int x){
	int ret=0;
	while(x>0){
		ret+=e[x];
		x-=lowbit(x);
	}
	return ret;
signed main(){
	read(n);
	for(int i=1;i<=n;i++)read(d[i]);
	read(m);
	for(int i=1;i<=m;i++)read(q[i].l),read(q[i].r),q[i].id=i;
	sort(q+1,q+m+1);
	for(int i=1,now=1;i<=m;i++){
		while(now<=q[i].r){
			if(lst[d[now]])update(lst[d[now]],-1);
			lst[d[now]]=now;
			update(now++,1);
		}
		ans[q[i].id]=query(q[i].r)-query(q[i].l-1);
	}
	for(int i=1;i<=m;i++)write(ans[i]);
}

标签:code,int,text,常见,拓展,large,算法,maxn,d%
From: https://www.cnblogs.com/yinhee/p/17053507.html

相关文章

  • 和菜鸟一起学linux之常见错误的解决和常用命令
    1、错误提示:make:警告:检测到时钟错误。您的创建可能是不完整的。   解决方法:当前编译目录下,命令行输入:find.-typef-exectouch{}\;2、SSH生成密钥:ssh-keygen;SSH......
  • 常用算法模板
    BFS单向BFS不记录层数whilequeue不空:cur=queue.pop()for节点incur的所有相邻节点:if该节点有效且未访问过:queue.push(该节点)......
  • 【数据结构与算法】二分查找算法(C++实现)
    两种写法,取决于划分规则。这两种写法是学的yxc的,至此以后,写二分查找再也不含糊了!yxc的分享在此:二分查找算法模板第一种写法:boolbinarySearch(vector<int>&nums,int......
  • 算法--2023.1.15
    1.力扣198--打家劫舍classSolution{publicintrob(int[]nums){intn=nums.length;int[]dp=newint[n+1];dp[0]=0;......
  • 算法刷题 Day 16 | 104.二叉树的最大深度 111.二叉树的最小深度 222.完全二叉树的节点
    今日内容:二叉树的最大深度559.n叉树的最大深度二叉树的最小深度完全二叉树的节点个数迭代法,大家可以直接过,二刷有精力的时候再去掌握迭代法。详细布置104......
  • (11)go-micro微服务雪花算法
    目录一雪花算法介绍二雪花算法优缺点三雪花算法实现四最后一雪花算法介绍雪花算法是推特开源的分布式ID生成算法,用于在不同的机器上生成唯一的ID的算法。该算法生......
  • 振弦采集模块配置工具VMTool的常见功能
    振弦采集模块配置工具VMTool的常见功能 一、实时数据读取当VMTool与模块为连接状态时(4.3.1模块的连接与断开),勾选实时数据区的【自动读取】复选框,VMTool开始自动......
  • 河北稳控科技振弦采集模块配置工具VMTool的常见功能
    河北稳控科技振弦采集模块配置工具VMTool的常见功能一、实时数据读取当VMTool与模块为连接状态时(4.3.1模块的连接与断开),勾选实时数据区的【自动读取】复选框,VMToo......
  • 动态规划笔记(三):其它的常见线性问题(未整理完)
    最长公共子序列(HDU-1159)注意子序列和子串的区别用\(dp[i][j]\)表示序列\(X\)前\(i\)项和序列\(Y\)的前\(j\)项的最长子序列的长度当\(x[i]=x[j]\)时,\(dp[i][j]=dp[i......
  • 遗传算法
    概述遗传算法是一种模拟演化的近似算法。顾名思义,它模拟大量的样本,周期性地繁衍、遗传、变异、筛选。“状态”有时在遗传算法中是对象的一个属性。思路周期......