題意:
多次查詢乙個樹鏈上的中位數(其實就是求k大)。
分析:
感覺莫隊可做,只是不會樹上莫隊。。
而且這裡是邊權,處理起來貌似有點小麻煩。。
後來發現其實貌似是乙個很老的題,,kuangbin模板書上有類似的題。
樹鏈上的第k大數,這是一道可以用主席樹解的題,複雜度才nlogn。
這裡也是這樣先求從根到每個點的線段樹,以為樹存在父子關係,所有可以從讓下層繼承上層的線段樹,非常符合主席樹的可持久化思想。
然後在查詢第k大的時候,去掉重複部分,就可以查了。
太強了,,,
**:
1 #include 2 #include 3 #include 4 #include 5 #include 6 #include7 #include 8 #include 9 #include 10 #include 11 #include 12 #include
13 #include 14 #include 15
16using
namespace
std;
1718 typedef long
long
ll;19 typedef unsigned long
long
ull;
20#define inf (0x3f3f3f3f)
21#define lnf (0x3f3f3f3f3f3f3f3f)
22#define eps (1e-8)
23int sgn(double
a) 26
27int
n, q;
28const
int maxn = 50010;29
const
int m = 100001;30
struct
node ;
3334 vectorg[maxn];
35const
int deg = 16;36
intfa[maxn][deg];
37int
deg[maxn];
3839
void addedge(int u, int v, int
w) 48
49void bfs(int
root)
60for(int i = 0; i < (int)g[tmp].size(); i++) 67}
68}6970
int lca(int u, int
v) 75
if(u == v)return
u;76
for(int i = deg - 1; i >= 0; i--) 81}
82return fa[u][0
];83}84
8586
8788
int t[maxn], lson[maxn * 30], rson[maxn * 30
];89
int c[maxn * 30
];90
int tot = 0;91
92int build(int l, int
r) 100
return
root;
101}
102103
104int update(int root, int pos, int
val) else
123 c[newroot] = c[root] +val;
124}
125return
tmp;
126}
127128
int query(int u_root, int v_root, int fa_root, int
k) else
144}
145return
l;146
}147
148149
150void dfs(int u, int par, int
val)
157}
158159
160void
init()
164 tot = 0
;165 memset(fa, 0, sizeof
(fa));
166}
167168
void
solve()
178 bfs(1
);179 t[0] = build(1
, m);
180 dfs(1, 0, 1
);181
while(q--)
188189
}190
191}
192193
194195
intmain()
SPOJ COT 樹上第K大 LCA 主席樹
這題和普通的第k大類似。普通的第k大,是從後往前建立主席樹,前乙個在後乙個的基礎上修改。而樹上第k大,依舊是每個結點一棵主席樹,是在父節點的基礎上修改。那麼可以發現這棵主席樹是包括所有祖先結點的 就是深度在當前結點之上的 查詢的時候,是兩個結點的值的和,還要減掉lca以上的部分。同時要注意處理lca...
可修改主席樹 樹上可修改主席樹 樹套樹套樹
題目 思路 其實樹上主席樹是把每一棵主席樹看做樹狀陣列上的乙個點,每次修改log棵主席樹,求區間和的時候同樣log查詢字首和。上 include define d while d isdigit ch getchar using namespace std const int n 2e4 5 int...
關於樹論 LCA樹上倍增演算法
補了一發lca,表示這東西表面上好像簡單,但是細節真挺多。我學的是樹上倍增,倍增思想很有趣 爸爸的爸爸叫奶奶.偶不,爺爺 有乙個跟st表非常類似的東西,f i j 表示j的第2 i的祖先,就是說f 0 x 是父親,f 1 x 是爺爺,f 2 x 是高祖父 爺爺的爺爺 f 3 x 是遠祖父 高祖父的高...