首页 > 编程语言 >自用:常见算法竞赛/刷题问题 & 模板

自用:常见算法竞赛/刷题问题 & 模板

时间:2024-05-26 16:33:57浏览次数:21  
标签:int fa depth pa 自用 刷题 root 模板 dis

以下是我平常刷题遇到的部分常见问题,随手记录一下。(不定时更新)

基本算法

二维前缀和

for (int i = 1; i <= m; ++i)
{
	for (int j = 1; j <= n; ++j)
  	{
		pre[i][j] = pre[i - 1][j] + pre[i][j - 1] - pre[i - 1][j - 1] + nums[i][j];
  	}
}
// 异或版本
for (int i = 1; i <= m; ++i)
{
	for (int j = 1; j <= n; ++j)
	{
		pre[i][j] = pre[i - 1][j] ^ pre[i][j - 1] ^ pre[i - 1][j - 1] ^ nums[i][j];
	}
}

图论

LCA

倍增算法模板

例见:P3379 【模板】最近公共祖先(LCA)

const int MAXD = 20;
int depth[N];
int fa[N][MAXD];

void bfs(int s)
{
	memset(depth, 0x3f, sizeof(depth));
	queue<int> q;
	q.push(s); depth[0] = 0, depth[s] = 1;
	while (!q.empty())
	{
		int u = q.front(); q.pop();
		for (int v : adj[u])
		{
			if (depth[v] > depth[u] + 1)
			{
				depth[v] = depth[u] + 1;
				fa[v][0] = u;
				for (int d = 1; d < MAXD; ++d)
					fa[v][d] = fa[fa[v][d - 1]][d - 1];
				q.push(v);
			}
		}
	}
}

int lca(int x, int y)
{
	if (depth[x] < depth[y]) swap(x, y);
	for (int d = MAXD - 1; d >= 0; --d)
	{
		if (depth[fa[x][d]] >= depth[y])
			x = fa[x][d];
	}
	if (x == y) return x;
	for (int d = MAXD - 1; d >= 0; --d)
	{
		if (fa[x][d] != fa[y][d])
		{
			x = fa[x][d];
			y = fa[y][d];
		}
	}
	return fa[x][0];
}

Tarjan 离线 LCA

tarjan 离线做法很大程度取决问题所求,通常场景为需要根据多个询问指定的两个节点的 LCA 以推导结果的情况。

例如,在边权图内求解任意两点的最短路径:

\[dis_{i,j} = dis_{root,i} + dis_{root,j} - 2 \times dis_{root, lca(i, j)} \]

\(dis_{root,u}\) 可以通过 DFS 预处理求出。而 \(lca(i, j)\) 则在 tarjan 递归中可以得知,见下:

struct Edge {
	int u, v;
};
vector<Edge> adj[N];

struct Query {
	int v, id;
};
vector<Query> qe[N];

struct Dsu
{
	int pa[N];
	Dsu() {
		iota(pa, pa + N, 0);
	}
	int find(int u) {
		return pa[u] == u ? u : pa[u] = find(pa[u]);
	}
	void merge(int u, int v) {
		pa[find(u)] = find(v);
	}
} dsu;

void dfs(int u, int fa)
{
	for (auto [v, w] : adj[u])
	{
		if (v == fa) continue;
		dis[v] = dis[u] + w;
		dfs(v, u);
	}
}

void tarjan(int u, int fa)
{
	st[u] = true;
	for (auto [u, w] : adj[u])
	{
		if (v != fa)
			tarjan(v, u);
	}

	for (Query q : qe[u])
	{
		int v = q.v, id = q.id;
		if (st[v])
		{
			int anc = dsu.find(v);
			res[id] = dis[u] + dis[v] - 2 * dis[anc];
		}
	}

	dsu.pa[u] = fa;
}

如果给定的为点权,则额外注意需要加上 LCA 的点权,因为在LCA本身也包含在 \(x \rightarrow y\) 的路径之中。

\[dis_{i,j} = dis_{root,i} + dis_{root,j} - 2 \times dis_{root, lca(i, j)} + pw_{lca(i, j)} \]

标签:int,fa,depth,pa,自用,刷题,root,模板,dis
From: https://www.cnblogs.com/himu-qaq/p/18213108

相关文章

  • 线段树结构体模板
    线段树是一种维护区间和等功能的数据结构structSegTree{ structnode{ intl,r,sum,len,laz; }tree[N<<2]; inlinevoidpushdown(intu){ intlson=u<<1,rson=lson|1; tree[lson].laz+=tree[u].laz; tree[rson].laz+=tree[u].laz; tree[lson].sum+=tree[lson].len......
  • 【知识点】深入浅出STL标准模板库
    前几天谈论了许多关于数论和数据结构的东西,这些内容可能对初学者而言比较晦涩难懂(毕竟是属于初高等算法/数据结构的范畴了)。今天打算来讲一些简单的内容-STL标准模板库。STL标准模板库C++标准模板库(StandardTemplateLibrary,STL),是C++语言非常重要的一个构成部分......
  • 一个模板元函数来检查一个类是否有一个特定的成员
    通过创建一个模板元函数来检查一个类是否有一个特定的成员。以下是一个例子:#include<type_traits>template<typenameT,typename=void>structhas_type_member:std::false_type{};template<typenameT>structhas_type_member<T,std::void_t<typenameT::typ......
  • 『C++初阶』第四章--- 模板初级
    1.泛型编程    如何实现一个适合于所有类型的通用的交换函数呢?voidSwap(int&left,int&right){inttemp=left;left=right;right=temp;}voidSwap(double&left,double&right){doubletemp=left;left=right;right=temp;}voidSwap(ch......
  • 数据分析面试必备,45道SQL题目,从易到难,刷题必备 个人答案
    哔哩哔哩视频地址如下https://www.bilibili.com/video/BV1Bp4y1n7Ah?p=9&vd_source=3c401e9b12aadd668c92b73995070898缘由本人由于今天晚上面试回答简单sql语句磕磕巴巴,被面试官通知:我没有想问的,你可以自行投简历而导致红温,遂上b站刷sql题目,与本贴更新个人答案建表语句#......
  • 【刷题笔记Day2】数组|977.有序数组的平方、209. 长度最小的子数组、59.螺旋矩阵II
    文章目录977.有序数组的平方解题思路遇到的问题及解决方案209.长度最小的子数组解题思路遇到的问题及解决方案59.螺旋矩阵II解题思路遇到的问题及解决方案总结977.有序数组的平方题目描述:给你一个按非递减顺序排序的整数数组nums,返回每个数字的平方组成的新......
  • gin框架模板渲染
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录gin框架模板渲染自定义模板函数静态文件处理gin框架模板渲染这个目录的路径要放正确(虽然我也不知道为什么突然就解决了)==错误模板====正确版本==packagemainimport( "net/http"......
  • Django模板层之模板语法
    1.变量变量输出语法{{var}}当模版引擎遇到一个变量,将计算这个变量,然后将结果输出变量名必须由字母、数字、下划线(不能以下划线开头)和点组成当模版引擎遇到点("."),会按照下列顺序查询:字典查询,例如:foo["bar"]属性或方法查询,例如:foo.bar数字索引查询,例如:foo[bar]如......
  • 网页设计模板网站 HTML5网站模板
    在当今数字化时代,网页设计已成为企业和个人展示其品牌形象、分享内容以及与用户互动的重要渠道。为了满足不同用户的需求,HTML5网站模板应运而生,为网页设计师和开发者提供了强大而灵活的基础框架。成品网站模板:https://www.yunbuluo.net/pbootcms(已发布500多款)HTML网页模板:ht......
  • 网页设计模板网站 公司网站设计制作
    网页设计模板网站助力公司网站设计制作,在数字化高速发展的今天,拥有一个专业、美观、功能齐全的公司网站对于企业的形象塑造和业务拓展至关重要。然而,对于许多中小企业来说,缺乏专业的网页设计团队和预算限制成为了阻碍其建立高质量网站的难题。这时,网页设计模板网站的出现为公......