bzoj3307 雨天的尾巴 線段樹 樹鏈剖分

2021-07-11 04:43:10 字數 1097 閱讀 3570

考慮如果在序列上的話,每次只需要在區間左端點+1,右端點-1,最後用線段樹一起統計即可。

在樹上的話,就用樹鏈剖分轉換成序列,每一次操作,對應修改o(log n)條重鏈上的標記,最後用線段樹來統計。

#include#include#include#include#include#include#include#include#define maxn 200100

using namespace std;

struct yts

t[4*maxn];

int head[maxn],st[maxn],to[maxn],next[maxn],seq[maxn],rank[maxn],fa[19][maxn],size[maxn],dd[maxn];

int n,m,num,tot,t,cnt;

int e[maxn],pos[maxn],ans[maxn],dep[maxn];

bool vis[maxn];

vector> v[maxn];

mapmp;

void addedge(int x,int y)

void dfs(int x)

}int go_up(int x,int d)

void add(int x,int a,int b)

void update(int i)

void build(int i,int l,int r)

int mid=(l+r)/2;

build(i*2,l,mid);build(i*2+1,mid+1,r);

}void modify(int i,int x,int d)

int mid=(t[i].l+t[i].r)/2;

if (x<=mid) modify(i*2,x,d);

if (middep[lca])

add(rank[lca],z,1);add(rank[x]+1,z,-1);

if (y!=lca)

add(rank[w],z,1);add(rank[y]+1,z,-1);

} }build(1,1,cnt);

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

{ for (int j=0;j

bzoj 3307 雨天的尾巴 線段樹

n個點,形成乙個樹狀結構。有m次發放,每次選擇兩個點x,y 對於x到y的路徑上 含x,y 每個點發一袋z型別的物品。完成 所有發放後,每個點存放最多的是哪種物品。1 n,m 100000 1 a,b,x,y n 1 z 10 9 比較巧妙的一道題。考慮如果是在一條鏈上的話要怎麼做。那麼我們可以在x處...

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...