圓方樹上塊狀果,點分樹下你和我,虛樹下面做遊戲,仙人掌上歡樂多
這道題題目很長
大概說的是:
要求你寫出乙個資料結構,維護一顆帶點權的樹,茲瓷:
~~ 1. 單點修改點權
2. 查詢子樹內點權大於x的點的個數
3. 新給出乙個點,並將這個點與已有點做link
~~似乎以前學過的任何資料結構都不能做這麼奇怪的事情呢
我們的塊狀樹就閃亮登場啦
我們對一棵樹進行分塊
然後就可以用vector維護了
我們大概可以把vector封裝成這樣的東西
struct block_chain
inline
void ordered()
inline
int size()
inline
void insert(int x)
inline
void modify(int x,int y)
inline
void print()
inline
int solve(int x)
inline
void order_insert(int x)
};
這就是乙個非常好用的容器了
那我們如何分塊呢?
我們將每block個點放在乙個塊鏈裡。
並且將這些塊鏈連成一棵新的樹
易知乙個點的子樹裡所有的點要不是和根在同一塊裡,要不就是其所在塊整塊都在子樹中
void build_block(int u,int father)
else
fa[u]=father;
for(register int i=head[u];i;i=e[i].nxxt)
}
這樣就可以重建一顆塊狀樹了
查詢時分情況討論
如果在同乙個塊裡,則暴力乙個乙個查詢
如果不在乙個塊裡,就整塊查詢
link時原圖link,塊狀樹也要link
貼**
#include
#include
#include
#include
#include
#include
#include
using
namespace
std;
const
int maxn=60010;
#define fastcall __attribute__((optimize("-o3")))
#define il __inline__ __attribute__((always_inline))
fastcall il char nc()
template
fastcall il void read(t &x)
while(isdigit(c))s=(s<<3)+(s<<1)+c-'0',c=nc();
x=s*w;
}inline
void write(int x)
struct edge
e[maxn<<2],blo[maxn<<2];
struct block_chain
inline
void ordered()
inline
int size()
inline
void insert(int x)
inline
void modify(int x,int y)
inline
void print()
inline
int solve(int x)
inline
void order_insert(int x)
}a[maxn];
int head[maxn],cnt,blo_head[maxn],blo_cnt,belong[maxn],a[maxn],fa[maxn],block,now;
int n,m,opt;
inline
void add(int x,int y)
inline
void blo_add(int x,int y)
inline
void update(int u,int x)
void build_block(int u,int father)
else
fa[u]=father;
for(register
int i=head[u];i;i=e[i].nxxt)
}int block_query(int u,int x)
int solve(int u,int x)
return ans;
}int lastans;
int main()
for(register
int i=1;i<=n;i++)read(a[i]);
read(m);
block=ceil(sqrt(n+m));
build_block(1,0);
for(register
int i=1;i<=now;i++)a[i].ordered();
while(m--)
}}
效率還行
luogu需要吸氧才能ac
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...
BZOJ3720 Gty的妹子樹
題目 題解 傳說中的塊狀樹。和鏈剖思想差不多,能塞到父親塊裡的就塞,否則自己新開一塊。只是比較糾結樹分塊究竟用什麼?如果是樹上莫隊的話好像不能這麼分?被菊花卡死?然後我們就每個塊暴力維護資訊。剛開始以為set就行了,到了寫查詢的時候發現尼瑪set是不能維護名次的t t 還是老老實實寫線性表吧。塊開s...