2019 08 05測試 T2 尺樹寸泓

2021-09-25 22:02:26 字數 2127 閱讀 1928

傳送門

資料範圍:點數 n

nn 和運算元 q

qq 滿足 1≤n

,q≤2

×105

1≤n,q≤2×10^5

1≤n,q≤

2×10

5。旋轉操作會導致乙個問題,即樹的 dfs

dfsdf

s 序會有變化,所以用 dfs

dfsdf

s 序維護會使子樹資訊維護比較麻煩。但是我們注意到這是一棵平衡樹,它的中序遍歷是確定的,那麼我們考慮用中序遍歷來維護資訊。

於是我們可以把中序遍歷搞出來,然後維護每個點的子樹對應的區間。

一次旋轉操作只會影響 2

22 個點的子樹區間的更改。可以根據左旋還是右旋討論出來。

由於中序遍歷序不變,只要用乙個線段樹維護就可以了。

然後就只剩下單點修改、區間求積了。複雜度 o(n

log⁡n)

o(n \log n)

o(nlogn)

。具體的實現可以看**。

#include

#include

#include

#define n 200005

#define p 1000000007

using

namespace std;

int n,q,tot;

int val[n]

,son[n][2

],fa[n]

;int

add(

int x,

int y)

intdec

(int x,

int y)

intmul

(int x,

int y)

int pos[n]

,idx[n]

,in[n]

,out[n]

,size[n]

;void

dfs(

int x)

int mul[n<<2]

;void

build

(int root,

int l,

int r)

int mid=

(l+r)

>>1;

build

(root<<

1,l,mid)

,build

(root<<1|

1,mid+

1,r)

; mul[root]

=mul

(mul[root<<1]

,mul[root<<1|

1]);

}void

modify

(int root,

int l,

int r,

int pos,

int x)

int mid=

(l+r)

>>1;

if(pos<=mid)

modify

(root<<

1,l,mid,pos,x)

;else

modify

(root<<1|

1,mid+

1,r,pos,x)

; mul[root]

=mul

(mul[root<<1]

,mul[root<<1|

1]);

}int

query

(int root,

int l,

int r,

int x,

int y)

intget

(int x)

void

update

(int x)

void

rotate

(int x)

intmain()

dfs(1)

,build(1

,1,n);

int op,x;

for(

int i=

1;i<=q;

++i)

}return0;

}

5 11返校測試T2

有k k第一行乙個整數n。第二行有n個正整數,每個數字代表一張選票所選的人的編號。每行乙個正整數,為優勝者的編號,由小到大。如果沒人獲勝,則輸出 no such person.8 5 2 3 6 2 5 2 72優勝者為2號。下面是這個題的思路qwq 將所有的選票進行從小到大排序 快排解決 然後將陣...

2018 10 27測試T2 洗衣服

傳送門 一道貪心題,但考場上沒貪出來 維護兩個堆,分別存洗衣服和烘乾衣服的時間 每次加進來一件衣服,就在之前最早結束的那一台機器裡操作,這樣會是最優的 洗衣服和烘乾衣服都這樣搞,最後再用最大配最小的原則求最大值就行了 include include include include define n ...

2018 11 02測試T2 飛越行星帶

傳送門 這道題比較妙啊 把每個行星看成乙個點 把 x xx 軸和 y l y ly l 看成兩個特殊的點 把行星之間的距離看做邊 每個點與 x xx 軸的邊為 y iy i yi 與 y l y ly l 的邊為 l y il y i l yi 從小到達加邊,如果發現 x xx 軸和 y l y l...