【BZOJ3653】谈笑风生(长链剖分)

题面

BZOJ

洛谷

权限题啊。。。。

题解

首先根据题目给的条件,发现\(a,b\)都要是\(c\)的父亲。

所以这三个点是树上的一条深度单增的链。

因为\(a,b\)之间距离不超过\(k\),并且\(a\)被钦定了,所以只有两种情况:

一种是\(a\)是\(b\)的祖先,贡献是\(\sum_b size[b]-1\),也就是所有\(b\)可以选择的点的子树和。

另外一种\(b\)是\(a\)的祖先,贡献是\(\sum_b size[a]-1\),钦定一个\(b\)之后,\(c\)可以在\(a\)的子树中任选。

第二种情况很简单,因为\(size[a]\)是定值,并且每个点的父亲是唯一的,所以第二部分很容易算。

困难的是第一部分,然而依旧不难把。。。

方法很多,比如说,你把\(dfs\)序和深度看成\(x,y\)轴,这样子就是二维数点,直接主席树。

或者说直接点分治也可以。

当然,既然想写长链剖分,那就当然要用长链剖分来做啊。

我们发现,所有的值都由重儿子向后挪动一位得来,而我们要求的东西需要维护一个区间和。

这样子很不好用前缀和来做,所以我们可以用一个后缀和啊!

这样子就很舒服了,直接维护后缀和,然后长链剖分转移,可以做到复杂度\(O(n)\)。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<vector>
using namespace std;
#define ll long long
#define MAX 300300
inline int read()
{
int x=0;bool t=false;char ch=getchar();
while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
if(ch=='-')t=true,ch=getchar();
while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar();
return t?-x:x;
}
struct Ask{int id,k;};
vector<Ask> p[MAX];
struct Line{int v,next;}e[MAX<<1];
int h[MAX],cnt=1;
inline void Add(int u,int v){e[cnt]=(Line){v,h[u]};h[u]=cnt++;}
ll tmp[MAX],*s[MAX],*id=tmp,ans[MAX];
int md[MAX],dep[MAX],fa[MAX],hson[MAX],size[MAX];
void dfs1(int u,int ff)
{
md[u]=dep[u]=dep[ff]+1;fa[u]=ff;size[u]=1;
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==ff)continue;
dfs1(v,u);size[u]+=size[v];
if(md[v]>md[hson[u]])hson[u]=v;
}
if(hson[u])md[u]=md[hson[u]];
}
void dfs(int u)
{
s[u][0]=size[u]-1;
if(hson[u])s[hson[u]]=s[u]+1,dfs(hson[u]),s[u][0]+=s[hson[u]][0];
for(int i=h[u];i;i=e[i].next)
{
int v=e[i].v;if(v==fa[u]||v==hson[u])continue;
s[v]=id;id+=md[v]-dep[v]+1;dfs(v);
for(int j=0;j<=md[v]-dep[v];++j)s[u][j+1]+=s[v][j];
s[u][0]+=s[v][0];
}
for(int i=p[u].size()-1;~i;--i)
{
int k=p[u][i].k,id=p[u][i].id;
ans[id]+=1ll*(size[u]-1)*min(dep[u]-1,k);
if(k>=md[u]-dep[u])ans[id]+=s[u][0]-size[u]+1;
else ans[id]+=s[u][0]-size[u]+1-s[u][k+1];
}
}
int n,Q;
int main()
{
n=read();Q=read();
for(int i=1;i<n;++i)
{
int u=read(),v=read();
Add(u,v);Add(v,u);
}
dfs1(1,0);
for(int i=1;i<=Q;++i)
{
int u=read(),k=read();
p[u].push_back((Ask){i,k});
}
s[1]=id;id+=md[1];dfs(1);
for(int i=1;i<=Q;++i)printf("%lld\n",ans[i]);
return 0;
}

【BZOJ3653】谈笑风生(长链剖分)的更多相关文章

  1. BZOJ.3653.谈笑风生(长链剖分/线段树合并/树状数组)

    BZOJ 洛谷 \(Description\) 给定一棵树,每次询问给定\(p,k\),求满足\(p,a\)都是\(b\)的祖先,且\(p,a\)距离不超过\(k\)的三元组\(p,a,b\)个数. ...

  2. 2019.01.19 bzoj3653: 谈笑风生(长链剖分优化dp)

    传送门 长链剖分优化dpdpdp水题. 题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数. a,b是c的祖先 ...

  3. BZOJ 3653: 谈笑风生(离线, 长链剖分, 后缀和)

    题意 给你一颗有 \(n\) 个点并且以 \(1\) 为根的树.共有 \(q\) 次询问,每次询问两个参数 \(p, k\) .询问有多少对点 \((p, a, b)\) 满足 \(p,a,b\) 为 ...

  4. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  5. LOJ3053 十二省联考2019 希望 容斥、树形DP、长链剖分

    传送门 官方题解其实讲的挺清楚了,就是锅有点多-- 一些有启发性的部分分 L=N 一个经典(反正我是不会)的容斥:最后的答案=对于每个点能够以它作为集合点的方案数-对于每条边能够以其两个端点作为集合点 ...

  6. 2019.03.11 COGS2652 秘术(天文密葬法)(分数规划+长链剖分)

    传送门 题意:nnn个点的树,每个点两个值a,ba,ba,b,问长度为mmm的路径∑ai∑bi\frac{\sum a_i}{\sum b_i}∑bi​∑ai​​的最大值. 思路:一眼要01分数规划, ...

  7. 【BZOJ3522】【BZOJ4543】【POI2014】Hotel 树形DP 长链剖分 启发式合并

    题目大意 ​ 给你一棵树,求有多少个组点满足\(x\neq y,x\neq z,y\neq z,dist_{x,y}=dist_{x,z}=dist_{y,z}\) ​ \(1\leq n\leq 1 ...

  8. 【Vijos】lxhgww的奇思妙想(长链剖分)

    题面 给定一棵树,每次询问一个点的\(k\)次祖先,强制在线. Vijos 题解 长链剖分. 链接暂时咕咕咕了. 现在可以戳链接看题解了 #include<iostream> #inclu ...

  9. 【BZOJ4543】Hotel加强版(长链剖分)

    [BZOJ4543]Hotel加强版(长链剖分) 题面 BZOJ,没有题面 洛谷,只是普通版本 题解 原来我们的\(O(n^2)\)做法是设\(f[i][j]\)表示以\(i\)为根的子树中,距离\( ...

随机推荐

  1. python 中的re模块,正则表达式

    一.re模块 re模块中常用的方法. match: 默认从字符串开头开始匹配,re.match('fun', 'funny') 可以匹配出来 'fun' match(pattern, string, ...

  2. 现代程序设计 homework-10

    经过大半学期的学习和练习, 我们把学到的东西综合起来. 通过<现代程序设计>这门课,自己的确学到了好多东西.其实并不是说讲课有多棒,一是因为讲课的次数其实并不多,二是讲课的内容其实感觉并没 ...

  3. oracle导出用户下单表或者多表,导入到别的服务器用户下

      导出   exp 用户名/密码 file=存放dmp的名称的目录 statistics=none tables =(表名,表名,表名) exp creditfw/credit file=d:\te ...

  4. composer 自动加载一 通过file加载

    github地址 https://github.com/brady-wang/composer composer init 可以生成一个composer.json文件 { "name&quo ...

  5. [2018.05].NET Core 3 and Support for Windows Desktop Applications

    .NET Core 3 and Support for Windows Desktop Applications Richard 微软官网的内容...net 3.0 升级任务 任重道远 https:/ ...

  6. Mybatis测试用例

    package cn.zhangxueliang.mybatis.mapper; import static org.junit.Assert.*; import java.io.InputStrea ...

  7. easyUI定区关联快递员js代码

    easyUI定区关联快递员js代码: <script type="text/javascript"> $.fn.serializeJson=function(){ va ...

  8. eclipse中添加tomcat

    https://blog.csdn.net/Forlogen/article/details/54090335(copy) 为了Java Web的开发,下面我们来安装一下Tomcat服务器,并将其配置 ...

  9. centos6.5安装配置NTP,集群各机器间时间同步

    试验环境 提君博客原创 >>提君博客原创  http://www.cnblogs.com/tijun/  << IP 主机名 角色 描述 同步方式 192.168.11.11 ...

  10. Day 4-6 xml处理

    xml是实现不同语言或程序之间进行数据交换的协议,跟json差不多,但json使用起来更简单,不过,古时候,在json还没诞生的黑暗年代,大家只能选择用xml呀,至今很多传统公司如金融行业的很多系统的 ...