首页 > 其他分享 >珂朵莉树学习笔记

珂朵莉树学习笔记

时间:2024-10-22 14:32:38浏览次数:7  
标签:学习 ch int odt 笔记 朵莉树 split it2 it1

区间操作

\(1.\) \(\left[L,R\right]\) 区间加上一个数

\(2.\) \(\left[L,R\right]\)区间赋值


适用范围

\(1.\) 数据随机 \((因为容易被卡)\)

\(2.\) 有区间赋值操作 \((核心操作不然和暴力没什么区别了)\)

\(3.\) 骗分小技巧


习题

CF896C \((起源)\)

CF915E

P1840

P4979

P4344 \((貌似ODT被卡了....)\)


模板

#include<bits/stdc++.h>
using namespace std;
#define s_it set<node>::iterator
//必须 先左区间 后右区间  s_it it2 = split(r + 1), it1 = split(l);
int n,L,R,m,ans;

struct node{
    int l,r;
    mutable int v;
    node(int a, int b = -1, int c = 0):l(a),r(b),v(c){}
    friend bool operator <(const node &a,const node &b){
		return a.l<b.l;
	}
};
set<node> odt;//初始珂朵莉树

inline int read(){   //快读
    int s = 0, w = 1; char ch = getchar();
    while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar();}

    while(ch >= '0' && ch <= '9') {
        s = (s << 3) + (s << 1) + ch - '0', ch = getchar();
    }
    return s * w;
}

void print(int x){   //快输
    char F[200];
    if(x<0){
        putchar('-');
        x=-x;
    }
    int cnt=0;
    while(x){
        F[cnt++]=x%10+'0';
        x/=10;
    }
        
    while(cnt) putchar(F[--cnt]);
    return ;
}

s_it split(int pos){ //分裂
    s_it it = odt.lower_bound(node(pos));
    if(it!=odt.end()&&it->l==pos){
        return it;
    }
    --it;
    int l = it->l, r = it->r,v=it->v;
    odt.erase(it);
    odt.insert(node(l, pos - 1, v));
    return odt.insert(node(pos, r, v)).first;
}

void assign(int l,int r,int v){//推平区间
    s_it it2 = split(r + 1), it1 = split(l);
    odt.erase(it1,it2);
    odt.insert(node(l, r, v));
    return;
}

void add(int l,int r,int v){//区间加数
    s_it it2 = split(r + 1), it1 = split(l);
    for (s_it it = it1; it != it2;++it){
        it->v += v;
    }
}
void prepare(){
    odt.insert(node(1,n+1,1));
}

void work(int l,int r,int v){
    s_it it2 = split(r + 1), it1 = split(l);
    for (s_it it = it1; it != it2;++it){
        //任务
    }
}

int main(){
    n=read();m=read();
    prepare(); //初始化珂朵莉树
    work(1,1,1);
    return 0;
}

发布时间:2022-04-16 22:55

标签:学习,ch,int,odt,笔记,朵莉树,split,it2,it1
From: https://www.cnblogs.com/xingke233/p/18492671

相关文章

  • 折半搜索学习笔记
    引入\(1.\text{以经典例题引入:}\)有一个长度为n的序列a,任选一些数求能组成的小于m的数的方案数(0不算)\(\quad\text{看完题目第一反应,这不就是裸01背包吗?m为容量}\)\(a_i\text{为价值和体积,轻松AC。}\)\(\quad\text{我们再来看一下数据范围}\n\le40\a_i\le10^9\m\le4*10^......
  • btslab笔记
    本文只涉及漏洞的验证与解题思路不进行安装等基础教学1.vulnerability.injection.sqlinjectionurl:https://172.16.26.44/btslab/vulnerability/ForumPosts.php?id=1第一步:判断注入类型字符型还是数字型:GET/btslab/vulnerability/ForumPosts.php?id=1GET/btslab/vulnera......
  • 第十八课:Python学习之多态
    多态目标多态面向对象三大特性封装根据职责将属性和方法封装到一个抽象的类中定义类的准则继承实现代码的重用,相同的代码不需要重复的编写设计类的技巧子类针对自己特有的需求,编写特定的代码多态不同的子类对象调用相同的父类方法,产生不同的执行......
  • 第十七课:Python学习之单例模式
    单例目标单例设计模式__new__方法Python中的单例01.单例设计模式设计模式设计模式是前人工作的总结和提炼,通常,被人们广泛流传的设计模式都是针对某一特定问题的成熟的解决方案使用设计模式是为了可重用代码、让代码更容易被他人理解、保证代码可靠性单例设......
  • 【开源免费】基于SpringBoot+Vue.JS读书笔记共享平台(JAVA毕业设计)
    本文项目编号T029,文末自助获取源码\color{red}{T029,文末自助获取源码}......
  • 迁移学习与fine-tuning有什么区别
    迁移学习与fine-tuning的区别主要体现在:1.目标不同;2.训练策略不同;3.数据量要求不同;4.应用领域不同;5.模型性能的差异。总的来说,迁移学习是一种将在一个任务上学到的知识应用到另一个任务上的方法,而fine-tuning是迁移学习中的一种策略,通常用于调整预训练模型的参数以适应新的任务。......
  • 学习笔记10.21
    使用AI提示语设计公式、AI优化、Markdown模版、提示语智能体R(角色)T(任务)F(要求)C(说明)公式举例eg:你现在是一位高校大学英语教师,(角色)设计大学英语《XXX》单元的教学计划,(任务)给出教学目标、教学大纲、单元活动安排,教学策略,布置学生作业。(要求)要求按照5E教学策略设计教学活......
  • 苹果笔记本和微软Surface哪个更适合商务使用
    在商务环境中,选择合适的笔记本电脑对于提高工作效率至关重要。本文对苹果笔记本和微软Surface进行比较分析,探讨哪种更适合商务使用。主要考虑因素包括:1.性能和可靠性;2.操作系统与软件兼容性;3.设计与便携性;4.电池续航力;5.价格与性价比;6.售后服务与支持。通过全面的比较分析,可以帮......
  • Java 在 GIS 领域的学习路线?
    1、跨平台性Java具有跨平台的特性,Java在地理信息系统(GIS)领域发挥着重要作用,具体表使现得在不同操作系统上能够一致地运行。这对于GIS应用而言尤为重要,因为GIS在系统常常需要在多种操作系统下运行,以以下满足用户的几不同需个求。2、强大的图形界面和用户体验Java提供丰富的图......
  • 汇编语言学习笔记(一)基础知识
    指令和数据指令和数据是应用上的概念,在内存或磁盘上,两者没有任何区别,都是二进制信息。如同围棋中的棋子,在棋盒里没有任何区别,在对弈的时候才有不同的意义存储单元计算机最小信息单位为Bit,也就是一个二进制位。8个bit组成一个Byte.通常称之为字节1B=8Bit,1KB=1024B,1M=1024......