珂朵莉树学习笔记
今天学了这种抽象的数据结构,发一篇学习笔记(其实是题解)
先上一道题:Physical Education Lessons
题意
给定一个一开始都是
思路
这题正解是动态开点线段树,歪解就是珂朵莉树
其实珂朵莉树就是和分块、莫队一样的优雅的暴力
虽然这题的
所以我们开一个数据结构维护每一个连续的段,而 set
因为有自动排序的特性成为了首选
具体来说,每个段都有三个属性
区间修改成一个数的操作(推平操作)也有三个属性,任然是
注意:切完之后的两个相邻的连续段之间是不重叠的,这一点很重要
再操作
(可能框框长度的比例有点不太对,能理解就行)
再操作
此时虽然第
推平操作的代码十分简单(ans
维护
void update(int l,int r,int val)
{
auto itr=split(r+1);
auto itl=split(l);
for(auto it=itl;it!=itr;it++)
{
ans-=it->val*(it->r-it->l+1);
}
s.erase(itl,itr);
s.insert(node(l,r,val));
ans+=val*(r-l+1);
}
其中 split(pos)
函数就是切分的函数,每次切分会把
split
函数先找到
实现仍然很简单
set<node>::iterator split(int pos)
{
auto it=s.lower_bound(pos);
if(it!=s.end() && it->l==pos)
{
return it;
}
it--;
int l=it->l;
int r=it->r;
bool val=it->val;
s.erase(it);
s.insert(node(l,pos-1,val));
return s.insert(node(pos,r,val)).first;
}
update
第 9 行解释:set
的 erase
有一个用法是 erase(const_iterator __first, const_iterator __last)
,就是左闭右开删除一个区间内的元素。
split
第 14 行解释:set
的 insert
操作有返回值:一个 pair
。这个 pair
的 first
存这个元素的迭代器,second
存此次操作是否成功。
最后每次操作完输出一下 ans
就做完了。
代码
#include <iostream>
#include <set>
using namespace std;
struct node
{
int l,r;
mutable bool val;
node(int ll,int rr=-1,bool vall=false)
{
l=ll;
r=rr;
val=vall;
}
bool operator<(const node b)const
{
return l<b.l;
}
};
int n,q;
set<node> s;
int ans;
set<node>::iterator split(int pos)
{
auto it=s.lower_bound(pos);
if(it!=s.end() && it->l==pos)
{
return it;
}
it--;
int l=it->l;
int r=it->r;
bool val=it->val;
s.erase(it);
s.insert(node(l,pos-1,val));
return s.insert(node(pos,r,val)).first;
}
void update(int l,int r,int val)
{
auto itr=split(r+1);
auto itl=split(l);
for(auto it=itl;it!=itr;it++)
{
ans-=it->val*(it->r-it->l+1);
}
s.erase(itl,itr);
s.insert(node(l,r,val));
ans+=val*(r-l+1);
}
int main()
{
cin>>n>>q;
ans=n;
s.insert(node(1,n,true));
for(int i=1;i<=q;i++)
{
int l,r,k;
cin>>l>>r>>k;
if(k==1)
{
update(l,r,false);
}
else
{
update(l,r,true);
}
cout<<s.size()<<endl;
cout<<ans<<endl;
}
return 0;
}
习题
CF817F MEX Queries(多一种反转操作,暴力查询)
P2572 [SCOI2010] 序列操作(珂朵莉树会被卡掉,不过可以当练习,多了查询连续
CF896C Willem, Chtholly and Seniorious(珂朵莉树的爸爸,操作都是暴力)
总结
珂朵莉树的优点就是大部分操作都可以暴力(很容易想),而且随机数据可以吊打线段树,缺点就是非随机数据容易被卡掉
我永远喜欢珂朵莉(逃
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)