這題的複雜度可以到達驚人的\(\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條高速光纜組成。每個部門都有乙個專屬的路由器,部門區域網內的所有 機器都聯向這...