BZOJ3307 雨天的尾巴

2021-07-31 05:31:39 字數 2325 閱讀 6132

線段樹合併

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

code:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using namespace std;

inline void read(int &x)

inline void up(int &x,const int &y)

inline void swap(int &x,int &y)

const int maxn = 100005;

const int maxd = 20;

int n,m;

struct edge

edge(const int _y,const int _nex)

}a[maxn<<1],m[maxn<<2]; int len,fir[maxn],fi[maxn],lenm;

inline void ins(const int

x,const int

y)inline void ins2(const int

x,const int

y,const int c)

int fa[maxn][maxd],dep[maxn];

void dfs(const intx)}

int lca(int

x,int

y)struct node

q[maxn];

inline bool cmp(const node x,const node y)

int lsh[maxn];

struct segment

seg[maxn*70]; int tot;

int root[maxn];

inline void pushup(const int

x)void merge(int &x,const int

y,const int l,const int r)

if(l==r)

int mid=l+r>>1;

merge(seg[x].lc,seg[y].lc,l,mid); merge(seg[x].rc,seg[y].rc,mid+1,r);

pushup(x);

}int loc,c;

void upd(int &x,const int l,const int r)

int mid=l+r>>1;

if(loc<=mid) upd(seg[x].lc,l,mid);

else upd(seg[x].rc,mid+1,r);

pushup(x);

}int query(const int

x,const int l,const int r)

int mid=l+r>>1;

if(seg[seg[x].lc].c>=seg[seg[x].rc].c) return query(seg[x].lc,l,mid);

else

return query(seg[x].rc,mid+1,r);

}int maxz;

int ans[maxn];

void solve(const int

x) for(int k=fi[x];k;k=m[k].nex)

loc=m[k].y,c=m[k].c,upd(root[x],1,maxz);

ans[x]=lsh[query(root[x],1,maxz)];

}int main()

dep[1]=1; dfs(1);

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

sort(q+1,q+m+1,cmp);

q[0].c=q[1].c-1; maxz=0;

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

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

solve(1);

for(int i=1;i<=n;i++) printf("%d\n",ans[i]);

return

0;}

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 雨天的尾巴

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

BZOJ3307 雨天的尾巴

n個點,形成乙個樹狀結構。有m次發放,每次選擇兩個點x,y 對於x到y的路徑上 含x,y 每個點發一袋z型別的物品。完成 所有發放後,每個點存放最多的是哪種物品。第一行數字n,m 接下來n 1行,每行兩個數字a,b,表示a與b間有一條邊 再接下來m行,每行三個數字x,y,z.如題 輸出有n行 每i行...