把集合a[i]看作i點的前驅點集合,建成乙個dag,並新建超級源s,向每個前驅集合為空的點連邊,那麼b[i]就是s到i的必經點集合。
首先使用lengauer-tarjan演算法建立出以s為起點的dominator tree,那麼b[i]就是i在樹上的所有祖先。
對於乙個詢問,構造出虛樹,然後統計虛樹上每一條邊上的點數,累加即可。
時間複雜度$o(n+m+q\log n)$。
#include#includeusing namespace std;
const int n=200010,m=500010;
int n,m,q,i,x,q[n],a[n],vis[n],tot,t,ans;
int g1[n],g2[n],gd[n],v[m*3+n],nxt[m*3+n],ed;
int cnt,dfn[n],id[n],fa[n],f[n],mn[n],sd[n],idom[n];
int d[n],size[n],son[n],top[n],st[n],en[n];
inline void read(int&a)
inline void add(int*g,int x,int y)
int f(int x)
void dfs(int x)
void tarjan(int s)
}void dfs2(int x,int y)
inline int lca(int x,int y)
for(i=1;i<=m;i++)vis[a[i]]=0;
} return 0;
}
AcWing 285 沒有上司的舞會
acwing 285.沒有上司的舞會 ural大學有n名職員,編號為1 n。他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 hi 給出,其中 1 i n。現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀...
ACWing 285 沒有上司的舞會
給定一棵樹,節點編號1 n 1 sim n 1 n,每個節點有個權值,要求選出若干個點,使得沒有兩個點之間有邊,並且總權值和最大。問這個最大權值和。輸入格式 第一行乙個整數n nn。接下來n nn行,第i ii行表示第i ii個節點的權值。再接下來n 1 n 1n 1行,每行輸入一對整數l,k l,...
Acwing 285 沒有上司的舞會
ural大學有n名職員,編號為1 n。他們的關係就像一棵以校長為根的樹,父節點就是子節點的直接上司。每個職員有乙個快樂指數,用整數 h i hi 給出,其中 1 i n 1 i n 現在要召開一場周年慶宴會,不過,沒有職員願意和直接上司一起參會。在滿足這個條件的前提下,主辦方希望邀請一部分職員參會,...