CTSC2008 網路管理 樹剖 整體二分

2022-05-05 11:54:08 字數 2848 閱讀 4196

這題的複雜度可以到達驚人的\(\log^4\)據說還能跑過去(差點沒嚇死我

直接二分+樹剖樹套樹(\(n \log^4 n\))

乙個\(\log\)也不少的4\(\log\)

但是我有個\(\log^3\)的樹剖上面整體二分+線段樹的做法

不過據說有個\(\log\)做法,我不會,反正我菜就是了

然後的話 就直接考慮個消除貢獻…然而並不需要排序

權值線段樹 就可以了

每次新增修改就

if(! op)  ; val[y] = z ;

q[++ tot] = ; b[++ len] = z ;

} else ;

}

然後就成功完成了打消貢獻以及新增貢獻

然後整體二分板子即可

#include #define int long long

#define rep(a , b , c) for(int a = b ; a <= c ; ++ a)

#define rep(a , b , c) for(int a = b ; a >= c ; -- a)

#define go(u) for(int i = g.head[u] , v = g.to[i] , w = g.dis[i] ; i ; v = g.to[i = g.nxt[i]] , w = g.dis[i])

using namespace std ;

using ll = long long ;

using pii = pair < int , int > ;

using vi = vector < int > ;

int read()

while(c > 47 && c < 58)

return f ? x : -x ;

}template void print(t x , char c = '\n')

template void cmax(t & x , t y)

template void cmin(t & x , t y)

const int _n = 1e6 + 10 ;

struct group

void add(int u , int v , int w = 1)

} ;const int n = 5e5 + 10 ;

typedef int arr[n] ;

group g ;

int n , q , len = 0 , val[n] , b[n << 1] ;

arr fa , d , son , sz ;

void dfs(int u)

}arr top , id ;

int idx = 0 ;

void dfs(int u , int t)

struct seg

int mid = l + r >> 1 ;

if(pos <= mid) change(l , mid , rt << 1 , pos , val) ;

else change(mid + 1 , r , rt << 1 | 1 , pos , val) ;

sum[rt] = sum[rt << 1] + sum[rt << 1 | 1] ;

} int query(int a , int b , int l , int r , int rt)

} t ;

int query_range(int x , int y)

if(d[x] > d[y]) swap(x , y) ; ans += t.query(id[x] , id[y] , 1 , n , 1) ;

return ans ;

}struct query q[n] , q1[n] , q2[n] ;

int tot = 0 , num = 0 , pos = 0 ;

arr ans ;

void solve(int l , int r , int l , int r)

int mid = l + r >> 1 , cnt1 = 0 , cnt2 = 0 ;

rep(i , l , r) else q1[++ cnt1] = q[i] ;

} else

} }rep(i , 1 , cnt2) if(q2[i].type == 1) t.change(1 , n , 1 , id[q2[i].id] , -q2[i].y) ;

rep(i , 1 , cnt1) q[l + i - 1] = q1[i] ; rep(i , 1 , cnt2) q[l + cnt1 + i - 1] = q2[i] ;

solve(l , l + cnt1 - 1 , l , mid) ; solve(l + cnt1 , r , mid + 1 , r) ;

}signed main() ; b[++ len] = val[i] ; }

rep(i , 2 , n)

dfs(1) ; dfs(1 , 1) ;

rep(i , 1 , q) ; val[y] = z ;

q[++ tot] = ; b[++ len] = z ;

} else ;

} }sort(b + 1 , b + len + 1) , len = unique(b + 1 , b + len + 1) - b - 1 ;

rep(i , 1 , tot) if(q[i].type != 2) q[i].k = lower_bound(b + 1 , b + len + 1 , q[i].k) - b ;

solve(1 , tot , 0 , len + 1) ;

rep(i , 1 , pos)

return 0 ;

}

CTSC2008 網路管理

題目描述 m 公司是乙個非常龐大的跨國公司,在許多國家都設有它的下屬分支機構或部門。為了讓分布在世界各地的 nn 個部門之間協同工作,公司搭建了乙個連線整個公司的通訊網路。該網路的結構由 nn 個路由器和 n 1n 1 條高速光纜組成。每個部門都有乙個專屬的路由器,部門區域網內的所有機器都聯向這個路...

BZOJ1146 CTSC2008 網路管理

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

CODEVS1490 CTSC2008 網路管理

題目描述 description m公司是乙個非常龐大的跨國公司,在許多國家都設有它的下屬分支機構或部門。為了讓分布在世界各地的n個部門之間 協同工作,公司搭建了乙個連線整個公司的通訊網路。該網路的結構由n個路由器和n 1條高速光纜組成。每個部門都有乙個專屬的路由器,部門區域網內的所有 機器都聯向這...