我重生了,学会了珂朵莉树

news2024/11/24 22:19:23

还玩线段树吗?

前言&注明

我好像一万年没更新了?

化学!!!!!!!!!!!!!!!!!!!(我发个电)
在这里插入图片描述

珂朵莉树貌似挺有用的?(做做熟练泼粪题就知道了)

还是要有参考资料的:

  • 珂朵莉树详解
    (From:CSDN,@Suryxin.)

先不启动,先说说珂朵莉树的起源

珂朵莉树原名老司机树(Old Driver Tree,ODT),由2017年一场CF比赛中提出的数据结构,因为题目背景主角是《末日时在做什么?有没有空?可以来拯救吗?》的主角珂朵莉,因此该数据结构被称为珂朵莉树。(引自珂朵莉树详解,我懒)

正片开始

啥是珂朵莉树?

通过 set 存放若干个用结构体表示的区间,每个区间的元素都是相同的一种较暴力的数据结构。

只要是涉及区间赋值操作的问题,就可以用珂朵莉树处理几乎任何有关区间信息的询问。(显然,前提是不会 TLE)

想要知道珂朵莉树怎么卡或者怎么会被卡,可见此。

所以,前置知识就来了

  • 关联式容器(set)(From:OI-Wiki)
  • mutable(自己找资料,感觉可以不学)

开始讲怎么写了

先扔出例题:Physical Education Lessons。

定义

之前说过珂朵莉树要用结构体存储区间,所以定义就是写一个结构体。

struct Project_KDL_Tree{
	int l,r;
	mutable int val;
	inline bool operator<(const Project_KDL_Tree&BlastMike)const{
		return l<BlastMike.l;
	}//重载运算符,按左端点排序
	Project_KDL_Tree(int L,int R=-1,int Val=0):l(L),r(R),val(Val){}
};

BlastMike:孩子们,我回来了。
在这里插入图片描述

Split

该函数实现我们要从 set 中的所有区间中找到我们要找的 n o w now now 所在的区间,并拆成两个区间 [ l , n o w − 1 ] [l, now - 1] [l,now1] [ n o w , r ] [now, r] [now,r], 使 n o w now now 作为一个区间的开头,返回该区间的迭代器。

inline S_It Split(int now){
	S_It it=KDL_Tree.lower_bound(Project_KDL_Tree(now));//找到now的迭代器
	if(it!=KDL_Tree.end()&&it->l==now)
		return it;//若这个迭代器的l是的now,直接返回
	--it;//若不是则在前一个里面
	int l=it->l,r=it->r,val=it->val;
	KDL_Tree.erase(it);//删掉该区间
	KDL_Tree.insert(Project_KDL_Tree(l,now-1,val));//重新放入区间[l,now-1]和[now,r]
	return KDL_Tree.insert(Project_KDL_Tree(now,r,val)).first;//返回以now为开头的迭代器
}
Assign Val

若不断进行split函数,会导致 TLE,所以我们需要一个区间合并操作即针对区间赋值的一个操作。

inline void Assign_Val(int l,int r,int val){
	S_It itr=Split(r+1),itl=Split(l);//先找到r+1的迭代器位置,再找l的迭代器位置,具体为什么可以看set的性质
	S_It it;
	for(it=itl;it!=itr;++it)
		Answer-=it->val*(it->r-it->l+1);//计算贡献,具体因题目而异
	KDL_Tree.erase(itl,itr);//删掉这一段
	KDL_Tree.insert(Project_KDL_Tree(l,r,val));//重新插入所需区间
	Answer+=val*(r-l+1);//计算贡献,具体因题目而异
}

为什么要找 r + 1 r+1 r+1?因为 set 删除的时候传参是左闭右开的。

Code
#include<bits/stdc++.h>
using namespace std;
const int Maxn=2e5+5;
struct Project_KDL_Tree{
	int l,r;
	mutable int val;
	inline bool operator<(const Project_KDL_Tree&BlastMike)const{
		return l<BlastMike.l;
	}
	Project_KDL_Tree(int L,int R=-1,int Val=0):l(L),r(R),val(Val){}
};
#define S_It set<Project_KDL_Tree>::iterator
set<Project_KDL_Tree>KDL_Tree;
long long Answer;
inline S_It Split(int now){
	S_It it=KDL_Tree.lower_bound(Project_KDL_Tree(now));
	if(it!=KDL_Tree.end()&&it->l==now)
		return it;
	--it;
	int l=it->l,r=it->r,val=it->val;
	KDL_Tree.erase(it);
	KDL_Tree.insert(Project_KDL_Tree(l,now-1,val));
	return KDL_Tree.insert(Project_KDL_Tree(now,r,val)).first;
}
inline void Assign_Val(int l,int r,int val){
	S_It itr=Split(r+1),itl=Split(l);
	S_It it;
	for(it=itl;it!=itr;++it)
		Answer-=it->val*(it->r-it->l+1);
	KDL_Tree.erase(itl,itr);
	KDL_Tree.insert(Project_KDL_Tree(l,r,val));
	Answer+=val*(r-l+1);
}
int n,m;
signed main(){
	ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
	cin>>n>>m;
	Answer=n;
	KDL_Tree.insert(Project_KDL_Tree(1,n,1));
	for(register int i=1,l,r,val;i<=m;++i){
		cin>>l>>r>>val;
		Assign_Val(l,r,val-1);
		cout<<Answer<<endl;
	}
	return 0;
}

然后你就会了

在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

NSSCTF-Web题目18(反序列化)

目录 [NISACTF 2022]babyserialize 1、题目 2、知识点 3、思路 [SWPUCTF 2022 新生赛]ez_ez_unserialize 4、题目 5、知识点 6、思路 [NISACTF 2022]babyserialize 1、题目 2、知识点 反序列化、绕过过滤、命令执行 3、思路 <?php include "waf.php";…

【RAG】FoRAG:面向网络增强型长形式问答的事实性优化RAG

一、解决问题 在基于网络的长形式问答&#xff08;Web-enhanced Long-form Question Answering, LFQA&#xff09;任务中&#xff0c;现有RAG在生成答案时存在的问题&#xff1a; 事实性不足&#xff1a;研究表明&#xff0c;现有系统生成的答案中只有大约一半的陈述能够完全得…

填报高考志愿时,学校、专业和城市怎么选择呢?

我的观点是&#xff1a; 专业>城市>学校 专业是兴趣导向&#xff0c;符合自己的价值观&#xff0c;失去了这种驱动力的专业学习&#xff0c;会变得非常艰难的&#xff0c;而且没有竞争力&#xff0c;所以我的排序第一位是专业。 其次是城市&#xff0c;最好是一线城市&…

vue3.0(十五)内置组件Teleport和Suspense

文章目录 一、Teleport1.基本用法2.禁用Teleport3.多个 Teleport 共享目标4.搭配组件 二、 Suspense1.什么是Suspense2.异步依赖3.加载中状态4.事件5.错误处理6.和其他组件结合注意 一、Teleport <Teleport> 是一个内置组件&#xff0c;它可以将一个组件内部的一部分模板…

java+mysql通讯录管理

完整代码地址如果控制台打印出现乱码&#xff0c;进行如下设置

stm32-hal库(5)--usart串口通信三种模式(主从通信)(关于通信失败和串口不断发送数据问题的解决)

问题&#xff1a; 最近发现&#xff0c;stm32cubemx最新版本f1系列的hal库&#xff08;1.85版本&#xff09;生成的hal库&#xff0c;其中stm32f1xx_hal_uart.c的库文件中&#xff0c;其串口发送接收存在一些问题&#xff1a; 1.没有使用 __HAL_LOCK 和 __HAL_UNLOCK 宏&…

LinkedIn被封原因和解封方法

对于初识领英和对领英生态规则不熟悉的人来说&#xff0c;很容易造成领英账号被封号(被限制登录)的情况&#xff0c;那么如何才能避免和解决领英帐号被封号(被限制登录)的难题呢&#xff1f; 领英帐号被封号或被限制登录主要会有两类情况。 首先要搞清楚&#xff0c; Linkedi…

谷歌邮箱被停用,开发者账号也要废了?还能申诉回来吗?怎么申诉?

相信不少开发者都遭遇过开发者账号的邮箱被暂停的情况&#xff0c;有时候明明什么也没做&#xff0c;就被突然被停用了&#xff1f; 面对这种情况&#xff0c;开发者们最担心的莫过于这是否会波及到他们使用该邮箱注册的开发者账号&#xff1f;APP还会正常审核吗&#xff1f;毕…

接口自动化测试关联token的方法?

引言&#xff1a; 在接口自动化测试中&#xff0c;有时候我们需要关联token来进行身份验证或权限管理。本文将从零开始&#xff0c;介绍如何详细且规范地实现接口自动化测试中token的关联。 步骤一&#xff1a;准备工作 在开始之前&#xff0c;我们需要确保以下准备工作已完成…

一文说明白,香港优才计划到底适合哪些人申请?

香港优才计划的热度仍然在持续&#xff0c;自取消配额限制以来&#xff0c;仅2023年一年时间&#xff0c;优才计划申请人数就超过8万&#xff0c;比历年累积的申请人数还要多。 之所以有如此高的热度&#xff0c;完全是因为优才的灵活性&#xff0c;为许多中产精英拿香港身份甚…

Ruoyi-前后端分离部署

目录 一. 环境准备 二. 安装Nginx 三. 安装Java 四. 安装MySQL、Redis 五. 配置打包环境 1. 配置前端打包环境 2. 配置后端打包环境 3. 获取代码 4. 前端代码打包 5. 后端项目打包 六. 项目上线 1.前端项目上线 2. 后端项目上线 一. 环境准备 项目官网&#xff1a…

LED封装技术中SMD、COB和GOB的优缺点

在小间距LED显示屏的封装技术中&#xff0c;SMD、COB和GOB各有其优缺点&#xff0c;以下是对这些技术的详细分析&#xff1a; SMD&#xff08;Surface Mounted Devices&#xff09;表贴工艺技术 SMD技术是将LED灯珠焊接在电路板上的一种成熟技术&#xff0c;广泛应用于LED显示屏…

如何高效安全的开展HPC数据传输,保护数据安全?

高性能计算&#xff08;HPC&#xff09;在多个行业和领域中都有广泛的应用&#xff0c;像科学研究机构、芯片IC设计企业、金融、生物制药、能源、航天航空等。HPC&#xff08;高性能计算&#xff09;环境中的数据传输是一个关键环节&#xff0c;它涉及到将数据快速、安全地在不…

Studying-代码随想录训练营day23| 39.组合总和、40.组合总和II、131.分割回文串

第23天&#xff0c;回溯part02&#xff0c;回溯两个题型组合&#xff0c;切割(ง •_•)ง&#x1f4aa; 目录 39.组合总和 40.组合总和II 131.分割回文串 总结 39.组合总和 文档讲解&#xff1a;代码随想录组合总和 视频讲解&#xff1a;手撕组合总和 题目&#xff1a;…

启智畅想:AI集装箱箱号识别系统,解决方案提供商

AI集装箱箱号识别系统 当前,智能卡口管理行业正处于快速发展的阶段。随着物联网、大数据、人工智能等技术的不断进步,智能卡口管理系统已经能够实现对集装箱运输的全程跟踪、监控和管理,大大提高了管理效率和安全性。然而,市场上现有的智能卡口管理系统仍然存在一些痛点问题,如…

【文档智能】DLAFormer:端到端的解决版式分析、阅读顺序方法

前言 前面文章介绍到&#xff0c;文档智能中版式分析(DLA)&#xff08;《【文档智能 & RAG】RAG增强之路&#xff1a;增强PDF解析并结构化技术路线方案及思路》&#xff09;、阅读顺序&#xff08;《【文档智能】符合人类阅读顺序的文档模型-LayoutReader及非官方权重开源…

Windows怎么实现虚拟IP

在做高可用架构时&#xff0c;往往需要用到虚拟IP&#xff0c;在linux上面有keepalived来实现虚拟ip的设置。在windows上面该怎么弄&#xff0c;keepalived好像也没有windows版本&#xff0c;我推荐一款浮动IP软件PanguVip&#xff0c;它可以实现windows上面虚拟ip的漂移。设置…

Feign 配置全局日志存入mongo

1、开启feign日志 在application.yml 添加配置 feign:client:config:default:loggerLevel: FULL2、日志实体类 Document(collection "feignLogs") Data public class FeignLog {Idprivate String id;private String method;private String url;private LocalDate…

智慧园区综合平台解决方案PPT(75页)

## 智慧园区的理解 ### 从园区1.0到园区4.0的演进 1. 园区1.0&#xff1a;以土地经营为主&#xff0c;成本驱动&#xff0c;提供基本服务。 2. 园区2.0&#xff1a;服务驱动&#xff0c;关注企业成长&#xff0c;提供增值服务。 3. 园区3.0&#xff1a;智慧型园区&#xff…

Spring Boot结合FFmpeg实现视频会议系统视频流处理与优化

在构建高效稳定的视频会议系统时,实时视频流的处理和优化是开发者面临的核心挑战之一。这不仅仅是简单的视频数据传输,更涉及到一系列复杂的技术问题,需要我们深入分析和有效解决。 高并发与实时性要求: 视频会议系统通常需要支持多人同时进行视频通话,这就意味着系统需要…