loj2007 SCOI2015 國旗計畫

2021-10-23 06:12:40 字數 1328 閱讀 9663

一道很有意思的貪心+倍增的題目。

首先我們要把環變成鏈(複製一倍放到末尾去)。

這道題有乙個非常巧妙的性質:任意乙個區間都沒有別的被包含(假如這一道題有包含的話就要把被包含的那個區間給去掉)。也就是說把把每乙個士兵的區間左端點從小到大排序後,右端點也是從小到大排好序的。然後我們從貪心的角度思考,對於乙個士兵,接應他的人一定是在能接應到的情況下左端點最大的。

然後就很好做了,考慮一下倍增,nxt

[x][

i]

nxt[x][i]

nxt[x]

[i]表示i士兵以後的第2

i2^i

2i個人。對於每乙個士兵,只需要用log級的時間像lca一樣跳即可。

#include

#include

#include

#include

#include

using

namespace std;

const

int n =

2e5+6;

int n, m, res[n]

;struct node s[n<<1]

;bool

cmp(node p1, node p2)

int nxt[n<<1]

[21];

void

prepare()

for(

int i =

1; i <=

20; i++

)for

(int j =

1; j <=

2* n; j++

) nxt[j]

[i]= nxt[nxt[j]

[i -1]

][i -1]

;}void

solve

(int k)

intmain()

sort

(s +

1, s + n +

1, cmp)

;for

(int i =

1; i <= n; i++

)prepare()

;for

(int i =

1; i <= n; i++

)solve

(i);

for(

int i =

1; i <= n; i++

) cout << res[i]

<<

" ";

return0;

}

Loj2009 SCOI2015 小凸玩密室

仔細觀察以後可以發現,關於電燈有以下幾個性質 1根節點不是1,也就是每個點都可能為根節點,這就意味著不能用o n 2 的做法,只能考慮o nlogn 或者o n 2所有點亮的燈都是連在一起的 3對於乙個已經點亮的點,它的左右子樹只有3種可能 沒有染色,已經全部染完,正在染色 4當你準備將乙個點染色的...

loj 2009 SCOI2015 小凸玩密室

loj 2009.scoi2015 小凸玩密室 樹高不會很高 20 點亮燈泡x,點亮x的乙個子樹,再點亮x另外的子樹,然後回到x的父節點,點亮父節點之後再點亮父節點的其他子樹 所以對於乙個節點x,有這樣兩種情況 x還沒有被點亮,那麼下乙個被點亮的是x的乙個兒子 x是葉子節點,那麼下乙個被點亮的是它的...

SCOI2007 壓縮 題解

給乙個由小寫字母組成的字串,我們可以用一種簡單的方法來壓縮其中的重複資訊。壓縮後的字串除了小寫字母外還可以 但不必 包含大寫字母r與m,其中m標記重複串的開始,r重複從上乙個m 如果當前位置左邊沒有m,則從串的開始算起 開始的解壓結果 稱為緩衝串 bcdcdcdcd可以壓縮為bmcdrr,下面是解壓...