1 条题解
-
0
赛场最唐操作出现了,以后没想好千万不要开题。。
大力手模发现每个点只能向自己任意祖先连边,且满足“祖先不能先到该点”的约束,树状数组优化即可。
#include<bits/stdc++.h> typedef long long ll; using namespace std; const int N=2e5+10; const int MOD=1e9+7; int n,fto[N]; vector<int>vc[N]; ll ans=1; struct Fenwick{ int tr[N]; #define lb(x) (x&-x) inline void Add(int id,int k){while(id<=n)tr[id]+=k,id+=lb(id);} inline int Query(int id){ int res=0; while(id)res+=tr[id],id^=lb(id); return res; } }bit; inline ll Fpow(ll a,int b) { ll res=1; while(b) { if(b&1)res=res*a%MOD; a=a*a%MOD,b>>=1; } return res; } void DFS(int u,int f) { fto[u]=0x3f3f3f3f; for(int v:vc[u]) { if(v==f)continue; fto[u]=min(fto[u],v); DFS(v,u); } } void DFS2(int u,int f) { ll cnt=bit.Query(u-1); cnt=Fpow(2,cnt); ans=ans*cnt%MOD; for(int v:vc[u]) { if(v==f)continue; fto[u]=v; bit.Add(fto[u],1); DFS2(v,u); bit.Add(fto[u],-1); } } signed main() { ios::sync_with_stdio(0); cin.tie(0),cout.tie(0); // freopen("dfs.in","r",stdin); // freopen("dfs.out","w",stdout); cin>>n; for(int i=1;i<n;++i) { int u,v; cin>>u>>v; vc[u].push_back(v); vc[v].push_back(u); } for(int i=1;i<=n;++i) sort(vc[i].begin(),vc[i].end()); DFS(1,0); DFS2(1,0); cout<<ans<<'\n'; return 0; }
- 1
信息
- ID
- 3672
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 7
- 标签
- (无)
- 递交数
- 31
- 已通过
- 9
- 上传者