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

还玩线段树吗?

前言&注明

我好像一万年没更新了?

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

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

还是要有参考资料的:

  • 珂朵莉树详解
    (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.mzph.cn/web/36435.shtml

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

相关文章

【408考点之数据结构】树和森林的基本概念、二叉树转森林、以及树和森林的遍历

树和森林的基本概念、二叉树转森林、以及树和森林的遍历 一、树和森林的基本概念 树&#xff08;Tree&#xff09; 是一种重要的非线性数据结构&#xff0c;由n(n≥0)个节点组成&#xff0c;其中有一个根节点和若干子树&#xff0c;这些子树又是若干树的集合。 森林&#xf…

检索增强生成 (RAG):揭开这一术语的神秘面纱并解释其带来的价值

一、介绍 如今&#xff0c;数据已成为新的黄金&#xff0c;而高效筛选这些丰富信息的能力则是成功企业脱颖而出的关键。Retrieval Augmented Generation&#xff08;RAG&#xff09;是创新的标杆&#xff0c;尤其是在知识管理领域。它不再只是为了存储信息&#xff0c;而是为了…

在运行中遇到扫描包问题

问题描述&#xff1a;当我们看到这个上面一行代码时就代表我们有个包没有被当前的Spring容器给扫描到&#xff0c;关于这个问题我们有两个&#xff1a;第一把整个包导进来&#xff0c;第二用哪个导哪个

Linux Swap

Swap: 页面换出&#xff1a;就是在 Swap 机制下&#xff0c;当内存资源紧张时&#xff0c;内核就会把不经常使用的这些匿名页中的数据写入到 Swap 分区或者 Swap 文件中。从而释放这些数据所占用的内存空间。 页面换入&#xff1a;就是当进程再次访问那些被换出的数据时&…

《人生苦短,我用python·六》ctypes 封装 C++ 接口并在 Python 中调用

编写 C 代码 首先&#xff0c;编写一个简单的 C 函数并将其编译成 DLL 动态链接库 // mylib.cpp #include <iostream>extern "C" {__declspec(dllexport) int add(int a, int b) {return a b;} }编写 C 头文件 虽然在这个简单示例中头文件不是必需的&#xf…

7 个不容忽视的开源安全工具

专业人士选择的第一个工具通常是开源选项,因为它们得到了广泛社区的保证和支持。此代码是支持安全可靠的互联网的基础的一部分。 最近,XZ Utils 等丑闻让用户犹豫不决。开放性是否是攻击的危险载体?还有其他问题在等着他们吗? 辩护者指出,虽然开放性可以让某些攻击变得更…

深度学习实战82-新的研究方向:大模型与图模型结合生成大型图模型,大图模型相关挑战和机遇的观点

大家好,我是微学AI,今天给大家介绍一下深度学习实战82-新的研究方向:大模型与图模型结合生成大型图模型,大图模型相关挑战和机遇的观点。随着人工智能的飞速发展,大型模型已成为人工智能领域最新的突破性成就。在图方面,大型模型尚未取得与自然语言处理和计算机视觉等其他…

java:aocache 0.4.0 缓存控制机制

aoocache发布第一个版本0.1.0时&#xff0c;没有考虑到使用aocache的项目对方法缓存的控制需求。 场景 给同事做培训时&#xff0c;同事提到这个需求&#xff0c;他希望能够有方法主动去清理指定方法的缓存&#xff1a; 他的数据是由其他服务启动时提供的&#xff0c;他的方法…

Python基础语法:自定义函数

在Python中&#xff0c;自定义函数允许你创建自己的函数来执行特定的任务。这些函数可以接受参数&#xff0c;执行一系列操作&#xff0c;并返回结果。以下是创建和使用自定义函数的基本步骤&#xff1a; 定义函数 使用def关键字来定义一个函数。函数定义的基本语法如下&…

可持续发展教育:塑造未来的教育模式

在当今全球化和技术进步的背景下&#xff0c;可持续发展教育&#xff08;Education for Sustainable Development, ESD&#xff09;正逐渐成为教育改革的重要议题。本文将深入探讨可持续发展教育的定义、重要性、实施策略及其在全球教育中的实际影响&#xff0c;旨在为读者提供…

【异步编程】【解锁并发的力量:Python 异步编程指南】

目录 前言一、异步编程的概念1-1、异步编程1-2、同步 vs 异步1-3、阻塞 vs 非阻塞1-4、并发 vs 并行 二、Python 异步编程的主要模块2-1、asyncio2-2、async 和 await 关键字2-3、 aiohttp 三、案例分析3-0、安装3-1、基本案例3-2、并发执行多个任务3-3、异常处理3-4、与队列结…

嵌入式Linux系统编程 — 5.1 uname、sysinfo、gethostname、sysconf函数查询系统信息

目录 1 uname函数获取内核名称和信息 1.1 Linux系统命令行 1.2 系统调用函数 2 sysinfo 函数 3 gethostname 函数 4 sysconf函数 1 uname函数获取内核名称和信息 1.1 Linux系统命令行 在Linux系统中&#xff0c;uname命令行工具可以显示关于当前操作系统的信息。这个命…

你还能顶几天?

A总&#xff1a;你还能顶几天&#xff1f; 汪汪队&#xff1a;顶到奉命撤退的那一天 A总&#xff1a;你在这守散钱点几十年了&#xff0c;从来没跟我提过任何的要求&#xff0c;难道你不困难吗&#xff1f; 汪汪队&#xff1a;有困难&#xff0c;但是我提了有什么用呢&#…

第三方服务提供商的五大风险

亚马逊如何应对网络安全挑战 关键网络安全统计数据和趋势 移动优先世界中安全和隐私策略 当今数字时代网络安全的重要性 用户无法停止犯安全错误的 3 个原因 首席安全官可能过于依赖 EDR/XDR 防御 随着业务流程变得越来越复杂&#xff0c;公司开始转向第三方来提高其提供关…

解析XML文件的几种方法

解析XML文件的几种方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们将深入探讨在Java中解析XML文件的几种常用方法。XML&#xff08;可扩展标记语言…

《每天5分钟用Flask搭建一个管理系统》 第6章:数据库集成

第6章&#xff1a;数据库集成 6.1 数据库的选择和配置 在Flask中集成数据库&#xff0c;首先需要选择一个数据库系统。常见的选择包括SQLite、MySQL、PostgreSQL等。选择后&#xff0c;需要配置数据库连接字符串。 示例代码&#xff1a;配置数据库 from flask import Flask…

算法基础--------【图论】

图论&#xff08;待完善&#xff09; DFS:和回溯差不多 BFS:进while进行层序遍历 定义: 图论&#xff08;Graph Theory&#xff09;是研究图及其相关问题的数学理论。图由节点&#xff08;顶点&#xff09;和连接这些节点的边组成。图论的研究范围广泛&#xff0c;涉及路径、…

DNF手游鬼剑士攻略:全面解析流光星陨刀的获取与升级!云手机强力辅助!

《地下城与勇士》&#xff08;DNF&#xff09;手游是一款广受欢迎的多人在线角色扮演游戏&#xff0c;其中鬼剑士作为一个经典职业&#xff0c;因其强大的输出能力和炫酷的技能特效&#xff0c;吸引了众多玩家的青睐。在这篇攻略中&#xff0c;我们将详细介绍鬼剑士的一把重要武…

使用JavaScript的indexOf方法

使用JavaScript的indexOf方法 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来探讨JavaScript中的indexOf方法。indexOf方法是JavaScript中一个非常实…

【Python报错】已解决 ModuleNotFoundError: No module named ‘transformers‘

&#x1f3ac; 鸽芷咕&#xff1a;个人主页 &#x1f525; 个人专栏: 《C干货基地》《粉丝福利》 ⛺️生活的理想&#xff0c;就是为了理想的生活! 引入 ModuleNotFoundError: No module named ‘transformers’ 是一个常见的错误&#xff0c;它表明你的Python环境中没有安装t…