BZOJ3720 Gty的妹子樹

2022-05-11 22:34:45 字數 1913 閱讀 6690

題目:

題解:傳說中的塊狀樹。。。

和鏈剖思想差不多,能塞到父親塊裡的就塞,否則自己新開一塊。

只是比較糾結樹分塊究竟用什麼?如果是樹上莫隊的話好像不能這麼分?

被菊花卡死?

然後我們就每個塊暴力維護資訊。剛開始以為set就行了,到了寫查詢的時候發現尼瑪set是不能維護名次的t_t

還是老老實實寫線性表吧。

塊開sqrt(n*log2n)比sqrt(n)快一倍

**:

1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include

10 #include11 #include

12#define inf 1000000000

13#define maxn 60000+5

14#define maxm 100000+5

15#define eps 1e-10

16#define ll long long

17#define pa pair18

#define for0(i,n) for(int i=0;i<=(n);i++)

19#define for1(i,n) for(int i=1;i<=(n);i++)

20#define for2(i,x,y) for(int i=(x);i<=(y);i++)

21#define for3(i,x,y) for(int i=(x);i>=(y);i--)

22#define for4(i,k,x) for(int i=head[k][x],y=e[k][i].go;i;i=e[k][i].next,y=e[k][i].go)

23#define mod 1000000007

24using

namespace

std;

25 inline int

read()

2629

while(ch>='

0'&&ch<='9')

30return x*f;31}

32struct

rec33

41 inline void modify(int x,int

y)42

48 inline int query(int

x)49

52 }s[10000

];53

int n,m,ans,size,cnt,top[maxn],tot[2],head[2

][maxn],a[maxn],fa[maxn],b[maxn];

54struct edgee[2][2*maxn];

55 inline void add(int k,int x,int

y)56

;head[k][x]=tot[k];58}

59 inline void dfs(int

x)6068}

69 inline void query2(int x,int

w)70

74 inline void query1(int x,int

w)7578}

79int

main()

8085 for1(i,n)a[i]=read();

86 s[b[1]=top[1]=cnt=1].insert(a[1

]);87 size=sqrt(2*n*log2(n));

88 dfs(1

);89 m=read();

90while(m--)

91else

if(op==1

)100

else

104109

}110

return0;

111 }

view code

bzoj3720 Gty的妹子樹

我們可以樹上分塊,詳見我部落格中雜文下的根號演算法題庫 然後每個塊維護降序,對於整一塊在子樹內的就可以二分,其餘部分暴力。include include include include define fo i,a,b for i a i b i using namespace std const i...

BZOJ3720 Gty的妹子樹

如果沒有插入操作,那麼直接對dfs序建立線段樹套平衡樹即可,有插入操作的話,將外層的線段樹換成重量平衡樹即可。一開始寫替罪羊樹套權值線段樹無限mle 所以只好寫替罪羊樹套treap include include includeusing namespace std typedef unsigned...

BZOJ 3720 Gty的妹子樹

bzoj 3720 傳送門 這時考慮在樹上分塊,具體內部的操作和在序列上相同 每次通過判斷父節點塊的大小判斷是否要新開一塊 注意每一塊在樹上都是連續的,這樣在查詢時子樹時保證最後全是整塊 不過由於上一條特性導致遇到菊花圖就將每一塊大小卡到了1 複雜度穩定的演算法其實是對修改操作進行分塊 每 sqrt...