樹鏈剖分把樹上問題轉換成序列上的問題qwq,然後求鏈上小於i-k的節點個數。
可以離線做,先把所有操作讀入,這樣就不需要中間的修改了qwq
然後就是大力主席樹了qwqwq
**如下:
#include#include#include#include#include#include#define maxn 400010
using namespace std;
int n,m,tt,tot,root,cnt;
int head[maxn<<1],fa[maxn],st[maxn],rt[maxn],sum[maxn<<4],lc[maxn<<4],rc[maxn<<4];
int dep[maxn],top[maxn],siz[maxn],son[maxn],id[maxn];
struct nodenode[maxn];
struct edgeedge[maxn<<1];
inline void add(int from,int to)
inline void insert(int &x,int f,int l,int r,int pos)
inline int query(int l,int r,int ll,int rr,int k)
inline void build(int x)
}inline void dfs1(int x)
}inline void dfs2(int x,int topf)
}inline int lca(int x,int y)
if(dep[x]else return y;
}int main()
scanf("%d",&m);
for(int i=1;i<=n;i++) st[i]=m;
for(int i=1;i<=m;i++)
dep[root]=1;
dfs1(root);
dfs2(root,root);
build(root);
//for(int i=1;i<=n;i++) printf("rt[%d]=%d\n",i,rt[i]); puts("");
//for(int i=1;i<=n;i++) printf("dep[%d]=%d\n",i,dep[i]); puts("");
//for(int i=1;i<=n;i++) printf("fa[%d]=%d\n",i,fa[i]);
for(int i=1;i<=m;i++)
cur_ans+=query(1,m,rt[lca],rt[u],i-k-1);
cur_ans+=query(1,m,rt[lca],rt[v],i-k-1);
cur_ans+=(st[lca]<(i-k));
printf("%d %d\n",dep[u]+dep[v]-2*dep[lca]+1,cur_ans);}}
return 0;
}
SCOI 2015 情報傳遞
霧。emmmm.看到有區間查詢小於某值的個數。直接怒打一發 樹剖 樹套樹 經過無數次 re mle 以後,終於卡過去了 然而我為啥不用主席樹啊tat 智商下線 好像也沒有過 線段樹套個bit快一些 emmmm luogu 4216 bzoj 4448 本 可在bzoj上過,請在洛谷上酌情加空間qwq...
bzoj 4448 Scoi2015 情報傳遞
description 奈特公司是乙個巨大的情報公司,它有著龐大的情報網路。情報網路中共有n名情報員。每名情報員口j 能有 若t名 可能沒有 下線,除1名大頭日外其餘n 1名情報員有且僅有1名上線。奈特公司紀律森嚴,每 名情報員只能與自己的上 下線聯絡,同時,情報網路中仟意兩名情報員一定能夠通過情報...
BZOJ4448 Scoi2015 情報傳遞
bzoj4448 scoi2015 情報傳遞 奈特公司是乙個巨大的情報公司,它有著龐大的情報網路。情報網路中共有n名情報員。每名情報員口j 能有若t名 可能沒有 下線,除1名大頭日外其餘n 1名情報員有且僅有1名上線。奈特公司紀律森嚴,每名情報員只能與自己的上 下線聯絡,同時,情報網路中仟意兩名情報...