传送门

长链剖分优化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,于是为了快速求值,我们长链剖分预处理出来后缀和即可。

代码:

  1. #include<bits/stdc++.h>
  2. #define ri register int
  3. using namespace std;
  4. inline int read(){
  5. int ans=0;
  6. char ch=getchar();
  7. while(!isdigit(ch))ch=getchar();
  8. while(isdigit(ch))ans=(ans<<3)+(ans<<1)+(ch^48),ch=getchar();
  9. return ans;
  10. }
  11. typedef pair<int,int> pii;
  12. typedef long long ll;
  13. const int N=3e5+5;
  14. int n,q,len[N],mxdep[N],siz[N],fa[N],dep[N],hson[N];
  15. ll ftmp[N<<1],*f[N],*now=ftmp,ans[N];
  16. vector<int>e[N];
  17. vector<pii>qry[N];
  18. void dfs1(int p){
  19. siz[p]=1;
  20. for(ri i=0,v;i<e[p].size();++i){
  21. if((v=e[p][i])==fa[p])continue;
  22. fa[v]=p,dep[v]=mxdep[v]=dep[p]+1,dfs1(v),mxdep[p]=max(mxdep[p],mxdep[v]),siz[p]+=siz[v];
  23. if(mxdep[v]==mxdep[p])hson[p]=v;
  24. }
  25. len[p]=mxdep[p]-dep[p]+1;
  26. }
  27. void dfs2(int p){
  28. f[p][0]=siz[p]-1;
  29. if(hson[p])f[hson[p]]=f[p]+1,dfs2(hson[p]),f[p][0]+=f[hson[p]][0];
  30. for(ri i=0,v;i<e[p].size();++i){
  31. if((v=e[p][i])==fa[p]||v==hson[p])continue;
  32. f[v]=now,now+=len[v],dfs2(v);
  33. for(ri j=0;j<len[v];++j)f[p][j+1]+=f[v][j];
  34. f[p][0]+=f[v][0];
  35. }
  36. for(ri id,k,i=qry[p].size()-1;~i;--i){
  37. id=qry[p][i].first,k=qry[p][i].second;
  38. ans[id]+=(ll)(siz[p]-1)*min(dep[p]-1,k);
  39. if(k>=len[p]-1)ans[id]+=f[p][0]-siz[p]+1;
  40. else ans[id]+=f[p][0]-f[p][k+1]-siz[p]+1;
  41. }
  42. }
  43. int main(){
  44. n=read(),q=read();
  45. for(ri i=1,u,v;i<n;++i)u=read(),v=read(),e[u].push_back(v),e[v].push_back(u);
  46. dep[1]=1,dfs1(1),f[1]=now,now+=len[1];
  47. for(ri i=1,p,k;i<=q;++i)p=read(),k=read(),qry[p].push_back(pii(i,k));
  48. dfs2(1);
  49. for(ri i=1;i<=q;++i)cout<<ans[i]<<'\n';
  50. return 0;
  51. }

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. PAT1103

    1103. Integer Factorization (30) 时间限制 1200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yu ...

  2. reportviewer需要的3个引用

    安装ReportViewer后其中会出现以下DLL.           Microsoft.ReportViewer.ProcessingObjectModel.dll           Micr ...

  3. vue 使用scss

    使用vue-cli模板创建的项目中,使用scss步骤 1. cmd命令: cnpm  install sass-loader --save-dev cnpm install node-sass --s ...

  4. iOS指令集

    公司在进行项目重构时,其中一个地方的改动就是调整了iOS的指令集.更改指令集主要可以对手机应用的安装机型做出控制,同时在研发过程中也可以控制相关的模拟器和真机.它们原则上是向下兼容的,比如iphone ...

  5. echarts中间有字饼图Demo1

    echarts链接:http://gallery.echartsjs.com/editor.html?c=xHy2vIPzLQ 代码: option = { backgroundColor: 'bla ...

  6. server2003远程桌面设置一个用户

    开始--程序--管理工具--终端服务配置--限制每个用户使用一个会话

  7. spring boot项目打包成war并在tomcat上运行的步骤

    把spring-boot项目按照平常的web项目一样发布到tomcat容器下 一.修改打包形式 在pom.xml里设置 <packaging>war</packaging> 二 ...

  8. JDBC的学习

    JDBC —— 用Java访问数据库 一.需要用到第三方类:mysql-connector-java-5.0.8-bin.jar,并做好导包处理: 二.初始化驱动: 三.建立与数据库的链接: 四.创建 ...

  9. JAVA软件安装

    Java配置----JDK开发环境搭建及环境变量配置 文章来源:http://www.cnblogs.com/smyhvae/p/3788534.html Tomcat安装.配置和部署笔记 文章来源: ...

  10. UVA 11235 (RMQ) 频繁出现的数值

    题目大意是给出一个非降序排列的数组,然后n个询问,每次询问一个区间内出现次数最多的数的次数. 首先要弄清楚题目的是一个非降序的数组,那么说明相等的数都会在一起,类似于11223334569这样的,那么 ...