JZOJ6257 省選模擬8 9 修路

2021-09-26 01:29:19 字數 2728 閱讀 3836

有一堆點,每個點都有其權值c

ic_i

ci​。

每次插入邊(u,

v)

(u,v)

(u,v),u

uu和1

11連通,v

vv和1

11不連通。最後保證形成一棵樹。

每次插入的時候詢問1

11到u

uu的路徑上逆序對的個數。然後將1

11到u

uu的路徑上的所有節點的權值設為c

vc_v

cv​.

一看就知道是什麼資料結構題了……

然而剛了很久都不知道怎麼做……

於是就直接打暴力。暴力跳fafa

fa,用樹狀陣列計算逆序對的個數。

後來還有點時間,於是看準了ci≤

2c_i\leq 2

ci​≤

2的資料。

於是打了個樹鏈剖分加線段樹來維護。線段樹上每個區間維護的是個大小為3

33的桶和答案,區間合併的時候就是左右兩邊的答案加上左邊權值大於右邊的個數。

打完了之後急著去吃飯,完全沒有調過……

後來發現這個樹鏈剖分沒有分……倒是覆蓋了我的暴力……原來暴力是可以吃掉ci≤

2c_i\leq 2

ci​≤

2的資料的……

看到正解的時候我也震驚了……

請用腦子模擬一下操作的畫面。

然後試著跟lct

lctlc

t建立聯絡。

於是我們就發現這個操作過程與lct

lctlc

t神似!

每個s pl

ay

splay

spla

y維護權值相同的一條鏈,修改的時候相當於acc

es

saccess

access

上去……

將它到祖先的路徑全部變成同乙個權值。

我們也知道lct

lctlc

t的時間複雜度是均攤lg⁡n

\lg n

lgn的。雖然不會證明。

那麼我們可以理解成出現過的顏色相同的段數是o(n

lg⁡n)

o(n\lg n)

o(nlgn)

級別的。

詢問的時候用樹狀陣列來維護。模擬acc

es

saccess

access

的過程就可以了。

於是這題就非常輕鬆地ac了。而且由於這題完全不需要mro

ot

mroot

mroo

t操作,所以也不用翻轉……

l ct

lctlc

t短得跟樹鏈剖分差不多……

using

namespace std;

#include

#include

#include

#define n 100010

int n;

int c[n]

,maxc;

int*p[n]

;inline

bool

cmpp

(int

*x,int

*y)int t[n]

;#define lowbit(x) ((x)&(-(x)))

inline

void

add(

int x,

int c)

inline

intquery

(int x)

inline

void

clear

(int x)

struct node

inline

bool

getson()

inline

void

rotate()

else

z->c[y-

>

getson()

]=this

;int k=

getson()

; fa=z;

y->c[k]

=c[k^1]

; c[k^1]

->fa=y;

c[k^1]

=y; y-

>fa=

this

; siz=y-

>siz,y-

>

update()

;}inline

void

splay()

rotate()

;}}} d[n]

,*null;

intmain()

*p[i]

=maxc;

} null=d;

*null=

;for

(int i=

1;i<=n;

++i)

d[i]=;

for(

int i=

1;i++i)

printf

("%lld\n"

,ans)

; d[v]

.fa=

&d[u]

;for

(x=&d[v]

,y=null;x!=null;y=x,x=x-

>fa)

y->is_root=c[v];}

return0;

}

在分析複雜度的時候,可以試著結合自己學過的資料結構……

JZOJ6258 省選模擬8 9 轟炸

給你一棵樹和樹上的許多條從後代到祖先的鏈,選擇每條鏈需要一定代價,問覆蓋整棵樹的所有點的最小代價是多少。n m 100000 n,m leq 100000 n,m 10 0000 由於時間過於久遠,所以直接說正解算了 對於這樣的題,顯然有一種暴力的dp做法。設f i,jf fi,j 表示i ii子樹...

JZOJ6258 省選模擬8 9 轟炸

給你一棵樹和樹上的許多條從後代到祖先的鏈,選擇每條鏈需要一定代價,問覆蓋整棵樹的所有點的最小代價是多少。n,m leq 100000 由於時間過於久遠,所以直接說正解算了 對於這樣的題,顯然有一種暴力的dp做法。設 f 表示 i 子樹全部被覆蓋,其中伸出來的一條鏈到達深度為 j 的祖先時的最小代價。...

JZOJ 省選模擬 string

一行乙個整數表示答案。sample input 樣例輸入 3 3sample output 樣例輸出 首先我們忽略重複的字串,定義 n 表示長度為 n 的回文串,或由兩個回文串拼成的字串數量。那麼可以通過列舉第乙個回文串的長度 可以為 0 可以算出f n 但是正如剛才所說,會對如 abaaba 這樣...