題目:
題解:傳說中的塊狀樹。。。
和鏈剖思想差不多,能塞到父親塊裡的就塞,否則自己新開一塊。
只是比較糾結樹分塊究竟用什麼?如果是樹上莫隊的話好像不能這麼分?
被菊花卡死?
然後我們就每個塊暴力維護資訊。剛開始以為set就行了,到了寫查詢的時候發現尼瑪set是不能維護名次的t_t
還是老老實實寫線性表吧。
塊開sqrt(n*log2n)比sqrt(n)快一倍
**:
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #includeview code10 #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 }
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...