1. 程式人生 > >洛谷4577 & LOJ2521:[FJOI2018]領導集團問題——題解

洛谷4577 & LOJ2521:[FJOI2018]領導集團問題——題解

.org 評測 iterator pre 最小 \n main += amp

https://www.luogu.org/problemnew/show/P4577

https://loj.ac/problem/2521

參考:https://www.luogu.org/blog/ShadowassIIXVIIIIV/solution-p4577

自己再說下另一種理解方法吧。

我們設f[i][j]為i的子樹下找到的點集最小值為j的大小。

但不是很好統計,所以我們開f[i][j]表示j~INF的和即為原來的含義。

則我們合並其子樹的時候,考慮加入i的w[i]時,其答案f[i][w[i]]還是沒有問題的,但是對於比w[i]小的值就全大1了,所以我們找到第一個比w[i]小的w,將其--,之後統計即可。

(當然如果沒有比其小的w,我們當然就不需要減啦!)

復雜度O(nlog^2n)只要評測機好點就能過。

#include<map>
#include<cmath>
#include<stack>
#include<queue>
#include<cstdio>
#include<cctype>
#include<vector>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include
<algorithm> using namespace std; typedef long long ll; const int N=2e5+5; #define fi first #define se second inline int read(){ int X=0,w=0;char ch=0; while(!isdigit(ch)){w|=ch==-;ch=getchar();} while(isdigit(ch))X=(X<<3)+(X<<1)+(ch^48),ch=getchar(); return
w?-X:X; } struct node{ int to,nxt; }e[N]; int n,m,cnt,head[N],w[N],b[N]; map<int,int>f[N]; map<int,int>::iterator it; inline void add(int u,int v){ e[++cnt].to=v;e[cnt].nxt=head[u];head[u]=cnt; } inline void merge(int u,int v){ if(f[u].size()<f[v].size())swap(f[u],f[v]); for(it=f[v].begin();it!=f[v].end();it++){ f[u][it->fi]+=it->se; } f[v].clear(); } void dfs(int u){ for(int i=head[u];i;i=e[i].nxt){ int v=e[i].to; dfs(v); merge(u,v); } it=f[u].begin(); if(it->fi>=w[u])return; it=f[u].lower_bound(w[u]);it--; if(it->se==1)f[u].erase(it); else it->se-=1; } inline void LSH(){ sort(b+1,b+m+1); m=unique(b+1,b+m+1)-b-1; for(int i=1;i<=n;i++) w[i]=lower_bound(b+1,b+m+1,w[i])-b; } int main(){ n=read(); for(int i=1;i<=n;i++)w[i]=b[++m]=read(); LSH(); for(int i=1;i<=n;i++)f[i][w[i]]=1; for(int v=2;v<=n;v++){ int u=read();add(u,v); } dfs(1); int ans=0; for(it=f[1].begin();it!=f[1].end();it++)ans+=it->se; printf("%d\n",ans); return 0; }

+++++++++++++++++++++++++++++++++++++++++++

+本文作者:luyouqi233。               +

+歡迎訪問我的博客:http://www.cnblogs.com/luyouqi233/+

+++++++++++++++++++++++++++++++++++++++++++

洛谷4577 & LOJ2521:[FJOI2018]領導集團問題——題解