發現是鏈上的問題,所以樹鏈剖分
發現要查詢第k大,因為第k大不支援合併,所以要二分答案
二分答案後相當於詢問一些區間內大於某數的數個數,直接線段樹套平衡樹即可
時間複雜度$o(nlog^_n)$(跟$o(n^)$有什麼區別)可以卡過
1 #include2view codeusing
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 }
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 ...