1493 NOI2007 項鍊工廠

2022-08-13 11:15:18 字數 1467 閱讀 3092

線段樹。

真還就是個線段樹。。

除去操作1,2的話,線段樹很容易就處理了,問題在於如何處理操作1和2。(這點沒想到)。。

我們用乙個delta維護操作1,如果沒有旋轉就+k,不然就-k。

每次讀入i和j的時候用trans處理一下,就成功在o(1)的時間解決了操作1和2。

細節很重要。

#include#include

#include

using

namespace

std;

const

int maxn = 2000000 + 10

;struct

node ;

struct

segtree

else

x=x?x:n;

y=y?y:n;

}void push(int

x)

node update(node a,node b)

void update(int

x)

void build(int x,int l,int

r)

int mid=(l+r)>>1

; build(lc(x),l,mid);

build(rc(x),mid+1

,r);

update(x);

}void color(int x,int l,int r,int

v) push(x);

color(lc(x),l,r,v);

color(rc(x),l,r,v);

update(x);

}node query(

int x,int l,int

r)

void paws(int i,int

j)

else

color(

1,i,i,cj);

color(

1,j,j,ci);

}void

rotate()

void paint(int i,int j,int

v) }

void

c1()

void c2(int i,int

j)

void

init()

}seg;

char op[20

];int

k,i,j,x,q;

intmain()

else

if(op[0]=='p'

)

else

if(op[0]=='

c' && op[1]=='s'

)

else

seg.c1();

}return0;

}

BZOJ1493 NOI2007 項鍊工廠

原題位址 又是一道資料結構神題,卡了一晚上 寫一下其中幾個寫搓的地方 1.update 時要clear 左右子樹 2.查詢完之後要記得把樹merge 回去 3.交換操作那裡,若i,j相等則直接退出,要不然會出錯 4.染色 查詢操作l r和l r時split 的範圍不同 update split 函式...

bzoj1493 NOI2007 項鍊工廠

維護全域性移動量什麼的後可以上線段樹。思維難度低一點的做法是直接splay。適合我這種腦殘選手 f操作就是把2 n翻轉。r操作就是把後面k個元素插到最前面來。維護顏色段是老套路了。比較坑的是。多加倆邊界節點的話,需要考慮有沒有可能對答案造成影響。然而邊界節點不可能在合併子區間的時候造成干擾。而且p操...

BZOJ1493 NOI2007 項鍊工廠

bzoj luogu 這才叫一眼題不接受任何形式的反駁。對於前兩種操作,肯定是維護全域性是否被翻轉,以及全域性順時針旋轉了多少。後面的都是線段樹基本操作。記得如果存在 rev 標記,在讀入了 x,y 之後要把它們 swap 最後一種操作,答案就是t 1 num t 1 lc t 1 rc 嗎?全部是...