傳送門
資料範圍:點數 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
logn)
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...