線段樹合併
在鏈的兩端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行...