一道很有意思的貪心+倍增的題目。
首先我們要把環變成鏈(複製一倍放到末尾去)。
這道題有乙個非常巧妙的性質:任意乙個區間都沒有別的被包含(假如這一道題有包含的話就要把被包含的那個區間給去掉)。也就是說把把每乙個士兵的區間左端點從小到大排序後,右端點也是從小到大排好序的。然後我們從貪心的角度思考,對於乙個士兵,接應他的人一定是在能接應到的情況下左端點最大的。
然後就很好做了,考慮一下倍增,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,下面是解壓...