#include <bits/stdc++.h>
#define gibon ios::sync_with_stdio(false); cin.tie(0);
#define fir first
#define sec second
#define pdd pair<long double, long double>
#define pii pair<int, int>
#define pll pair<ll, ll>
#define ld long double
#define pmax pair<__int128, __int128>
#pragma GCC optimize("O3")
#pragma GCC optimize("Ofast")
#pragma GCC optimize("unroll-loops")
typedef long long ll;
using namespace std;
int dx[4]= {0, 1, 0, -1}, dy[4]= {1, 0, -1, 0};
int ddx[8]={1, 1, 0, -1, -1, -1, 0, 1}, ddy[8]={0, 1, 1, 1, 0, -1, -1, -1};
const int mxN=100025;
const int mxM=300005;
const int mxK=1000000000;
const ll MOD=1000'000'007;
const ll INF=1000000000000000005;
ll N, D;
vector <int> v[mxN];
int outw[mxN];
int downw[mxN], upw[mxN];
bool W[mxN];
int degL[mxN];
vector <int> v1[mxN], v2[mxN];
int sizw1[mxN], leafw2[mxN], sizl2[mxN], par1[mxN], par2[mxN];
ll numw;
int match[mxN];
void dfs_downw(int now, int pre)
{
for(int nxt : v[now]) if(nxt!=pre)
{
dfs_downw(nxt, now);
}
downw[now]=(outw[now]==0 ? 1 : 0);
if(now!=1) outw[pre]+=downw[now];
}
void dfs_upw(int now, int pre)
{
if(now!=1)
{
upw[now]=(outw[pre]-downw[now]==0 ? 1 : 0);
outw[now]+=upw[now];
}
for(int nxt : v[now]) if(nxt!=pre)
{
dfs_upw(nxt, now);
}
}
int findpar(int a, int typ)
{
if(typ==1) return (par1[a]==a ? a : par1[a]=findpar(par1[a], 1));
else return (par2[a]==a ? a : par2[a]=findpar(par2[a], 2));
}
void onion(int a, int b, int typ)
{
int p=findpar(a, typ), q=findpar(b, typ);
if(typ==1)
{
par1[p]=q; sizw1[q]+=sizw1[p];
}
else
{
par2[p]=q; sizl2[q]+=sizl2[p]; leafw2[q]+=leafw2[p];
}
}
int dfs_match(int now, int pre)
{
for(int nxt : v[now]) if(nxt!=pre && W[nxt] && degL[nxt]==0)
{
int tmp=dfs_match(nxt, now);
if(tmp!=0) match[now]=tmp, match[tmp]=now;
}
if(match[now]) return 0;
else return now;
}
int dfs_1(int now, int pre)
{
int sum=1;
for(int nxt : v[now]) if(nxt!=pre && W[nxt] && degL[nxt]==0)
{
sum+=dfs_1(nxt, now);
}
return sum;
}
int main()
{
gibon
cin >> N >> D;
for(int i=1;i<N;i++)
{
int a, b; cin >> a >> b;
v[a].push_back(b);
v[b].push_back(a);
}
dfs_downw(1, -1);
dfs_upw(1, -1);
for(int i=1;i<=N;i++)
{
W[i]=(outw[i]>=1);
numw+=W[i];
}
for(int i=1;i<=N;i++)
{
for(int ele : v[i])
{
if(!W[ele]) degL[i]++;
}
}
for(int i=1;i<=N;i++)
{
if(!W[i] || degL[i]) continue;
for(int ele : v[i]) if(W[ele] && degL[ele]==0) v1[i].push_back(ele);
}
for(int i=1;i<=N;i++)
{
if(!W[i])
{
for(int ele : v[i]) if(degL[ele]<3) v2[i].push_back(ele);
}
else if(degL[i]<3)
{
for(int ele : v[i]) if(!W[ele]) v2[i].push_back(ele);
}
}
for(int i=1;i<=N;i++)
{
par1[i]=par2[i]=i;
if(degL[i]==0 && W[i]) sizw1[i]=1;
if(v2[i].size()==1 && W[i]) leafw2[i]=1;
if(!W[i]) sizl2[i]=1;
}
for(int i=1;i<=N;i++)
{
for(int ele : v1[i]) if(ele<i)
{
onion(ele, i, 1);
}
for(int ele : v2[i]) if(ele<i)
{
onion(ele, i, 2);
}
}
dfs_match(1, -1);
if(W[1])
{
ll ans=N*N;
if(degL[1]==0) ans-=(N-numw)*(dfs_1(match[1], 1)+1)/2;
if(v2[1].size()==1) ans-=(N-numw)*sizl2[findpar(1, 2)];
cout << ans%MOD;
}
else
{
ll ans=0;
ans+=(N-numw)*sizl2[findpar(1, 2)];
cout << ans%MOD;
}
}
/*
10 1
3 9
9 6
4 5
7 9
8 2
0 5
3 4
2 9
8 1
*/
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
7380 KB |
Output is correct |
2 |
Incorrect |
4 ms |
7508 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
4 ms |
7380 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
7380 KB |
Output is correct |
2 |
Correct |
4 ms |
7380 KB |
Output is correct |
3 |
Correct |
3 ms |
7380 KB |
Output is correct |
4 |
Correct |
4 ms |
7380 KB |
Output is correct |
5 |
Incorrect |
5 ms |
7416 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
7380 KB |
Output is correct |
2 |
Correct |
4 ms |
7380 KB |
Output is correct |
3 |
Correct |
3 ms |
7380 KB |
Output is correct |
4 |
Correct |
4 ms |
7380 KB |
Output is correct |
5 |
Incorrect |
5 ms |
7416 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
7380 KB |
Output is correct |
2 |
Correct |
4 ms |
7380 KB |
Output is correct |
3 |
Correct |
3 ms |
7380 KB |
Output is correct |
4 |
Correct |
4 ms |
7380 KB |
Output is correct |
5 |
Incorrect |
5 ms |
7416 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
7380 KB |
Output is correct |
2 |
Correct |
4 ms |
7380 KB |
Output is correct |
3 |
Correct |
3 ms |
7380 KB |
Output is correct |
4 |
Correct |
4 ms |
7380 KB |
Output is correct |
5 |
Incorrect |
5 ms |
7416 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
5 ms |
7380 KB |
Output is correct |
2 |
Correct |
4 ms |
7380 KB |
Output is correct |
3 |
Correct |
3 ms |
7380 KB |
Output is correct |
4 |
Correct |
4 ms |
7380 KB |
Output is correct |
5 |
Incorrect |
5 ms |
7416 KB |
Output isn't correct |
6 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
3 ms |
7380 KB |
Output is correct |
2 |
Incorrect |
4 ms |
7508 KB |
Output isn't correct |
3 |
Halted |
0 ms |
0 KB |
- |