【汕头市选2014】分叉(fork)
2018-01-31 15:27
176 查看
Description
给出一棵N 个点的树,点的编号是1, 2,。。。,N。对于3 个点{a,b,c},如果不存在一条简单路径同时经过a,b,c,那么{a,b,c}是一个分叉。
统计不同分叉的数量。
树 无环,连通的无向图
简单路径 不重复经过同一个点的路径
Input
第1 行,1 个整数N。接下来(N -1) 行,每行2 个整数Ai,Bi,表示点Ai 和点Bi 间有一条边。Output
1 个整数,表示所求的值。
Sample Input
51 2
1 3
1 4
1 5
Sample Output
4Data Constraint
• 对于30% 的数据,N <= 100;• 对于50% 的数据,N <= 1000;
• 对于100% 的数据,1 <= N <= 10^5。
思路
一开始,我想的是枚举两个点,只要不是gcd,都满足要求。很明显,TLE。由刚才的启发,不如枚举gcd。
不难发现,若x为y和z的gcd,那么他们一定在以x为根节点的两个子树当中。
so ans=C(n,3)-X。 X为不符合的个数。
X=sum*(n-sum-之前搜过的个数)
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct A { int x,y; }a[222222],b[222222]; long long sum[222222],fa[222222],son[222222]; long long n,k; bool f[222222]; long long ans=0; int cmp(A a,A b) { return a.x<b.x; } void star() { b[a[1].x].x=1; for(int i=2; i<=k; i++) { if(a[i].x!=a[i-1].x) { b[a[i-1].x].y=i-1; b[a[i].x].x=i; } } b[a[k].x].y=k; } void dfs(int t) { f[t]=1; for(int i=b[t].x; i<=b[t].y; i++) { if(i!=0 && !f[a[i].y]) { fa[a[i].y]=t; son[t]++; dfs(a[i].y); sum[t]+=sum[a[i].y]; } } sum[t]++; } int main() { // freopen("fork.in","r",stdin); // freopen("fork.out","w",stdout); scanf("%d",&n); for(int i=1; i<=n-1; i++) { scanf("%d%d",&a[i].x,&a[i].y); a[i+n-1].x=a[i].y; a[i+n-1].y=a[i].x; } k=n*2-2; sort(a+1,a+k+1,cmp); //printf("done\n"); star(); dfs(1);//printf("done\n"); ans=n*(n-1)*(n-2)/6; //for(int i=1; i<=k; i++)printf("%d %d\n",sum[i],son[i]); for(int i=1; i<=n; i++) { if(son[i]>0) { int p=0; for(int j=b[i].x; j<=b[i].y; j++) if(a[j].y!=fa[i]) { ans-=sum[a[j].y]*(n-sum[a[j].y]-1-p); p+=sum[a[j].y]; } } } //printf("%lld",ans); cout<<ans; fclose(stdin); fclose(stdout); }
相关文章推荐
- JZOJ3630. 【汕头市选2014】分叉(fork)
- 【汕头市选2014】分叉(fork)
- 【汕头市选2014】分叉 jzoj 3630 dfs
- 【jzoj3630】【汕头市选2014】【分叉】【树形动态规划】
- jzoj3630 【汕头市选2014】分叉(树上统计)
- 【汕头市选2014】舞伴(perm)
- JZOJ 3631. 【汕头市选2014】三角(triangle)
- Unix系统分叉函数fork()
- 汕头市选 2014 舞伴___状压dp
- 【汕头市选2014】舞伴(perm)
- JZOJ 3632. 【汕头市选2014】舞伴
- 并行处理:分叉(fork)和线程(thread)
- jzoj 3631 【汕头市选2014】三角(triangle)
- Bitcoin Cash为什么要对比特币区块链进行分叉Hard fork?
- fork函数详解(fork就是分叉的意思, 很形象)
- 【汕头市选2014】三角
- jzoj P1842【汕头市选2014】平均
- 【汕头市选2014】舞伴(perm)
- 【汕头市选2014】舞伴 jzoj 3632 状压dp
- 【汕头市选2014】数数