BZOJ 3307 雨天的尾巴

2022-05-04 23:33:13 字數 2711 閱讀 2049

[題目鏈結]

[演算法]

考慮樹上差分 :

在路徑x-y上每個點放乙個物品c , 等價於 :

在x到根節點的路徑上放乙個物品c , 在y到根節點的路徑上放乙個物品c ,

然後在x和y的最近公共祖先到根節點的路徑上刪除乙個物品c , 在x和y的最近公共祖先的父親到根節點的路徑上刪除乙個物品c

不妨對於每個點構建一棵權值線段樹

在dfs計算答案的時候線段樹合併 , 即可

時間複雜度 : o(nlogn)(n , m同階)

[**]

#includeusing

namespace

std;

const

int n = 100010

;const

int maxp = 5000005

;typedef

long

long

ll;typedef

long

double

ld;typedef unsigned

long

long

ull;

struct

edge

e[n

<< 1

];int

n , m , tot , len;

intrt[n] , depth[n] , head[n] , ans[n] , size[n] , son[n] , top[n] , fa[n] , tmp[n] , x[n] , y[n] , z[n];

struct

segment_tree

struct

node

a[maxp];

inline

int merge(int x , int y , int l , int

r)

int mid = (l + r) >> 1

; a[x].lc =merge(a[x].lc , a[y].lc , l , mid);

a[x].rc = merge(a[x].rc , a[y].rc , mid + 1

, r);

update(x);

return

x; }

inline

void update(int

x)

if (!a[x].lc &&a[x].rc)

if (a[x].lc &&a[x].rc)

else}}

inline

void modify(int &now , int l , int r , int x , int

value)

int mid = (l + r) >> 1

;

if (mid >=x) modify(a[now].lc , l , mid , x , value);

else modify(a[now].rc , mid + 1

, r , x , value);

update(now);

}inline

int query(int

x)

} sgt;

template

inline void chkmax(t &x,t y)

template

inline void chkmin(t &x,t y)

template

inline void read(t &x)

inline

void addedge(int u , intv);

head[u] =tot;

}inline

void dfs1(int u , int

father)

}inline

int dfs2(int u , int fa , intt)}

inline

int lca(int x , int

y)

if (depth[x] < depth[y]) return

x;

else

returny;}

inline

void calc(int u , int

father)

ans[u] =tmp[sgt.query(u)];

}int

main()

dfs1(

1 , 0

); dfs2(

1 , 0 , 1

);

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

sort(tmp + 1 , tmp + m + 1

); len = unique(tmp + 1 , tmp + m + 1) - tmp - 1

;

for (int i = 1; i <= m; i++) z[i] = lower_bound(tmp + 1 , tmp + len + 1 , z[i]) -tmp;

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

calc(

1 , 0

);

for (int i = 1; i <= n; i++) printf("

%d\n

", ans[i]);

return0;

}

bzoj3307 雨天的尾巴

time limit 10 sec memory limit 128 mb submit 258 solved 121 submit status discuss n個點,形成乙個樹狀結構。有m次發放,每次選擇兩個點x,y 對於x到y的路徑上 含x,y 每個點發一袋z型別的物品。完成 所有發放後,每...

BZOJ3307 雨天的尾巴

線段樹合併 在鏈的兩端x,y各打上1個z的加標記,在lca x,y 打上1個z的減標記,在fa lca x,y 打上1個z的減標記,每個節點和所有孩子的線段樹合併,查詢時線段樹上二分 code include include include include include include inclu...

BZOJ3307 雨天的尾巴

bzoj許可權題 良心洛谷 這道題目的花呢,本來想縮先樹剖 可能需要長鏈剖分?再搞乙個標記永久化,然後最後合併答案,不過可能會卡空間。時間複雜度呢是o nlog 2n o n log2 n 然後boshi表示 為什麼不差分然後再自底向上合併線段樹呢 於是就做到了o nlog n o n logn 好...