51nod-1322: 关于树的函数
【传送门:51nod-1322】
简要题意:
给出n个点的两棵无根树,编号都是从0到n-1
现在每棵树任意选出一条边割断,设第一棵树选出的边为e1,第二棵树选出的边为e2
很显然割断后两棵树各分成了四棵树,设第一棵树分成了A1树和B1树,第二棵树分成了A2树和B2树
设S(a,b)为a树和b树之间相同编号的点的个数
那么割断这两条边的价值为S(A1,B1),S(A1,B2),S(A2,B1),S(A2,B2)中的最大值的平方
求出每对e1,e2的价值和
题解:
又是一道卡了挺久的题
我们把节点全部+1,把第二棵树的节点编号设为n+1到2n(方便操作)
设两棵树的根节点分别为1和n+1
先在第一棵树中找到一个非根节点,然后在第二棵树中找到另一个非根节点
对于这两个节点显然有三种情况:
1.取两个节点的子树
2.取其中一个点的子树,另一个点的反子树(就是除了子树外的点)
3.取两个节点的反子树
然后对于三种情况更新答案就行了
具体操作有点麻烦,看代码吧(有点小懒)
PS:不知道该分到哪个专题,看了一下路牌,发现dalao都说是树形计数DP,那我就只好分成树形计数DP
参考代码:
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
using namespace std;
typedef long long LL;
struct node
{
int x,y,next;
}a[];int len,last[];
void ins(int x,int y)
{
len++;
a[len].x=x;a[len].y=y;
a[len].next=last[x];last[x]=len;
}
int tot[],n;
bool v[][];
void pre(int x,int fa)
{
tot[x]=;
if(x<=n) v[x][x]=true;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y==fa) continue;
pre(y,x);
if(x<=n) for(int i=;i<=n;i++) v[x][i]|=v[y][i];
tot[x]+=tot[y];
}
}
LL ans;int s;
int dou(int x){return x*x;}
void getd(int x,int fa,int p)
{
if(v[p][x-n]==true) s++;
int t=s;
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y==fa) continue;
getd(y,x,p);
t=s-t;
ans+=dou(max(max(t,tot[y]-t),max(tot[p]-t,n-tot[p]-tot[y]+t)));
t=s;
}
}
void solve(int x,int fa)
{
for(int k=last[x];k;k=a[k].next)
{
int y=a[k].y;
if(y==fa) continue;
s=;getd(n+,,y);
solve(y,x);
}
}
int main()
{
scanf("%d",&n);
len=;memset(last,,sizeof(last));
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);x++;y++;
ins(x,y);ins(y,x);
}
for(int i=;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);x++;y++;
ins(x+n,y+n);ins(y+n,x+n);
}
memset(v,false,sizeof(v));
pre(,);pre(n+,);
ans=;solve(,);
printf("%lld\n",ans);
return ;
}
51nod-1322: 关于树的函数的更多相关文章
- 51nod 1412 AVL树的种类(dp)
题目链接:51nod 1412 AVL树的种类 开始做的时候把深度开得过小了结果一直WA,是我天真了.. #include<cstdio> #include<cstring> ...
- 51nod 1412 AVL树的种类(经典dp)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1412 题意: 思路: 经典dp!!!可惜我想不到!! $dp[i][k] ...
- 【转】doxygen+graphviz生成工程中的类继承树及函数调用图
转自----hequn8128 在阅读代码量比较多的项目时,类的继承树和函数调用图能够直观地向我们显示类之间或者函数之间的各种关系,方便我们了解程序的整体框架,很多时候可以起到事半功倍的作用.这里尝试 ...
- 51NOD 1353:树——题解
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1353 今天小a在纸上研究树的形态,众所周知的,有芭蕉树,樟树,函树,平衡 ...
- 【51Nod 1239】欧拉函数之和
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1239 还是模板题. 杜教筛:\[S(n)=\frac{n(n+1)}{2 ...
- 51nod 1287 线段树
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1287 简单的线段树题目,直接写个二分查找大于等于x的最小位置就好了. # ...
- ACM学习历程—51NOD 1412 AVL树的种类(递推)
http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1770 这是这次BSG白山极客挑战赛的B题.设p(i, j)表示节点个数为 ...
- 【题解】彩色树 51nod 1868 虚树 树上dp
Prelude 题目在这里:ο(=•ω<=)ρ⌒☆ Solution 蒟蒻__stdcall的第一道虚树题qaq. 首先很容易发现,这个排列是假的. 我们只需要求出每对点之间的颜色数量,然后求个 ...
- 51nod 1819 黑白树V2(树链剖分)
第一次写如此复杂的树链剖分, 感觉自己代码能力还是挺不错的,没有调试太久(2个小时) 最后代码量高达11K orz(大部分都是重复的线段树代码,以后可以考虑优化一下代码量) 题解: 首先就是要进行一次 ...
- 51NOD 1424 零树
Discription 有一棵以1为根的树,他有n个结点,用1到n编号.第i号点有一个值vi. 现在可以对树进行如下操作: 步骤1:在树中选一个连通块,这个连通块必须包含1这个结点. 步骤2:然后对这 ...
随机推荐
- Java二维码打印
http://blog.csdn.net/OnePersonTZ/article/details/66560513
- java Timer定时器管理类
1.java timer类,定时器类.启动执行定时任务方法是timer.schedule(new RemindTask(), seconds*1000);俩参数分别是TimerTask子类,具体执行定 ...
- java 日期和字符串互转,依据当天整天时间 得到当天最后一秒的日期时间
java 日期和字符串互转.依据当天整天时间 得到当天最后一秒的日期时间 package com.hi; import java.text.DateFormat; import java.text ...
- [Python Test] Use pytest fixtures to reduce duplicated code across unit tests
In this lesson, you will learn how to implement pytest fixtures. Many unit tests have the same resou ...
- [Puppeteer] Get a Page's Load Time with Puppeteer (window.profermence.timing)
In this lesson we are going to use Google's Puppeteer to gather metrics about a page's load time. We ...
- 对苹果“五仁”编程语言Swift的简单分析
对苹果"五仁"编程语言Swift的简单分析 watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvUHJvdGVhcw==/font/5a6L5 ...
- emitter 增强 多条件触发
;(function(global ,undefined){ var evts = {} ,onceTag = '__event_once' function emit(event ){ ) if ( ...
- zzulioj--1634--Happy Thanksgiving Day - A + B Problem(模拟水题)
1634: Happy Thanksgiving Day - A + B Problem Time Limit: 1 Sec Memory Limit: 128 MB Submit: 136 ...
- jQuery学习(一)——jQuery入门
1.jQuery基础 Jquery它是一个库(框架),要想使用它,必须先引入! jquery-1.8.3.js:一般用于学习阶段. jquery-1.8.3.min.js:用于项目使用阶段 官网下载后 ...
- windows下安装mycat,并简单使用
使用mycat需要先安装jdk1.7以上 参考:http://www.cnblogs.com/llhhll/p/9257764.html 1从官网下载解压后目录如下(1.6版本) 下载地址:https ...