bzoj1493 NOI2007 項鍊工廠 線段樹

2022-05-07 10:03:08 字數 2670 閱讀 9114

1493: [noi2007]項鍊工廠time limit: 30 sec  memory limit: 64 mb

submit: 1712  solved: 723

[submit][status][discuss] description

t公司是一家專門生產彩色珠子項鍊的公司,其生產的項鍊設計新穎、款式多樣、**適中,廣受青年人的喜愛。

最近t公司打算推出一款項鍊自助生產系統,使用該系統顧客可以自行設計心目中的美麗項鍊。該項鍊自助生產系

統包括硬體系統與軟體系統,軟體系統與使用者進行互動並控制硬體系統,硬體系統接受軟體系統的命令生產指定的

項鍊。該系統的硬體系統已經完成,而軟體系統尚未開發,t公司的人找到了正在參加全國資訊學競賽的你,你能

幫助t公司編寫乙個軟體模擬系統嗎?一條項鍊包含 n 個珠子,每個珠子的顏色是 1,2,…,c 中的一種。項鍊

被固定在乙個平板上,平板的某個位置被標記位置 1 ,按順時針方向其他位置被記為 2,3,…,n。

你將要編寫的軟體系統應支援如下命令:

input

輸入檔案第一行包含兩個整數 n,c ,分別表示項鍊包含的珠子數目以及顏色數目。

第二行包含 n 個整數,x1,x2,…,xn ,表示從位置 1 到位置 n 的珠子的顏色,1≤xi≤c 。

第三行包含乙個整數 q ,表示命令數目。接下來的 q 行每行一條命令,如上文所述。n≤500000 ,q≤500000,c≤1000 

output

對於每乙個 c 和 cs 命令,應輸出乙個整數代表相應的答案。

sample input

5 31 2 3 2 14c

r 2p 5 5 2

cs 4 1

sample output41

hint

注意旋轉命令旋轉「珠子」但不改變「位置」的編號,而反轉命令始終以位置 1 為對稱軸。例如當 n=10 時,項

鏈上的位置編號如圖1:

但注意此時項鍊上的位置編號仍然如圖1所示,於是翻轉的對稱軸不變。因而再執行一次「f」命令時,項鍊的顏色

如圖4所示。

2. 關於countsegment命令cs命令表示查詢乙個「線段」中有多少個「部分」。尤其注意當查詢的長度

等於 n 時,我們仍然將查詢部分作為「線段」理解。例如在圖4所示的情況中,執行「cs 1 10」命令,查詢從位

置 1 開始到位置 10 結束的這個長度為 10 的線段中有多少個「部分」,於是得到返回值 3 。與之形成對照的是

,若執行「c」命令,返回值則為 2

source

可以注意到不管項鍊怎麼變,它上面顏色的相對位置不變,所以只要開全域性變數記錄變化就好

維護線段樹,常規區間操作,注意合併

全域性變數維護位置看

#include#include

#include

#include

#define ls u<<1

#define rs ls|1

#define ll long long

#define n 500050

using

namespace

std;

intn,m,rev,mov,a[n];

struct

node;

}t[n

<<2

];void

get(int &x,int &y)

x-=mov;y-=mov;

if(x<=0)x+=n;if(x>n)x-=n;

if(y<=0)y+=n;if(y>n)y-=n;

}node merge(node x,node y)

void pushdown(int

u)void build(int u,int l,int

r)

int mid=l+r>>1

; build(ls,l,mid);

build(rs,mid+1

,r);

t[u]=merge(t[ls],t[rs]);

}void update(int u,int l,int r,int l,int r,int

val)

pushdown(u);

int mid=l+r>>1

;

if(l<=mid)update(ls,l,mid,l,r,val);

if(r>mid)update(rs,mid+1

,r,l,r,val);

t[u]=merge(t[ls],t[rs]);

}node query(

int u,int l,int r,int l,int

r)int

main()

else

if(s[0]=='

f')rev^=1

;

else

if(s[0]=='s'

)

else

if(s[0]=='p'

) }

else

if(s[0]=='

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

) }

else

//printf("%d %d %d %d\n",mov,rev,x,y);

}

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