ODT/珂朵莉树 入门

news/2025/9/20 7:28:24/文章来源:https://www.cnblogs.com/lc1230/p/19101957

主打一个看到别人学什么我学什么,反正什么也不会。

什么是 ODT

是一种数据结构

类比线段树的话,他的每一条线段(一个基本单位)记录了相同 "颜色" 的东西的信息
使用一个结构体的 \(set\),记录 区间 \([l,r]\) 的信息都为 \(k\)

时间复杂度

随机数据可能是 \(O(n)\) 的,一般可以认为是 \(O(nlogn)\) ,但有时也可以卡到 \(nlog^2n\)
不知道,差不多用就是了

解决什么问题

根据其特性,可以解决区间 \(k\) 大,区间元素幂的和...
还有什么做到了再说.....

ODT 怎么维护

核心是 Split 操作

对于一个 \(pos\) 的修改,找到覆盖 \(pos\) 的区间 \([l,r]\) ,将他分开变成 \([l,pos-1],[pos,r]\) ,然后返回 \([pos,r]\) 区间的迭代器

区间修改操作

\([l,r]\) 赋值为 \(x\)\(split(r+1)\) ,再 \(split(l)\)
原因就是 \(split(l)\) 会影响后面的值
然后删掉两个迭代器中间的信息,全部变成一个 \([l,r],x\)

所以我们得到模版代码,有一些不常用的东西

模版

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define IT set<node>::iterator
struct node{int l,r;mutable ll v;//mutable就是你在用迭代器访问的时候也可以直接赋值 bool operator < (const node &a)const {return l<a.l;}
};
set<node> s;
IT split(int pos){IT it=s.lower_bound(node{pos,0,0});if(it!=s.end()&&is->l==pos)return it;it--;if((it->r)<pos)return s.end();//写指针注意加括号int l=it->l,r=it->r;ll v=it->v;s.erase(it);s.insert(node{l,pos-1,v});return s.insert(node{pos,r,v}).first;//set.insert返回一个 pair :first指向插入后该元素的迭代器,second则为bool表示插入是否成功。 
}
void upd(int l,int r,int x){IT itr=split(r+1);//因为我们要拆出 $[l,r]$ 而split会拆出 [l,pos-1]所以应该是r+1IT itl=split(l);s.erase(itl,itr);//表示删除两迭代器中间的所有元素s.insert(node{l,r,x}); 
} 

例题

对于 \(ODT\) 的题,答案的维护一般就在 \(upd\) 函数里,没有固定模版

CF915E

非工作日为 \(0\) ,工作日为 \(1\) ,就是维护全局和,那就每次减去旧区间和加上新的

#include<bits/stdc++.h>
using namespace std;
const int N=3e5+10;
#define ll long long
#define IT set<node>::iterator
int n,q;
struct node{int l,r;mutable ll v;bool operator <  (const node &a)const {return l<a.l;}
};
set<node>s;
IT split(int pos){IT it=s.lower_bound(node{pos,0,0});if(it!=s.end()&&it->l==pos)return it;it--;if(it->r<pos)return s.end();int l=it->l,r=it->r;ll v=it->v;s.erase(it);s.insert(node{l,pos-1,v});return s.insert(node{pos,r,v}).first;
}
ll ans=0;
void upd(int l,int r,int x){IT itr=split(r+1),itl=split(l);for(IT it=itl;it!=itr;it++)ans-=1ll*(it->v)*((it->r)-(it->l)+1);ans+=1ll*(r-l+1)*x;s.erase(itl,itr);s.insert(node{l,r,x}); 
}
signed main(){ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);cin>>n>>q;ans=n;s.insert(node{1,n,1});while(q--){int l,r,x;cin>>l>>r>>x;upd(l,r,x-1);cout<<ans<<"\n";}return 0;
}

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

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

相关文章

博客更新公告

来看看博客更新公告吧rt. 公示最新更新或发布的博客, 供大家查阅. 更新日志 Upd 2025.9.18 新随笔 Skywalk -- Words to be remembered 2025.9.18 网址: https://www.cnblogs.com/hsy8116/p/19099273.Upd 2025.9.12 新…

在AI技术快速实现功能的时代,挖掘新需求成为关键突破点——某知名游戏资源分析工具需求洞察

本文基于某知名游戏资源分析工具的文档和用户反馈,深入分析其核心功能和应用场景,并识别出用户提出的潜在新需求,包括纹理自动映射、改进构建方法和增强类型过滤等功能优化方向。a.内容描述核心功能定位:该项目是一…

【光照】[漫反射]UnityURP兰伯特有光照衰减吗?

【从UnityURP开始探索游戏渲染】专栏-直达光照衰减的基本原理 在物理正确的光照模型中,衰减需要遵循两个基本定律:‌平方反比定律‌:光强与距离平方成反比 (I ∝ 1/r) ‌余弦定律‌:表面接收的光强与入射角余弦成正…

手把手带你从零开始实现一个编译器

手把手带你从零开始实现一个编译器https://www.cnblogs.com/abinzhao/p/18748462其实我之前写过关于编译器方面的文章,昨天写了一篇关于通过自制适合自己的JavaScript语法的文章,但是被某个掘友说不懂编译,误人子弟…

prenotami.esteri.it 意大利签证预约error

可以尝试重新登录一下账号,可能会好

绯闻女孩不只会八卦:从“验明正身”到“抓内鬼”,Gossip的进阶玩法

绯闻女孩不只会八卦:从“验明正身”到“抓内鬼”,Gossip的进阶玩法默克尔树 默克尔树(Merkle Tree)是由计算机科学家Ralph Merkle多年前提出,并以他本人的名字来命名,也叫哈希树。默克尔树是一种树形数据结构,通…

reLeetCode 热题 100- 15. 三数之和 - MKT

reLeetCode 热题 100- 15. 三数之和1 排序 2 双指针 位置卡死逐步对着移动 左右2个指针 3 while 跳过重复的数 双指针class Solution { public:vector<vector<int>> my_test1(vector<int>& nums…

US$94 T300 Key Programmer Spanish Blue 2016 V16.8 Full

T300 Key Programmer Spanish 2016 V16.8 Full BlueNotice: 1. It Cant Do Ford, GM and Holden2. In order to make the pacakge easy to pass through customs, we dont take the case into the package to make the…

US$99 VVDI MB NEC Key Adaptor

VVDI MB NEC Key AdaptorNEC Key Adaptor Support Versions:(Without soldering/ Without wire jumper/ Not need other adaptor)Updating support more versionsSupport v51 v57 get password directlySupport normal…

testuserpython

import json import boto3 import flask import psycopg2 from flask import request app = flask.Flask(name) @app.route(/) def route_root(): return flask.jsonify(OK) dynamodb = boto3.client(dynamodb) @app.r…

Python-Pathlib库

Pathlib 是 Python 3.4+ 中引入的面向对象的文件系统路径处理库,提供了比传统 os.path 更直观、更 Pythonic 的方式来处理文件路径和文件系统操作。Python Pathlib 库指南 Pathlib 是 Python 3.4+ 中引入的面向对象的…

反省

我大抵是废了、累了。

US$34 Bluetooth Adapter for Yanhua Mini ACDP

Bluetooth Adapter for Yanhua Mini ACDPPackage List:1pc x Bluetooth Adapter for Yanhua Mini ACDP Pictures of Bluetooth Adapter for Yanhua Mini ACDPBluetooth Adapter for Yanhua Mini ACDP, now only need U…

global 设置内核源码在线浏览

global 设置内核源码在线浏览获取内核源码放到http家目录 /var/www/html/linux-5.10.0-136.12.0.86.x86_64 下载编译global wget https://ftp.gnu.org/gnu/global/global-6.6.tar.gz tar xf global-6.6.tar.gz cd glob…

[Nacos/Docker/MCP] Nacos 3.x : 为 AI MCP 而生

0 序言 : Nacos 3.x 的发布2025年4月28日,Nacos 3.0 正式发布:MCP Registry、安全零信任、链接更多生态升级 MCP Registry,围绕着 MCP 服务管理,MCP 多种类型注册,包含 MCP Server 注册、编排、动态调试和管理,…

牛客周赛 Round 108 CDEF题解

C、小苯的数字合并 题意: 小苯有一个长度为 $ n $ 的数组 $ a_1, a_2, \ldots, a_n $,他可以对 $ a $ 进行任意次“数字合并”操作,具体地,一次数字合并操作描述为:选择一个下标 $ i $ ($ 1 \leq i < |a| $),…

[LeetCode] 3484. Design Spreadsheet

A spreadsheet is a grid with 26 columns (labeled from A to Z) and a given number of rows. Each cell in the spreadsheet can hold an integer value between 0 and 105. Implement the Spreadsheet class: Spre…

Redis的使用问题

1:穿透,访问缓存中没有,数据库中也没有的数据,直接忽略缓存层,直达数据库 解决方案:方案一,查一个不存在的数据时,给一个设置一定过期间的key的数据,存入缓存,方案二:布隆过滤器,在将数据存入Redis时,会同…

AIGC拾遗:Flash Attention

前言 对于attention操作,其计算复杂度随着序列长度的增加呈平方倍的增长。因此,出现了诸多尝试将计算复杂度降低为\(O(n)\)的注意力机制。然而,这些方法忽略了计算时的IO复杂度的影响,频繁的内存交换也在长序列计算…

深度好文-风雨飘摇信竞路

风雨飘摇信竞路 写作时间:2025.9.19夜 1. 引子 夜深了,我捣鼓好了博客园,长舒了一口气。 明天就是 CSP-S 的初赛了,上周老师说可能这次我们没有初赛直升的名额了,把我们搞得都很慌,做了不少卷子。明天早上我还要…