BZOJ1493 NOI2007 項鍊工廠

2021-07-10 16:26:55 字數 1564 閱讀 4123

原題位址

又是一道資料結構神題,卡了一晚上…

寫一下其中幾個寫搓的地方:

1.update()時要clear()左右子樹

2.查詢完之後要記得把樹merge()回去

3.交換操作那裡,若i,j相等則直接退出,要不然會出錯

4.染色\查詢操作l<=r和l>r時split()的範圍不同

update:split()函式裡是不需要用到merge()的!這樣就可以實現空間o(n lg n)的可持久化了.以後都要按新的寫法來寫.

ac code:

#include 

#include

#include

const int n=1000010;

int n,c,q,tot;

int a[n];

struct nod*nil,pool[n];

struct treap

nod* newnod(int c)

void update(nod *p)

if(p->ch[1]!=nil)

}void clear(nod *p)

if(p->tag)

}nod* merge(nod *p1,nod *p2)

p1->ch[1]=merge(p1->ch[1],p2);

update(p1);

return p1;

}void split(nod *p,nod *&p1,nod *&p2,int k)

if(p->ch[0]->siz+1

<=k)

else

}void work1(int k)

void work2()

void work3(int l,int r)

nod *p1,*p2,*p3,*p4,*p5,*p6,*p7,*p8;

split(root,p1,p6,l-1);

split(p6,p2,p7,1);

split(p7,p3,p8,r-l-1);

split(p8,p4,p5,1);

root=merge(p1,merge(p4,merge(p3,merge(p2,p5))));

}void work4(int l,int r,int k)

else

root=merge(p1,merge(p2,p3));

}int work5()

int work6(int l,int r)

else

root=merge(p1,merge(p2,p3));

return ans;

}};int main()

else

if(s[0]=='f') t.work2();

else

if(s[0]=='s')

else

if(s[0]=='p')

else

if(s[0]=='c'&&s[1]=='\0') printf("%d\n",t.work5());

else

}return

0;}

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 嗎?全部是...

BZOJ 1493 NOI2007 項鍊工廠

bzoj 1493 noi2007 項鍊工廠 splay t公司是一家專門生產彩色珠子項鍊的公司,其生產的項鍊設計新穎 款式多樣 適中,廣受青年人的喜愛。最近t公司打算推出一款項鍊自助生產系統,使用該系統顧客可以自行設計心目中的美麗項鍊。該項鍊自助生產系 統包括硬體系統與軟體系統,軟體系統與使用者進...