线段树分治总结

线段树分治总结

  • 概念
  • 例题
    • 二分图 /【模板】线段树分治
    • [HAOI2017] 八纵八横
    • [FJOI2015] 火星商店问题
    • Envy
    • Extending Set of Points
    • Forced Online Queries Problem
    • 「雅礼集训 2018 Day10」贪玩蓝月
    • BZOJ4184-shallot
    • [bzoj4644]经典**题

概念

\qquad 线段树分治一般用来解决带有如下两个特征的问题:1、一些操作只在某一特定时间段生效;2、查询某一时间点上所有操作的结果。我们可以对时间建立一棵线段树,把操作挂在线段树对应节点上,询问挂在叶子节点上,然后从根节点开始从左到右遍历线段树。每次进入一个新节点就完成当前节点处挂的操作,从某一结点回溯时把它上面挂的操作撤销,到叶子节点查询即可。所以线段树合并总是与支持添加、撤销的数据结构结合。

例题

二分图 /【模板】线段树分治

\qquad 题面

\qquad 线段树分治模板题。

\qquad 判断一张图是否是二分图,一般用的都是染色法,看有没有相邻两个点颜色相同。但是在本题中图是动态的,显然我们每次不能重新跑一遍图。此时,我们就要用另一种方法:拓展域并查集。因为要撤销,所以我们不能写路径压缩,而应该写按秩合并。

\qquad 核心 C o d e : Code: Code:

void solve(int p) {
	int cnt = 0;
	bool flag = 1;
	for(int i : qs(p)) {//把挂在当前节点的边添加到并查集中
		if(B.Find(a[i].x) == B.Find(a[i].y)) {//若当前已经不是二分图,再加边就更不是二分图了
			for(int j = l(p); j <= r(p); j ++) bol[j] = 1;
			flag = 0;
			break;
		}
		B.merge(a[i].x + n, a[i].y, cnt), B.merge(a[i].x, a[i].y + n, cnt);
	}
	if(flag && l(p) != r(p)) solve(p << 1), solve(p << 1 | 1);
	while(cnt --) {//撤销
		Node Top = s.top(); s.pop();
		B.bin[Top.x] = Top.x, B.dep[Top.fa] -= Top.dep;
	}
}

[HAOI2017] 八纵八横

\qquad 题面

\qquad 线段树分治套线性基。

\qquad 只要提到异或,他那很好的性质总是能给我们带来很大的便利: x ⊕ x = 0 x\oplus x=0 xx=0。在本题中,我们的任务实际上是找到几个环使得他们权值的异或和最大。因为最终的路径是以首都为开头、结尾的环,环上的边是可以由其他环拼出来的(选两次相当于没选)。那么我们如何找到图上所有的环呢?一个结论是我们在一开始任意找一个图的生成树,那么我们仅需记录新加的边与生成树形成的环便可组成所有的环。根据这个结论,套上一个线段树分治即可。

\qquad 核心 C o d e : Code: Code:

//并查集操作
int Find(int x) {
	while(x != bin[x]) x = bin[x];
	return x;
}
bt Find_dis(int x) {//路径权值异或和
	bt res;
	res.reset();
	while(x != bin[x]) res ^= dis[x], x = bin[x];
	res ^= dis[x];
	return res;
}
void merge(node Now) {
	int x = Now.x, y = Now.y; bt z = Now.w;
	int fx = Find(x), fy = Find(y);
	if(fx == fy) return G.Insert(Find_dis(x) ^ Find_dis(y) ^ z), void();
	if(sze[fx] > sze[fy]) swap(fx, fy), swap(x, y);
	stk.push({fx, fy, sze[fy]});
	dis[fx] = Find_dis(x) ^ Find_dis(y) ^ z;
	bin[fx] = fy, sze[fy] += sze[fx];
}

[FJOI2015] 火星商店问题

\qquad 题面

\qquad 线段树分治套可持久化 01 t r i e 01trie 01trie

\qquad 其实主要就题面将恶心点,写起来还是很顺的。

\qquad 核心 C o d e : Code: Code:

//可持久化01trie
struct Trie {
	int tr[maxn * 20][2], num[maxn * 20], tot = 0;
	
	inline int build() {
		return ++ tot;
	}
	
	void Insert(int p, int q, int val) {
		num[p] = num[q] + 1;
		for(int i = 19; ~i; i --) {
			int x = ((val >> i) & 1);
			tr[p][x ^ 1] = tr[q][x ^ 1], tr[p][x] = build();
			p = tr[p][x], q = tr[q][x];
			num[p] = num[q] + 1;
		}
	}
	int query(int p, int q, int val) {
		int res = 0;
		for(int i = 19; ~i; i --) {
			int x = ((val >> i) & 1);
			if(num[tr[q][x ^ 1]] > num[tr[p][x ^ 1]]) res += (1 << i), x ^= 1;
			p = tr[p][x], q = tr[q][x];
		}
		return res;
	}
}T;

Envy

\qquad 题面

\qquad 奇怪的东西混入……

\qquad 最小生成树性质题。

\qquad 本题主要用到最小生成树的两个性质:1、所有最小生成树中,权值相同的边的条数一定是相同的。2、所有最小生成树中,小于等于某一权值的边加完后图的连通性一定是相同的。有了这两点,我们每次将不同权值的边分开考虑,判断是否成环即可。

\qquad Code

Extending Set of Points

\qquad 题面

\qquad 我们若将整个网格的行看作二分图的左部点,列看作二分图的右部点,那么网格上的一个点就对应了二分图上的一条连接左右部点的边。一个显然的结论:二分图上的一个连通块给答案带来的贡献为 s x × s y sx\times sy sx×sy s x , s y sx,sy sx,sy 分别表示当前连通块中左右部点的数量。直接套线段树分治即可。

\qquad Code

Forced Online Queries Problem

\qquad 题面

\qquad 最恶心的一道题……

\qquad 虽然题目中给定了所谓的“强制在线”,但这是诈骗题!注意到,线段树分治就是对时间建立线段树,求解的时候也是按照时间的先后依次求解,所以我们带考虑到第 i i i 个操作时,它的 l a s t a n s lastans lastans 一定已经求过了。而且注意到本题的 l a s t a n s lastans lastans 只有可能是 0 / 1 0/1 0/1,所以我们在插入线段树的时候把 l a s t a n s = 0 / 1 lastans=0/1 lastans=0/1 的情况全部插入,在往并查集中加入的时候判断一下该加哪条边即可。有点细节。

\qquad Code

「雅礼集训 2018 Day10」贪玩蓝月

\qquad 题面

\qquad 线段树分治套背包水题。

\qquad 核心 C o d e : Code: Code:

void calc(int p) {
	for(PII x : qs[p]) {
		cnt ++;
		for(int j = 0; j < mod; j ++) dp[cnt][j] = dp[cnt - 1][j];
		for(int j = 0; j < mod; j ++) dp[cnt][(x.first + j) % mod] = max(dp[cnt][(x.first + j) % mod], dp[cnt - 1][j] + x.second);
	}
}

BZOJ4184-shallot

题面

\qquad 八纵八横的简化版,线段树分治套线性基。

[bzoj4644]经典**题

题面

\qquad 我们把一个点的权值定义为与其相连的边的权值的异或和。可以发现,如果一条边同时选两个端点相当于没选,所以本题相当于选出若干点使得异或和最大。线段树分治时,线段树节点处插入点在该时刻时的权值。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/358844.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

强敌环伺:金融业信息安全威胁分析——整体态势

从早期的Zeus和其他以银行为目标的特洛伊木马程序&#xff0c;到现在的大规模分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;再到新颖的钓鱼攻击和勒索软件&#xff0c;金融服务业已成为遭遇网络犯罪威胁最严重的行业之一。金融服务业的重要性不言而喻&#xff0…

浙政钉(专有钉钉)

专有钉钉是浙政钉的测试版本&#xff0c;可在正式发布之前进行业务开发。 专有钉钉 原名政务钉钉 是高安全、强管控、灵活开放的面向大型组织专有独享的协同办公平台。支持专有云、混合云等多种方式灵活部署&#xff0c;以满足客户特定场景所需为目标&#xff0c;最大化以“平…

Docker 搭建MySQL主从复制-读写分离

一. 介绍 MySQL主从复制是一种常用的数据库高可用性解决方案&#xff0c;通过在主数据库上记录的数据变更&#xff0c;同步到一个或多个从数据库&#xff0c;实现数据的冗余备份和读写分离。在Docker环境下搭建MySQL主从复制和读写分离&#xff0c;不仅方便管理&#xff0c;还…

【干货】【常用电子元器件介绍】【电容】(二)--电容器的主要参数、测量、选择与应用

声明&#xff1a;本人水平有限&#xff0c;博客可能存在部分错误的地方&#xff0c;请广大读者谅解并向本人反馈错误。 一、 电容器的主要参数 1.1 耐压 耐压(Voltage Rating)是指电容器在电路中长期有效地工作而不被击穿所能承受的最大直流电压。对于结构、介质、容量相同的…

Linux--redhat9创建软件仓库

1.插入光盘&#xff0c;挂载镜像 模拟插入光盘: 点击:虚拟机-可移动设备-CD/DVD 设备状态全选&#xff0c;使用ISO影响文件选择当前版本镜像&#xff0c;点击确认。 2.输入: df -h 可以显示&#xff0c;默认/dev/sr0文件为光盘文件&#xff0c;挂载点为/run/media/root/镜像…

Linux(CentOS7)常见指令的常见用法(上)

指令功能hostname查看当前的主机名hostnamectl set-hostname修改主机名adduser添加用户passwd给用户设置密码userdel -r 删除用户ls显示某路径下的文件名ls -l ll 显示某路径下每个文件及其属性ls -la ls -al 显示某路径下所有文件包括隐藏文件及属性ls -d只看指定文件夹&…

ElementUI安装与使用指南

Element官网-安装指南 提醒一下&#xff1a;下面实例讲解是在Mac系统演示的&#xff1b; 一、开发环境配置 电脑需要先安装好node.js和vue2或者vue3 安装Node.js Node.js 中文网 安装node.js命令&#xff1a;brew install node node.js安装完后&#xff0c;输入&#xff1…

第九节HarmonyOS 常用基础组件18-checkBox

1、描述 提供多选框组件&#xff0c;通常用于某选项的打开或关闭。 2、接口 Checkbox(options:{name?: string, group?: string}) 3、参数 参数名 参数类型 必填 描述 name string 否 多选框名称 group string 否 多选框群组名称。&#xff08;未配合使用Chec…

【芯片设计- RTL 数字逻辑设计入门 番外篇 8 -- MBIST 详细介绍】

请阅读【嵌入式开发学习必备专栏 】 文章目录 MBISTMBIST 背景MBIST的主要特点和优势MBIST的工作原理举例 MBIST MBIST&#xff08;Memory Built-In Self-Test&#xff09;是一种在系统级芯片&#xff08;SoC&#xff09;中内置的内建自测试&#xff0c;用于检测和验证片上存储…

centos下静态链接:/usr/bin/ld: cannot find -l某某某

问题&#xff1a;/usr/bin/ld: cannot find -l某某某 前言解法相关文章 前言 我是在静态链接的时候碰到了/usr/bin/ld: cannot find -lstdc的问题&#xff0c;这里来记录一下我是如何解决的。 如果你是动态链接的时候出了问题&#xff0c;可以直接看我给出的倒数第二篇文章&a…

C#,贝尔数(Bell Number)的计算方法与源程序

1 埃里克坦普尔贝尔 贝尔数是组合数学中的一组整数数列&#xff0c;以埃里克坦普尔贝尔&#xff08;Eric Temple Bell&#xff09;命名&#xff0c; 埃里克坦普尔贝尔&#xff08;生于1883年2月7日&#xff0c;苏格兰阿伯丁郡阿伯丁&#xff0c;于1960年12月21日在美国加利福尼…

Abp 创建一个WPF的项目

开发环境&#xff1a;VS2022、.NET6 1、创建项目&#xff1a;MyWpfApp&#xff0c;这里不再废话了。 2、NuGet添加&#xff1a; 2.1、Volo.Abp.Autofac 2.2、Serilog.Sinks.File 2.3、Serilog.Sinks.Async 2.4、Serilog.Extensions.Logging 2.5、Serilog.Extensions.Hos…

算法沉淀——滑动窗口(leetcode真题剖析)

算法沉淀——滑动窗口 01.长度最小的子数组02.无重复字符的最长子串03.最大连续1的个数 III04.将 x 减到 0 的最小操作数05.水果成篮06.找到字符串中所有字母异位词07.串联所有单词的子串08.最小覆盖子串 滑动窗口算法是一种用于解决数组或列表中子数组或子序列问题的有效技巧。…

【C++版】排序算法详解

目录 直接插入排序 希尔排序 选择排序 冒泡排序 堆排序 快速排序 hoare法 挖坑法 前后指针法 非递归版本 快速排序中的优化 归并排序 递归版本 非递归版本 计数排序 总结 直接插入排序 直接插入排序的思想是&#xff1a;把待排序的记录按其关键码值的大小逐个插入…

【Java程序设计】【C00174】基于SSM在线医院管理系统(论文+PPT)

基于SSM在线医院管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的在线医院管理系统 本系统分为前台系统、后台管理员、后台医生以及后台用户4个功能模块。 前台系统&#xff1a;当游客打开系统的网址后&#xf…

flask基于python的个人理财备忘录记账提醒系统vue

在当今高度发达的信息中&#xff0c;信息管理改革已成为一种更加广泛和全面的趋势。 “备忘记账系统”是基于Mysql数据库&#xff0c;在python程序设计的基础上实现的。为确保中国经济的持续发展&#xff0c;信息时代日益更新&#xff0c;蓬勃发展。同时&#xff0c;随着信息社…

在 Android 中使用 C/C++:初学者综合指南

在 Android 中使用 C/C&#xff1a;初学者综合指南 一、为什么有人在他们的 Android 项目中需要 C/C 支持&#xff1f;二、了解 C 如何集成到 Android 应用程序中三、C和Java程序的编译3.1 Java3.2 Android ART 和 DEX 字节码 四、使用 JNI 包装 C 源代码五、CMake和Android ND…

【讲座分享】| 复旦大学张奇教授——《自然语言发表论文如何打怪升级?NLP顶会论文发表》

文章目录 1 基础关1.1 基础书籍1.2 提高书籍1.3 课程链接1.4 编程实战 2 阅读关2.1 分层过滤2.2 集团作战&#xff0c;信息获取2.3 论文如何泛读 3 动机 方向关3.1 快速发论文3.2 好的研究 4 写作关4.1 论文写作流程4.2 从读者角度出发4.3 每一部分怎么写4.3.1 Abstract摘要4.3…

浅谈一下软件 QA 方法论 和 工具

浅谈一下软件 QA 方法论 和 工具 目录概述需求&#xff1a; 设计思路实现思路分析1.QA方法论2.Java QA工具 参考资料和推荐阅读 Survive by day and develop by night. talk for import biz , show your perfect code,full busy&#xff0c;skip hardness,make a better result…

探索Go 语言URL:解析与构建

探索Go 语言URL&#xff1a;解析与构建 在 Go 语言中&#xff0c;解析和处理 URL 是日常开发中常见的任务之一。URL&#xff08;统一资源定位符&#xff09;是指定 Web 资源位置的标准方式&#xff0c;它由多个部分组成&#xff0c;包括协议、主机、路径、查询参数等。本文将深…