QOJ.ac

QOJ

Límite de tiempo: 2 s Límite de memoria: 16 MB - 512 MB Puntuación total: 100

#10357. 被操縱的線段樹

Estadísticas

WWT 大爺是一位魔法師,最近他盯上了 OI 中的線段樹這個資料結構,並且正在對它進行改造。

在普通的線段樹當中,對於一個區間 $[l,r]$,我們會選擇 $mid= \lfloor \frac{l+r}{2} \rfloor$,將該區間分成 $[l,mid],[mid+1,r]$。它們在樹上則對應的節點是原區間對應節點的左右兒子。

魔法師 WWT 使用了高位魔法將此規則打破,在他的線段樹裡,他可以自己選擇 $mid$ 的值(但 $mid$ 依然滿足 $l \leq mid < r$),以至於使得線段樹的深度超過原來的限制 $O(\log n)$,以及區間定位時間複雜度超過原來的限制 $O(\log n)$。但其餘條件基本同原 OI 中的線段樹。

如下圖,是一棵 $mid$ 任意的線段樹:

    *什麼是區間定位:
    用最少的線段樹上節點表示的線段去擬合這個區間,使得每個單位長度有且僅在這些線段中出現一次。
    如上面這棵線段樹,線段[2,5]的區間定位是[2,3],[4,4],[5,5],共三個。
    我們也不難證明這樣的區間定位是唯一的。

魔法師 WWT 不僅使用了高位魔法打破了線段樹的基本法,還使用了一些禁忌魔法修改了這個線段樹的結構。他將指定樹中的某個子結構進行左旋或者右旋的操作。如下圖所示:

    不難發現該旋轉規則同Splay的旋轉模式類似。
    ①子樹A,B,C不會產生任何變化。
    ②子樹A,B,C及節點X,Y之間的相對位置會發生改變。
    ③節點X,Y的區間刻度會發生改變。

魔法師 WWT 會給你一棵 $mid$ 值任意的線段樹,在對這棵樹的某些節點進行旋轉的同時,詢問你某個區間在當前線段樹上的區間定位個數。

WWT 覺得這樣一道題還不能足以體現他高超的魔法水平,於是他又對某些資料進行了加密,使選手們的演算法強制在線。

輸入格式

第一行包括三個整數 $N,Q,type$,分別代表線段樹的寬度,操作個數,以及該資料是否加密。若 $type=0$,表示這個資料沒有進行加密,若 $type=1$,表示這個資料進行了加密。

以下 $N-1$ 行以先序遍歷(深度優先順序)描述一棵線段樹,每行一個正整數表示當前非葉子節點的 $mid$,保證每個節點 $l \leq mid < r$。同時,我們將所有非葉子節點按照先序遍歷標號,從 $1$ ~ $N-1$。

    讀入時建議選手直接採用遞迴,走到葉子節點時回溯即可,所以一共N-1個mid,而且保證1~N-1各出現一次。

此後 $Q$ 行每行代表一個操作。

每行的第一個整數 $tp$,代表該操作的類型:

若 $tp=0$,則代表一個修改操作,該行還包括一個正整數 $x'$,記 $lastans$ 為上一次詢問的答案,若之前沒有詢問操作,則 $lastans=0$,我們定義 $x=x' \oplus (type \times lastans)$。$x$ 表示該旋轉操作的兒子節點編號,你需要以 $x$ 以及 $x$ 的父親節點為軸進行一次旋轉操作,若 $x$ 是它父親的左兒子則進行一次右旋,若 $x$ 是它父親的右兒子則進行一次左旋。WWT 對自己的魔法過於自信,以至於有時他給的非葉子結點 $x$ 是當前線段樹的根的編號,這是一個非法的修改操作,此時你需要輸出一行 "BAD!",並且不對當前的線段樹進行任何操作

若 $tp=1$,則代表一個詢問操作,該行還包括兩個正整數 $l',r'$,記 $lastans$ 為上一次詢問的答案,若之前沒有詢問操作,則 $lastans=0$,我們依次定義 $l=l' \oplus (type \times lastans),r=r' \oplus (type \times lastans)$。則 $[l,r]$ 表示該詢問操作中的詢問區間,對於每次詢問,你需要給出在當前線段樹上該區間的區間定位個數。

輸出格式

輸出包括若干行: 對於一個非法的修改操作,輸出一行 "BAD!"; 對於一個詢問操作,輸出一個正整數,表示答案。

    對於一個合法的修改操作不需要輸出。

範例

範例輸入 1

7 12 1
4
3
1
2
5
6
1 3 6
1 6 3
1 1 5
0 7
1 7 2
1 6 3
1 0 4
0 0
1 0 5
1 6 3
1 3 7
0 0

範例輸出 1

4
3
4
4
2
3
4
1
3
BAD!

說明

範例解密之後:

7 12 0
4
3
1
2
5
6
1 3 6
1 2 7
1 2 6
0 3
1 3 6
1 2 7
1 2 6
0 3
1 3 6
1 2 7
1 2 6
0 3

線段樹初始形狀如下:

$1:[3,6]$ 的區間定位是 $[3,3],[4,4],[5,5],[6,6]$,共 $4$ 個。

$2:[2,7]$ 的區間定位是 $[2,3],[4,4],[5,7]$,共 $3$ 個。

$3:[2,6]$ 的區間定位是 $[2,3],[4,4],[5,5],[6,6]$,共 $4$ 個。

$4:$ 以 3 及其父親 2 為軸進行右旋,右旋後形狀如下。

$5:[3,6]$ 的區間定位是 $[3,3],[4,4],[5,5],[6,6]$,共 $4$ 個。

$6:[2,7]$ 的區間定位是 $[2,4],[5,7]$,共 $2$ 個。

$7:[2,6]$ 的區間定位是 $[2,4],[5,5],[6,6]$,共 $3$ 個。

$8:$ 以 3 及其父親 1 為軸進行右旋,右旋後形狀如下。

$9:[3,6]$ 的區間定位是 $[3,3],[4,4],[5,5],[6,6]$,共 $4$ 個。

$10:[2,7]$ 的區間定位是 $[2,4],[5,7]$,共 $2$ 個。

$11:[2,6]$ 的區間定位是 $[2,4],[5,5],[6,6]$,共 $3$ 個。

$12:$ 3 號點已經是當前的根,非法的修改操作,輸出“BAD!"。

資料範圍

在所有的資料中,對於解密後的 $l,r,x$,滿足 $1 \leq l \leq r \leq N, 1 \leq x \leq N-1$。

測試點編號 $N$ 的大小不超過 $Q$ 的大小不超過 $Type$ 的值 是否有修改操作 空間限制
1 1000 1000 0 512MB
2 1
3 0
4 1
5 200000 200000 0 512MB
6
7
8
9 1
10
11
12 0 512MB
13 64MB
14 16MB
15 1 512MB
16
17 64MB
18
19 16MB
20

Discussions

About Discussions

The discussion section is only for posting: General Discussions (problem-solving strategies, alternative approaches), and Off-topic conversations.

This is NOT for reporting issues! If you want to report bugs or errors, please use the Issues section below.

Open Discussions 0
No discussions in this category.

Issues

About Issues

If you find any issues with the problem (statement, scoring, time/memory limits, test cases, etc.), you may submit an issue here. A problem moderator will review your issue.

Guidelines:

  1. This is not a place to publish discussions, editorials, or requests to debug your code. Issues are only visible to you and problem moderators.
  2. Do not submit duplicated issues.
  3. Issues must be filed in English or Chinese only.
Active Issues 0
No issues in this category.
Closed/Resolved Issues 0
No issues in this category.