传送门

长链剖分优化dpdpdp水题。

题意简述:给一棵树,mmm次询问,每次给一个点aaa和一个值kkk,询问满足如下条件的三元组(a,b,c)(a,b,c)(a,b,c)的个数。

  1. a,b是c的祖先
  2. a,b的距离不超过k

思路:

考虑单独处理每一个询问怎么做。

显然a,ba,ba,b的位置关系有两种。

  1. bbb是aaa的祖先,此时ccc一定在aaa子树中,这种情况的三元组个数是(sizea−1)∗min(k,depa−1)(size_a-1)*min(k,dep_a-1)(sizea​−1)∗min(k,depa​−1)
  2. aaa是bbb的祖先,此时ccc一定在bbb子树中,这种情况的三元组个数是∑b∈subtreea&&dist(a,b)≤ksizeb−1\sum_{b\in subtree_a\&\&dist(a,b)\le k}size_b-1∑b∈subtreea​&&dist(a,b)≤k​sizeb​−1,于是为了快速求值,我们长链剖分预处理出来后缀和即可。

代码:

#include<bits/stdc++.h>
#define ri register int
using namespace std;
inline int read(){
	int ans=0;
	char ch=getchar();
	while(!isdigit(ch))ch=getchar();
	while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
	return ans;
}
typedef pair<int,int> pii;
typedef long long ll;
const int N=3e5+5;
int n,q,len[N],mxdep[N],siz[N],fa[N],dep[N],hson[N];
ll ftmp[N<<1],*f[N],*now=ftmp,ans[N];
vector<int>e[N];
vector<pii>qry[N];
void dfs1(int p){
	siz[p]=1;
	for(ri i=0,v;i<e[p].size();++i){
		if((v=e[p][i])==fa[p])continue;
		fa[v]=p,dep[v]=mxdep[v]=dep[p]+1,dfs1(v),mxdep[p]=max(mxdep[p],mxdep[v]),siz[p]+=siz[v];
		if(mxdep[v]==mxdep[p])hson[p]=v;
	}
	len[p]=mxdep[p]-dep[p]+1;
}
void dfs2(int p){
	f[p][0]=siz[p]-1;
	if(hson[p])f[hson[p]]=f[p]+1,dfs2(hson[p]),f[p][0]+=f[hson[p]][0];
	for(ri i=0,v;i<e[p].size();++i){
		if((v=e[p][i])==fa[p]||v==hson[p])continue;
		f[v]=now,now+=len[v],dfs2(v);
		for(ri j=0;j<len[v];++j)f[p][j+1]+=f[v][j];
		f[p][0]+=f[v][0];
	}
	for(ri id,k,i=qry[p].size()-1;~i;--i){
		id=qry[p][i].first,k=qry[p][i].second;
		ans[id]+=(ll)(siz[p]-1)*min(dep[p]-1,k);
		if(k>=len[p]-1)ans[id]+=f[p][0]-siz[p]+1;
		else ans[id]+=f[p][0]-f[p][k+1]-siz[p]+1;
	}
}
int main(){
	n=read(),q=read();
	for(ri i=1,u,v;i<n;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);
	dep[1]=1,dfs1(1),f[1]=now,now+=len[1];
	for(ri i=1,p,k;i<=q;++i)p=read(),k=read(),qry[p].push_back(pii(i,k));
	dfs2(1);
	for(ri i=1;i<=q;++i)cout<<ans[i]<<'\n';
	return 0;
}

2019.01.19 bzoj3653: 谈笑风生(长链剖分优化dp)的更多相关文章

  1. 【CF1009F】Dominant Indices(长链剖分优化DP)

    点此看题面 大致题意: 设\(d(x,y)\)表示\(x\)子树内到\(x\)距离为\(y\)的点的个数,对于每个\(x\),求满足\(d(x,y)\)最大的最小的\(y\). 暴力\(DP\) 首先 ...

  2. CF1009F Dominant Indices——长链剖分优化DP

    原题链接 \(EDU\)出一道长链剖分优化\(dp\)裸题? 简化版题意 问你每个点的子树中与它距离为多少的点的数量最多,如果有多解,最小化距离 思路 方法1. 用\(dsu\ on\ tree\)做 ...

  3. 长链剖分优化dp三例题

    首先,重链剖分我们有所认识,在dsu on tree和数据结构维护链时我们都用过他的性质. 在这里,我们要介绍一种新的剖分方式,我们求出这个点到子树中的最长链长,这个链长最终从哪个儿子更新而来,那个儿 ...

  4. 2018.11.03 NOIP模拟 树(长链剖分优化dp)

    传送门 考虑直接推式子不用优化怎么做. 显然每一个二进制位分开计算贡献就行. 即记录fi,jf_{i,j}fi,j​表示距离iii这个点不超过jjj的点的每个二进制位的0/10/10/1个数. 但直接 ...

  5. BZOJ4543[POI2014]Hotel加强版——长链剖分+树形DP

    题意参见BZOJ3522 n<=100000 数据范围增强了,显然之前的转移方程不行了,那么不妨换一种. 因为不能枚举根来换根DP,那么我们描述的DP方程每个点要计算三个点都在这个点的子树内的方 ...

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

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

  7. BZOJ.4543.[POI2014]Hotel加强版(长链剖分 树形DP)

    题目链接 弱化版:https://www.cnblogs.com/SovietPower/p/8663817.html. 令\(f[x][i]\)表示\(x\)的子树中深度为\(i\)的点的个数,\( ...

  8. 长链剖分优化树形DP总结

    长链剖分 规定若\(x\)为叶结点,则\(len[x]=1\). 否则定义\(preferredchild[x]\)(以下简称\(pc[x]\),称\(pc[x]\)为\(x\)的长儿子)为\(x\) ...

  9. bzoj4543 [POI2014]Hotel加强版 长链剖分+树形DP

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4543 题解 这道题的弱化版 bzoj3522 [POI2014]Hotel 的做法有好几种吧. ...

随机推荐

  1. FZU2150 :Fire Game (双起点BFS)

    传送门:点我 题意:“#”是草,"."是墙,询问能不能点燃俩地方,即点燃俩“#”,把所有的草烧完,如果可以,那么输出最小需要的时间,如果不行输出-1 思路:暴力BFS,看到n和m都 ...

  2. Bitmap byte[] InputStream Drawable 互转

    import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.InputStrea ...

  3. 【mysql】字段支持JSON类型

    mysql从5.7开始已经支持JSON类型的字段. 支持的操作:添加,修改,置空,子key添加,子key重置,子key删除,通过子key查找等. 但是这里和普通字段的修改和查找不同,涉及到一些JSON ...

  4. TZOJ 1911 A Plug for UNIX(最大流)

    描述 You are in charge of setting up the press room for the inaugural meeting of the United Nations In ...

  5. Android camera2 回调imagereader 从Image拿到YUV数据转化成RGB,生成bitmap并保存

    ImageUtil.java import android.graphics.ImageFormat; import android.media.Image; import android.os.Bu ...

  6. Python使用SMTP发送邮件(163,yeah等网易邮箱已测试可以)

    #! /usr/bin/env python# -*- coding: UTF-8 -*-import smtplibfrom email.mime.text import MIMETextmailt ...

  7. node.js中事件触发器events的使用

    node.js是基于事件驱动的,通过events,我们可以方便的创建事件,并通过触发事件来调用我们自定义的监听函数. 所有能触发事件的对象都应该是 EventEmitter 类的实例,一般我们自定义一 ...

  8. c语言练习题:求1-1/2+1/3-1/4+... -1/100的值

    /******************************************* 求1-1/2+1/3-1/4+... -1/100的值 *************************** ...

  9. sql like 语句

    a like '%b%'的意思是,在a中找类似b的字符,在检索以逗号分隔的字段中时,两次弄反了顺序,比如,在a字段中查找有没有类似‘2,3’的记录,应该这么写:','+'2,3' like '%,'+ ...

  10. Charles基本使用

    Charles使用 查找电脑IP,菜单选项helpàLocal IP Addresses 手机连接代理 手机打开WiFi,把代理模式设置为手动,设置主机名为Charles所在机器的ip,端口号为Cha ...