BZOJ 3752 世界树
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=3572
题意:给出一棵树。若干询问。每个询问给出m个点,输出每个点管辖的点的个数。x被y管辖(y在给出的m个点中)是说不存在其他的m个点中的点yy,使得pair<dis(x,yy),yy> < pair<dis(x,y),y>。
思路:建立虚树。
const int INF=100000005;
const int N=333333;
vector<int> gg[N];
int f[N][20];
int dep[N];
int n,m;
int id;
int dfn[N];
int size[N];
void DFS(int u,int pre,int d)
{
dep[u]=d;
f[u][0]=pre;
dfn[u]=++id;
size[u]=1;
int i;
for(i=0;i<SZ(gg[u]);i++)
{
int v=gg[u][i];
if(v!=pre) DFS(v,u,d+1),size[u]+=size[v];
}
}
int getLca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
int x=dep[u]-dep[v];
int i;
for(i=0;i<20;i++) if(x&(1<<i)) u=f[u][i];
if(u==v) return u;
for(i=19;i>=0;i--) if(f[u][i]&&f[v][i]&&f[u][i]!=f[v][i])
{
u=f[u][i];
v=f[v][i];
}
return f[u][0];
}
int get(int u,int d)
{
int i;
for(i=19;i>=0;i--) if(dep[f[u][i]]>=d) u=f[u][i];
return u;
}
pair<int,int> g[N];
int tot,a[N],b[N];
int ans[N];
int st[N];
int cmp(int x,int y)
{
return dfn[x]<dfn[y];
}
int fa[N];
void init()
{
sort(a+1,a+m+1,cmp);
int top=0;
int i;
for(i=1;i<=m;i++)
{
int u=a[i];
if(!top) fa[st[++top]=u]=0;
else
{
int lca=getLca(st[top],u);
while(dep[st[top]]>dep[lca])
{
if(dep[st[top-1]]<=dep[lca]) fa[st[top]]=lca;
top--;
}
if(st[top]!=lca)
{
a[++tot]=lca;
g[lca]=MP(INF,0);
fa[lca]=st[top];
st[++top]=lca;
}
fa[u]=lca;
st[++top]=u;
}
}
}
int dis[N];
int tmp[N];
void cal()
{
sort(a+1,a+tot+1,cmp);
int i;
for(i=1;i<=tot;i++)
{
int u=a[i];
tmp[u]=size[u];
if(i>1) dis[u]=dep[u]-dep[fa[u]];
}
for(i=tot;i>1;i--)
{
int u=a[i],pre=fa[u];
g[pre]=min(g[pre],MP(g[u].first+dis[u],g[u].second));
}
for(i=2;i<=tot;i++)
{
int u=a[i],pre=fa[u];
g[u]=min(g[u],MP(g[pre].first+dis[u],g[pre].second));
}
for(i=1;i<=tot;i++)
{
int u=a[i],pre=fa[u];
if(i==1) ans[g[u].second]+=n-size[u];
else
{
int x=get(u,dep[pre]+1);
int sum=size[x]-size[u];
tmp[pre]-=size[x];
if(g[pre].second==g[u].second) ans[g[u].second]+=sum;
else
{
int xx=g[pre].first+g[u].first+dis[u];
int M=dep[u]-(xx/2-g[u].first);
if(xx%2==0&&g[u].second>g[pre].second) M++;
int y=size[get(u,M)]-size[u];
ans[g[u].second]+=y;
ans[g[pre].second]+=sum-y;
}
}
}
for(i=1;i<=tot;i++) ans[g[a[i]].second]+=tmp[a[i]];
}
int main()
{
scanf("%d",&n);
int i;
for(i=1;i<n;i++)
{
int x,y;
scanf("%d%d",&x,&y);
gg[x].pb(y);
gg[y].pb(x);
}
DFS(1,0,1);
int j;
for(i=1;(1<<i)<=n;i++) for(j=1;j<=n;j++) f[j][i]=f[f[j][i-1]][i-1];
int Q;
scanf("%d",&Q);
while(Q--)
{
scanf("%d",&m);
for(i=1;i<=m;i++)
{
a[i]=b[i]=getInt();
g[a[i]]=MP(0,a[i]);
ans[a[i]]=0;
}
tot=m;
init();
cal();
for(i=1;i<=m;i++)
{
printf("%d ",ans[b[i]]);
}
puts("");
}
}
BZOJ 3752 世界树的更多相关文章
- BZOJ 3572 世界树
Description 世界树是一棵无比巨大的树,它伸出的枝干构成了整个世界.在这里,生存着各种各样的种族和生灵,他们共同信奉着绝对公正公平的女神艾莉森,在他们的信条里,公平是使世界树能够生生不息.持 ...
- bzoj 3752: Hack 预处理+暴力dfs
题目大意: 定义字符串的hash值\(h = \sum_{i=0}^{n-1}p^{n-i-1}s_i\) 现在给定K个长度不超过L的字符串S,对于每个字符串S,求字典序最小长度不超过L的字符串T使得 ...
- BZOJ 3572 世界树(虚树)
http://www.lydsy.com/JudgeOnline/problem.php?id=3572 思路:建立虚树,然后可以发现,每条边不是同归属于一端,那就是切开,一半给上面,一半给下面. # ...
- bzoj 3572世界树 虚树+dp
题目大意: 给一棵树,每次给出一些关键点,对于树上每个点,被离它最近的关键点(距离相同被标号最小的)控制 求每个关键点控制多少个点 分析: 虚树+dp dp过程如下: 第一次dp,递归求出每个点子树中 ...
- BZOJ 2648 世界树
题目传送门 分析: 喜 闻 乐 见 的虚树 但是建好虚树后的DP也非常的恶心 我们先考虑每个关键点的归哪个点管 先DFS一次计算儿子节点归属父亲 再DFS一次计算父亲节点归属儿子 然后然后我们对于虚树 ...
- BZOJ 3572: [Hnoi2014]世界树
BZOJ 3572: [Hnoi2014]世界树 标签(空格分隔): OI-BZOJ OI-虚数 OI-树形dp OI-倍增 Time Limit: 20 Sec Memory Limit: 512 ...
- bzoj 3572: [Hnoi2014]世界树 虚树 && AC500
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 520 Solved: 300[Submit][Status] ...
- bzoj 3572 [Hnoi2014]世界树(虚树+DP)
3572: [Hnoi2014]世界树 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 645 Solved: 362[Submit][Status] ...
- BZOJ 3572 【HNOI2014】 世界树
题目链接:世界树 首先看到\(\sum m_i\le 3\times 10^5\)这个条件,显然这道题就需要用虚树了. 在我们构建出虚树之后,就可以用两遍\(dfs\)来求出离每个点最近的议事处了.然 ...
随机推荐
- 手机端js模拟长按事件(代码仿照jQuery)
代码编写: $.fn.longPress = function(fn) { var timeout = undefined; var $this = this; for(var i = 0;i< ...
- spring的事务回滚
@Transactional(rollbackFor = { Exception.class }) 需要把异常抛出到带有@Transactional(rollbackFor = { Exception ...
- 安装好android的adt以后重启eclipse,但是没有创建AVD的图标
安装好android的adt以后重启eclipse,但是没有创建AVD的图标: 解决方法: 1. 先检查ADT是否已经安卓成功 2. Windows--- Customize Perspective ...
- [slim] Slim - Faster, lightweight, a enginer for Ruby
URL: http://slim-lang.com/ Example: doctype html html head title Slim Examples meta name="keywo ...
- 《C语言入门1.2.3—一个老鸟的C语言学习心得》—清华大学出版社炮制的又一本劣书及伪书
<C语言入门1.2.3—一个老鸟的C语言学习心得>—清华大学出版社炮制的又一本劣书及伪书 [薛非评] 区区15页,有80多个错误. 最严重的有: 通篇完全是C++代码,根本不是C语言代码. ...
- HAVING用法详解
HAVING 子句对 GROUP BY 子句设置条件的方式与 WHERE 和 SELECT 的交互方式类似.WHERE 搜索条件在进行分组操作之前应用:而 HAVING 搜索条件在进行分组操作之后应用 ...
- OpenStack主机列表接口
如之前讨论,openstack提供一套接口给运维管理平台,运维管理平台通过获取到的IP地址对主机进行监控. 接口名 请求地址 请求方法 请求cookie 请求头 返回值 返回值使用 登录 ...
- Oracle 11g 在备份导出时缺少表的问题
ORACLE 11G中有个新特性,当表无数据时,不分配segment,以节省空间. 解决方法: 1)insert一行,再rollback就产生segment了 该方法是在在空表中插入数据,再删除,则产 ...
- lamp环境编译(apache2.4.7 php5.4.25 mysql 5.5.23)
环境要求 gcc.gcc-c++.cmake.bison(可能)支持 1.yum install gcc gcc-c++ cmake bison 2.修改yum配置,达到搜索本地设置 移走或改名/et ...
- Mac下使用Automator实现截屏编辑保存
以前在Windows下使用百度或者搜狗输入法的截图工具很方便.❶快捷键(Alt+X,我设置的是这个),❷选择区域,❸编辑所选区域,包括添加文字,线条框框,调色,❹点击『✔️』选择保存位置,修改文件名保 ...