bzoj1146 網路管理

2022-06-07 19:27:12 字數 1675 閱讀 9413

發現是鏈上的問題,所以樹鏈剖分

發現要查詢第k大,因為第k大不支援合併,所以要二分答案

二分答案後相當於詢問一些區間內大於某數的數個數,直接線段樹套平衡樹即可

時間複雜度$o(nlog^_n)$(跟$o(n^)$有什麼區別)可以卡過

1 #include2

using

namespace

std;

3#define n 100005

4#define l (k<<1)

5#define r (l+1)

6#define mid (l+r>>1)

7#define s(p) ch[k][p]

8struct

jiedge[n<<1

];11

inte,n,m,p,x,y,head[n],a[n],fa[n],sh[n],top[n],ma[n],id[n];

12int v,ro[n<<2],sz[n*50],sum[n*50],ra[n*50],v[n*50],ch[n*50][2

];13

void add_edge(int x,int

y)18

void up(int

k)21

void rotate(int &k,int x,int

p)27

void add(int &k,int

x)33 sz[k]++;

34if (v[k]==x)

38bool p=(v[k]

39add(s(p),x);

40if (ra[k]>ra[s(p)])rotate(k,s(p),p);41}

42void del(int &k,int

x)53

return;54

}55 del(s(v[k]

57int query(int k,int

x)63

void update(int k,int l,int r,int x,int y,int

z)70

int query(int k,int l,int r,int x,int y,int

z)75

void dfs(int k,int f,int

s)85}86

void dfs2(int k,int

t)94

int query(int x,int y,int

z)101

if (id[x]>id[y])swap(x,y);

102return ans+query(1,1

,n,id[x],id[y],z);

103}

104int

find()

111return

l;112

}113

intmain()

123 dfs(1,0,0

);124 x=0

;125 dfs2(1,1

);126

for(int i=1;i<=m;i++)

133if (query(x,y,0)"

invalid request!\n");

134else printf("

%d\n

",find());

135}

136 }

view code

BZOJ1146 網路管理,整體二分

傳送門 logn 查詢時二分答案,查詢路徑上重鏈中的平衡樹,複雜度 log3n 總複雜度o nlogn qlog3n log2n 查詢時把 log 個主席樹放在一起查做到 log2n 感謝lucida的提醒 總複雜度o nlog2n qlog2n o q n23logn log2n 基本過不了,離線...

BZOJ1146 網路管理(主席樹,樹狀陣列)

bzoj許可權題,洛谷題面 樹上帶修改主席樹 貌似和cou nton atre e 那題很相似呀 只需要套上乙個樹狀陣列來維護修改好就好了 但是記住是用df s 來記錄主席樹的標號 一定不要搞錯了 每一次修改只會影響他子數的值 而在d fs序上就是連續的一段 美滋滋的做完了 include incl...

BZOJ1146 CTSC2008 網路管理

樹狀陣列與線段樹 題目傳送門 在尤拉序上用樹狀陣列套權值線段樹搞事情。在進的時候加一,出去的時候減一。從尤拉序第一位到當前點的 l 就是根到當前點的狀態 因為其他的路徑一進一出抵消掉了 然後你求出兩個點的 lca 和 lca 的父親減一減跑一跑就好了。時間複雜度 o nlog 2n 空間複雜度 o ...