線段樹。
真還就是個線段樹。。
除去操作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 嗎?全部是...