bzoj_1493_[noi2007]項鍊工廠_splay
t公司是一家專門生產彩色珠子項鍊的公司,其生產的項鍊設計新穎、款式多樣、**適中,廣受青年人的喜愛。
最近t公司打算推出一款項鍊自助生產系統,使用該系統顧客可以自行設計心目中的美麗項鍊。該項鍊自助生產系
統包括硬體系統與軟體系統,軟體系統與使用者進行互動並控制硬體系統,硬體系統接受軟體系統的命令生產指定的
項鍊。該系統的硬體系統已經完成,而軟體系統尚未開發,t公司的人找到了正在參加全國資訊學競賽的你,你能
幫助t公司編寫乙個軟體模擬系統嗎?一條項鍊包含 n 個珠子,每個珠子的顏色是 1,2,…,c 中的一種。項鍊
被固定在乙個平板上,平板的某個位置被標記位置 1 ,按順時針方向其他位置被記為 2,3,…,n。
你將要編寫的軟體系統應支援如下命令:
輸入檔案第一行包含兩個整數 n,c ,分別表示項鍊包含的珠子數目以及顏色數目。
第二行包含 n 個整數,x1,x2,…,xn ,表示從位置 1 到位置 n 的珠子的顏色,1≤xi≤c 。
第三行包含乙個整數 q ,表示命令數目。接下來的 q 行每行一條命令,如上文所述。n≤500000 ,q≤500000,c≤1000
對於每乙個 c 和 cs 命令,應輸出乙個整數代表相應的答案。
5 31 2 3 2 14c
r 2p 5 5 2
cs 4 141
注意旋轉命令旋轉「珠子」但不改變「位置」的編號,而反轉命令始終以位置 1 為對稱軸。例如當 n=10 時,項
鏈上的位置編號如圖1:
線段樹處理翻轉標記不太會,直接上splay模擬。
每個節點額外維護左端的顏色,右端的顏色,區間的顏色段數。
r操作可以對整個序列進行3次區間翻轉。
f操作對[2,n]執行區間翻轉。
s操作兩次單點修改。
p操作區間賦值。
c操作和cs操作直接查詢區間再把重複的減掉即可。
注意0號結點不能拿來更新別的節點的值。
**:
#include #include #include using namespace std;#define rr register
int check[500];
void init()
inline char nc()
inline int rd()
inline char rc()
#define n 500050
#define ls ch[p][0]
#define rs ch[p][1]
#define get(x) (ch[f[x]][1]==x)
int f[n],ch[n][2],val[n],cover[n],la[n],ra[n],as[n],rt,siz[n],rev[n],n,a[n];
void pushup(int p)
void pushdown(int p)
if(cover[p])
}void rotate(int x)
void splay(int x,int y)
int find(int x) }}
void reverse(int x,int p)
void print()
}void build(int fa,int l,int r)
int get_ans(int x,int p)
void cover_col(int x,int y,int c)
if(x==y) return ;
int cx=val[find(x+1)],cy=val[find(y+1)];
cover_col(x,x,cy); cover_col(y,y,cx);
}int main() else if(opt[0]=='f') else if(opt[0]=='s') else if(opt[0]=='p') else
//print();
}else if(opt[0]=='c') else
}else
} }}
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 嗎?全部是...