首页 > 其他分享 >各种模板复习及记忆口诀(持续更新)

各种模板复习及记忆口诀(持续更新)

时间:2023-09-14 14:46:47浏览次数:40  
标签:www 复习 int luogu 口诀 https com 模板 cn

模板大复习

目录
本博客适用于复习各种常见模板并且提供记忆方法。
同时本博客也有很多以前的复习或者学习链接,不会或忘记时值得一看。

字符串:

manacher找回文

https://www.luogu.com.cn/problem/P3805

整体翻倍夹#号,R小的为min(R-i,p_2*pos-i),两边拓展不越界,记得更新R上界。

int mana(){
	int len=s.size()-1;
	for(int i=1;i<=len;i++){
		ss[i*2-1]='#';
		ss[i*2]=s[i];
	}
	ss[len*2+1]='#';
	
	int R=0;
	int pos=0;
	len=2*len+1; 
	for(int i=1;i<=len;i++){
		if(i<R){
			p[i]=min(R-i,p[2*pos-i]);
		}
		else{
			p[i]=1;
		}
		
		while(i-p[i]>=1&&i+p[i]<=len&&(ss[i-p[i]]==ss[i+p[i]])){
			p[i]++;
		}
		if(i+p[i]>R){
			pos=i;
			R=i+p[i];
		}
	}
	int ret=0;
	for(int i=1;i<=len;i++){
		ret=max(ret,p[i]-1);
	}
	return ret;
}

重点:kmp找broader

https://www.luogu.com.cn/problem/P3375

(从0开始)
初值即为前者值,两端不等j-1前跳,跳到相等值++,记录状态不要忘。

void kmp(){
	len=s.size();
	int j;
	for(int i=1;i<len;i++){
		j=p[i-1];
		while(s[i]!=s[j]&&j>0){
			j=p[j-1];
		}
		if(s[i]==s[j]){
			j++;
		}
		p[i]=j;
	}
	
}

图论相关:

温馨提示:注意看好边是有向还是无向!

floyd全源最短路

初始化定不能忘,一层k要最外套,里面两层随便跑,用k作为中转点,只要有小就更新。

void floyd(){
	for(int k=1;k<=n;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]);
			}
		}
	}
}

djkstra最短路:

https://www.luogu.com.cn/problem/P4779
优先队列来优化,没被访问才进行,访问不会改回0,两个if套一块,外面更新答案,里面添加元素。
稍微注意下重边自环等判断,过了。


struct nod{
	int id;
	int dis;
	bool operator <(const nod &a)const{
		return dis>a.dis;
	}
};
priority_queue<nod>q;
bool vis[200005];
void djkstra(int ss){
	for(int i=1;i<=n;i++){
		dis[i]=1e18;
		vis[i]=0;
	}
	dis[ss]=0;
	q.push((nod){ss,0});
	while(q.size()){
		nod tp=q.top();
		q.pop();
		int x=tp.id;
		if(vis[x]){
			continue;
		}
		vis[x]=1;
		for(int i=0;i<mp[x].size();i++){
			int to=mp[x][i].to;
			int val=mp[x][i].val;
			if(dis[x]+val<dis[to]){
				dis[to]=dis[x]+val;
				if(!vis[to]){
					q.push((nod){to,dis[to]});
				}
			}
			
		}
	}
	
}

SPFA最短路

https://www.luogu.com.cn/problem/P3371
入队标记出队消,两层if不能忘,外面更新答案,不在队加元素,超n次有负环。

void spfa(int ss){
	for(int i=1;i<=n;i++){
		dis[i]=2147483647;
	}
	dis[ss]=0;
	q.push(ss);
	vis[ss]=1;
	while(q.size()){
		int x=q.front();
		q.pop();
		vis[x]=0;
		cnt[x]++;
		for(int i=0;i<mp[x].size();i++){
			int to=mp[x][i].to;
			int val=mp[x][i].val;
			if(dis[x]+val<dis[to]){
				dis[to]=dis[x]+val;
				if(!vis[to]){
					vis[to]=1;
					q.push(to);
				}
			}
		}
		
		if(cnt[x]>=n){
			break;
		}
	}
}

点双:

https://www.luogu.com.cn/problem/P8435
需要注意每次dfs前的清空,无向边。

三数组三常数,更新未更新点,更新时求答案,外部dfn内部low取小。自身起点无儿子特判有,自身开始1儿子非切点。

void dfs(int x,int fa){
	tt++;
	dfn[x]=low[x]=tt;
	s[++top]=x;
	int son=0;
	for(int i=0;i<mp[x].size();i++){
		int to=mp[x][i];
		if(to==fa){
			continue;
		}
		if(!dfn[to]){
			son++;
			dfs(to,x);
			low[x]=min(low[x],low[to]);
			if(dfn[x]<=low[to]){
				cnt++;
				while(s[top+1]!=to){
					bcc[cnt].push_back(s[top]);
					top--;
				}
				bcc[cnt].push_back(x);
			}
		}
		low[x]=min(low[x],dfn[to]);
	}
	if(son==0&&fa==x){
		cnt++;
		bcc[cnt].push_back(x);
	}
}

边双:

https://www.luogu.com.cn/problem/P8436
需要注意重编情况的特判。

(相比点双)
判断拉到最外层,判断条件变相等,特判全部都删除。

void dfs(int x,int fa){
	tt++;
	dfn[x]=low[x]=tt;
	s[++top]=x;
	bool f=0;
	for(int i=0;i<mp[x].size();i++){
		int to=mp[x][i];
		if(to==fa&&f==0){
			f=1;
			continue;
		}
		if(!dfn[to]){
			dfs(to,x);
			low[x]=min(low[x],low[to]);
		}
		low[x]=min(low[x],dfn[to]);
	}
	if(dfn[x]==low[x]){
		cnt++;
		while(s[top+1]!=x){
			bcc[cnt].push_back(s[top]);
			top--;
		}
	}
}

差分约束:

详情:https://www.cnblogs.com/linghusama/p/17542288.html

为了好记:求最值反着约束,反着连边,反着求路径
例如:求最小,约束>=,连边j,i,找最长路。

二分图最大匹配/最小覆盖。

(当然也可以最大流解决,还是要注意下重边)
https://www.luogu.com.cn/problem/P3386

n次外层不能少,每次清空vis不能忘,遍历全部未访问可接点,rev无值或可更改则更改。

bool match(int x){
	for(int i=0;i<mp[x].size();i++){
		int to=mp[x][i];
		if(vis[to]){
			continue;
		}
		vis[to]=1;
		if(!rev[to]||match(rev[to])==1){
			rev[to]=x;
			return 1;
		}
	}
	return 0;
}

.....
for(int i=1;i<=n;i++){
		memset(vis,0,sizeof(vis));
		if(match(i)==1){
			ans++;
		}
	}

最大流(dinic)

详情:https://www.cnblogs.com/linghusama/p/17564343.html
说实话,目前就没遇到过这种题,而且这种题限制也多,码量也多。

树型结构:

线段树:

个人觉得...没必要吧

树状数组:

详情:https://www.cnblogs.com/linghusama/p/17455975.html

平衡树(非旋treap)

详情:https://www.cnblogs.com/linghusama/p/17478930.html

笛卡尔树(感觉考的少)

关键是你做题要看出来是这个树。
大不了我线段树nlogn维护,因为他都考你这个树了,我不信他还要O(n)来做

主席树(感觉考的少)

详情:https://www.cnblogs.com/linghusama/p/17697328.html

最小生成树:

krus那个算法就不说了,用并查集排序后乱做
这里主要是用于很多边但点少的prim算法的口诀记忆。

最开始,集合中只有1号节点,然后从1号节点扩展出到所有节点的d值。然后每次将离集合最近的且不在
集合中的点加入集合,让后从这个点往所有点扩展,更新d值,重复以上过程直到所有点都在集合中了。

int prim(){
	for(int i=2;i<=n;i++){
		dis[i]=0x3f3f3f3f;
	}
	int ans=0;
	int tot=0;
	for(int i=0;i<mp[1].size();i++){
		int to=mp[1][i].to;
		int val=mp[1][i].val;
		dis[to]=min(dis[to],val);
		
	}
	while(++tot<=n-1){
		int mii=0x3f3f3f3f;
		vis[now]=1;
		for(int i=1;i<=n;i++){
			if(!vis[i]&&mii>dis[i]){
				mii=dis[i];
				now=i;
			}
		}
		ans+=mii;
		for(int i=0;i<mp[now].size();i++){
			int to=mp[now][i].to;
			int val=mp[now][i].val;
			dis[to]=min(dis[to],val);
		
		}
	}
	return ans;
}

标签:www,复习,int,luogu,口诀,https,com,模板,cn
From: https://www.cnblogs.com/linghusama/p/17702417.html

相关文章

  • VSCode 配置Markdown模板
    ⇦1.工具篇-VSCode快捷键的使用待新增⇨前言避免重复写博客的相同部分,自定义markdown模板一.教程步骤总结1.配置settings.json快捷键ctrl+shift+P打开命令面板输入settings.json选中openusersettings添加配置:"[markdown]":{"editor.quickSuggestions":......
  • 复习课3 C语言中常用的数据类型
    一.导入我们在生活中会遇到很多的数据,这些数有的是整数,比如说:12345,有的是浮点数(小数)比如说:0.51.13.14等等,那么我们在生活中需要用到各种数据,那么在程序中是否也是有不同的数据类型呢?答案是肯定的二.C语言中常用的数据类型int //整型数据类型double//双精度浮点类型float......
  • 图论模板
    floyd算法template<typenameT>structFloyd{constTINF=std::is_same_v<T,longlong>?1e18:1e9;intn;std::vector<std::vector<T>>dp;Floyd(intn_):n(n_){dp.resize(n+1);for(auto&row:dp){......
  • 你知道Golang的模板怎么用吗?带你了解动态文本的生成!
    GolangTemplateGo语言中的GoTemplate是一种用于生成文本输出的简单而强大的模板引擎。它提供了一种灵活的方式来生成各种格式的文本,例如HTML、XML、JSON等。GoTemplate的具有以下主要特性:简洁易用:GoTemplate语法简洁而易于理解。它使用一对双大括号“{{}}”来标记模板的......
  • 复习c++
    一些偏门的点endl可以用\n代替cout<<"Helloworld"<<"\n"intmain()括号里加void才能表示不可传参//这样是正确的intmain(){if(0)main(42);}//这样会出错intmain(void){if(0)main(42);}默认编译产生的文件名就是cpp的名且不带后面的参数。如果......
  • 【模板】快读快输
    updatedon2023.9.13namespaceRobinChen{charbuf[1<<20],*p1=buf,*p2=buf;intgc(){if(p1==p2)p2=(p1=buf)+fread(buf,1,1<<20,stdin);returnp1==p2?EOF:*p1++;}template<classT>Tread(){Tx=0;c......
  • pycharm设置新建Python文件的模板
    首先找到Pycharm设置默认文件的位置,File-Setting-Editor-FileandCodeTemplates->PythonScript最后附上相应的编写内容大家按需选择:#coding:utf-8——>这里是设置的编码格式,根据自己的实际情况可以修改#当前的项目名:${PROJECT_NAME}#当前编辑文件名:${NAME}#当前......
  • 视图模板____Freemarker入门demo
    //工程结构//代码类packagecom.freemarker.test;importjava.io.File;importjava.io.FileWriter;importjava.io.PrintWriter;importjava.util.HashMap;importjava.util.Map;importfreemarker.template.Configuration;importfreemarker.temp......
  • 自动生成学生成绩分析软件,点击即用,完全自动化模板
    用户界面设计:创建一个用户友好的界面,包括输入成绩数据的功能。提供可选择的数据源选项,如Excel文件、数据库等。允许用户设置分析参数和选项。数据导入:实现数据导入功能,支持从不同来源导入成绩数据。解析导入的数据,并进行格式验证和清洗处理。将清洗后的数据存储到内部数据库或数......
  • 【Spring Boot】Thymeleaf 模板引擎
     Thymeleaf组成:标签+表达式,标签是Thymeleaf的语法结构,而表达式就是语法里的内容实现  pom.xml添加依赖包<!--模板引擎Thymeleaf依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b......