珂朵莉樹學習筆記

2022-04-28 20:00:09 字數 2371 閱讀 3912

珂朵莉樹是一種基於$set$的暴力資料結構,真的很好懂(因為暴力鴨).又叫$old\ driver\ tree$,老司機樹$???$

適用於區間賦值,資料隨機.

首先來講講它的思想,它把區間$[1,n]$分成若干個$[l_i,r_i]$,$[l_i,r_i]$內的數都一樣,為$w_i$.舉栗子!區間$[1,5]$的初值為$1$.現在只有乙個區間就是$[1,5],w=1$.然後要求把$[2,4]$區間賦為$2$,於是把區間$[1,5]$拆成$[1,1],[2,4],[5,5]$,再把區間$[2,4]$的$w$賦為$2$.差不多就是這樣真的很好懂鴨.下面講$code$.

定義$ovo$

struct

node

//賦初值

inline bool

operator

setq;

核心操作$assign$

就是把$[l,r]$區間賦值為$w$.

#define it set::iteratorinline 

void assign(int l,int r,int

w)

首先把包含$l,r$的迭代器拆成分別兩個部分$[ ,l-1],[l, ],[ ,r],[r+1, ]$,然後把區間$[l,r]$間的全部去掉,最後$insert$新的區間就$ok$辣.再講兩個細節.

1.必須要先$split(r+1)$,再$split(l)$.因為如果反過來$split(l)$返回的迭代器可能失效導致$ce$.舉個栗子,當前$l,r$都包含在$[l,r]$中,首先$split(l)$,變成$[l,l-1],[l,r]$,返回的迭代器是$[l,r]$的.然後$split(r+1)$,又會把$[l,r]erase$掉...

2.$$中的$erase$函式.$q.erase(l,r)$清除掉的是$[l,r)$,是左閉右開!!這裡的$r$是$l_i=r+1$的迭代器,所以清除掉的正好是$[l,r]$之間所有的.

核心操作$split$

inline it split(int

p)

這裡只要解釋一下最後一句的意思辣.$q.insert(...).first$就是插入新元素後新元素的迭代器,這時候就會想有$first$,那也有$second$叭.沒錯!$second$的意思呢就是插入成功了沒有.什麼時候插入不成功?當$set$裡已經有了這個元素時就不能在插入一樣的了.($set$中元素不重)

對了,這裡是我參考的優秀清楚的$blog$

$over!$

$luogu2572\ [scoi2010]$序列操作

唯一要注意的是$4$操作,最多有多少個連續的$1$,可能$[l_1,r_1],[l_2,r_2],l_2=r_1+1$這兩個區間都$w=1$,可以連續起來.千萬不能列舉區間,然後直接取$ret=max(ret,i->r-i->l+1)$,要考慮能否和前面的區間連起來.

#include#define il inline

#define rg register

#define go(i,a,b) for(rg int i=a;i<=b;i++)

#define yes(i,a,b) for(rg int i=a;i>=b;i--)

#define it set::iterator

#define db double

using

namespace

std;

il int

read()

while(c>='

0'&&c<='9')

return x*y;

}const

int n=1e5+10

;int

n,m;

struct

node

inline

bool

operator

};set

q;inline it split(

intp)

inline

void assign(int l,int r,int

w)il

void sol1(int l,intr)}

il int sol2(int l,int

r)

return

ret;

}il

int sol3(int l,int

r)

return

ret;

}int

main()

}else

}//print();

go(i,1

,m)

return0;

}

view code

$cf343d\ water\ tree$

珂朵莉的約數

珂朵莉給你乙個長為n的序列,有m次查詢 每次查詢給兩個數l,r 設s為區間 l,r 內所有數的乘積 求s的約數個數mod 1000000007 輸入描述 第一行兩個正整數n,m 第二行乙個長為n的序列 之後m行每行兩個數l和r 輸出描述 對於每個詢問,輸出乙個整數表示答案 示例1輸入 複製5564 ...

校門外的樹 珂朵莉樹

題目描述 某校大門外長度為l的馬路上有一排樹,每兩棵相鄰的樹之間的間隔都是11公尺。我們可以把馬路看成乙個數軸,馬路的一端在數軸00的位置,另一端在ll的位置 數軸上的每個整數點,即0,1,2,l0,1,2,l,都種有一棵樹。由於馬路上有一些區域要用來建地鐵。這些區域用它們在數軸上的起始點和終止點表...

CodeForces 896C 珂朵莉樹

傳送門 用set搞的比較神奇的樹吧,玄學時間複雜度,簡潔好寫,無聊學了用來水題再好不過了 include include include include include include include include include include include include define x ...