传送门

文章目录

  • 题意:
  • 思路:

题意:

思路:

由于a,ba,ba,b都比ccc厉害,那么a,ba,ba,b一定是某个是某个的祖先。那么就分为两种情况了:
(1)(1)(1) bbb在aaa上面,约定depth[1]=1depth[1]=1depth[1]=1,此时答案显然为min(depth[a]−1,k)∗(se[a]−1)min(depth[a]-1,k)*(se[a]-1)min(depth[a]−1,k)∗(se[a]−1)。
(2)(2)(2)bbb在aaa的下下面,这个时候就不是那么容易搞了,问题转化成我们要求aaa这个子树中depthdepthdepth范围在[depth[a]+1,depth[a]+k][depth[a]+1,depth[a]+k][depth[a]+1,depth[a]+k]内的所有点的se[i]−1se[i]-1se[i]−1,先考虑暴力怎么写呢?显然我们可以暴力对这颗子树的深度建线段树,这样就变成了区间查询的问题了。而这样复杂度是肯定不行的,所以我们考虑建可持久化线段树,根据树的dfsdfsdfs序建主席树,以节点深度为下标,那么查询就变成了query(root[dfn[p]],root[dfn[p]+se[p]−1],1,n,depth[p]+1,min(depth[p]+k,n))query(root[dfn[p]],root[dfn[p]+se[p]-1],1,n,depth[p]+1,min(depth[p]+k,n))query(root[dfn[p]],root[dfn[p]+se[p]−1],1,n,depth[p]+1,min(depth[p]+k,n)),再加上(1)(1)(1)的答案即可。

我们还可以将其转换成二维数点的问题。
通过以上分析不难发现我们要找的点就是
深度范围是[depth[p]+1,depth[p]+k][depth[p]+1,depth[p]+k][depth[p]+1,depth[p]+k],dfsdfsdfs序范围是[dfn[p],dfn[p]+se[p]−1][dfn[p],dfn[p]+se[p]-1][dfn[p],dfn[p]+se[p]−1],那么我们以深度建立xxx轴,以dfsdfsdfs序建立yyy轴,让后统计就好啦。

主席树O(nlogn)O(nlogn)O(nlogn)

//#pragma GCC optimize(2)
#include<cstdio>
#include<iostream>
#include<string>
#include<cstring>
#include<map>
#include<cmath>
#include<cctype>
#include<vector>
#include<set>
#include<queue>
#include<algorithm>
#include<sstream>
#include<ctime>
#include<cstdlib>
#define X first
#define Y second
#define L (u<<1)
#define R (u<<1|1)
#define pb push_back
#define mk make_pair
#define Mid (tr[u].l+tr[u].r>>1)
#define Len(u) (tr[u].r-tr[u].l+1)
#define random(a,b) ((a)+rand()%((b)-(a)+1))
#define db puts("---")
using namespace std;//void rd_cre() { freopen("d://dp//data.txt","w",stdout); srand(time(NULL)); }
//void rd_ac() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//AC.txt","w",stdout); }
//void rd_wa() { freopen("d://dp//data.txt","r",stdin); freopen("d://dp//WA.txt","w",stdout); }typedef long long LL;
typedef unsigned long long ULL;
typedef pair<int,int> PII;const int N=1000010,mod=1e9+7,INF=0x3f3f3f3f;
const double eps=1e-6;int n,m;
int root[N],tot,idx;
int dfn[N],se[N],depth[N];
vector<int>v[N];
struct Node
{int l,r;LL sum;
}tr[N*40];void insert(int p,int &q,int l,int r,int pos,int x)
{q=++tot; tr[q]=tr[p];tr[q].sum+=x;if(l==r) return;int mid=l+r>>1;if(pos<=mid) insert(tr[p].l,tr[q].l,l,mid,pos,x);else insert(tr[p].r,tr[q].r,mid+1,r,pos,x);
}LL query(int p,int q,int l,int r,int ql,int qr)
{if(l>=ql&&r<=qr) return tr[q].sum-tr[p].sum;LL ans=0;int mid=l+r>>1;if(ql<=mid) ans+=query(tr[p].l,tr[q].l,l,mid,ql,qr);if(qr>mid) ans+=query(tr[p].r,tr[q].r,mid+1,r,ql,qr);return ans;
}void dfs1(int u,int fa)
{se[u]=1; dfn[u]=++idx;depth[u]=depth[fa]+1;for(auto x:v[u]) if(x!=fa) dfs1(x,u),se[u]+=se[x];
}void dfs2(int u,int fa)
{insert(root[dfn[u]-1],root[dfn[u]],1,n,depth[u],se[u]-1);for(auto x:v[u]) if(x!=fa) dfs2(x,u);
}int main()
{//  ios::sync_with_stdio(false);
//  cin.tie(0);scanf("%d%d",&n,&m);for(int i=1;i<=n-1;i++){int a,b; scanf("%d%d",&a,&b);v[a].pb(b); v[b].pb(a);}dfs1(1,0); dfs2(1,0);while(m--){int p,k; scanf("%d%d",&p,&k);LL ans=1ll*min(depth[p]-1,k)*(se[p]-1);ans+=query(root[dfn[p]],root[dfn[p]+se[p]-1],1,n,depth[p]+1,min(depth[p]+k,n));printf("%lld\n",ans);}return 0;
}
/**/

P3899 [湖南集训]谈笑风生 主席树解决二维数点相关推荐

  1. luogu P3899 [湖南集训]谈笑风生 线段树合并

    Description 设T 为一棵有根树,我们做如下的定义: ? 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道 高明到哪里去了". ? 设a 和 b 为 ...

  2. 洛谷 - P3899 [湖南集训]谈笑风生(dfs序+主席树/二维数点)

    题目链接:点击查看 题目大意:设 TTT 为一棵有根树,我们做如下的定义: 设 aaa 和 bbb 为 TTT 中的两个不同节点.如果 aaa 是 bbb 的祖先,那么称"aaa 比 bbb ...

  3. P3899 [湖南集训]谈笑风生(线段树合并)

    P3899 [湖南集训]谈笑风生 给定一颗以111号节点为根的树,如果a≠ba \neq ba​=b,且aaa是bbb的祖先,则aaa比bbb更厉害,如果a≠ba \neq ba​=b,且dis( ...

  4. P3899 [湖南集训]谈笑风生

    P3899 [湖南集训]谈笑风生 题目描述 Solution 我们考虑离线询问,将询问放在相对应的子树ppp中计算答案. 显然a,b,ca,b,ca,b,c的位置关系有两种情况: bbb是aaa的祖先 ...

  5. P2468 [SDOI2010]粟粟的书架 主席树 + 二分 + 二维前缀和

    传送门 文章目录 题意: 题意: 题意: 给你一个n∗mn*mn∗m的矩阵,每次询问一个矩形,左上角是(x1,y1)(x_1,y_1)(x1​,y1​),右上角是(x2,y2)(x_2,y_2)(x2 ...

  6. 洛谷P3899 [湖南集训]谈笑风生

    Description 设T 为一棵有根树,我们做如下的定义: • 设a和b为T 中的两个不同节点.如果a是b的祖先,那么称"a比b不知道 高明到哪里去了". • 设a 和 b 为 ...

  7. P3899 [湖南集训]更为厉害(线段树合并、长链剖分、二维数点)

    P3899 [湖南集训]更为厉害 若 deepb<deepa\text{deep}_b<\text{deep}_adeepb​<deepa​:c 在点 a 的子树中,根据乘法原理计算 ...

  8. 洛谷 - P2163 [SHOI2007]园丁的烦恼(不带修二维数点-树状数组/主席树)

    题目链接:点击查看 题目大意:二维平面坐标系中给出 nnn 个坐标点,然后是 mmm 次询问,每次询问需要回答一个闭合矩阵中有多少个点 题目分析:想挂树套树来着,但是复杂度有点大.本题不带修且可以离线 ...

  9. loj #535. 「LibreOJ Round #6」花火 树状数组求逆序对+主席树二维数点+整体二分...

    $ \color{#0066ff}{ 题目描述 }$ 「Hanabi, hanabi--」 一听说祭典上没有烟火,Karen 一脸沮丧. 「有的哦-- 虽然比不上大型烟花就是了.」 还好 Shinob ...

最新文章

  1. js高级---js运行原理
  2. SQL Server Management Studio 过期无法使用解决办法
  3. MySQL笔记-CURRENT_TIMESTAMP()和ON UPDATE及索引相关
  4. android 底部导航,Android 底部导航之BottomNavigationBar
  5. (转)为Spring集成的Hibernate配置二级缓存
  6. python错了能改写吗_python 日常错误
  7. Leetcode题目:Merge Sorted Array
  8. python pyquery不规则数据的抓取_11. 数据提取-PyQuery
  9. 啊哈算法2伟大思维闪耀时_五分钟学编程:怎样才能学好笔试面试最爱考察的算法...
  10. Oracle定时任务使用
  11. 【AC.HASH】OpenHarmony啃论文俱乐部——哈希技术:综述和分类(译)
  12. 可以指定列fillna吗_京东e卡可以购买指定的京东自营商品?是真的吗
  13. OpenHarmony 简介:使用鸿蒙操作系统,开发者能做的是啥呢,学习NodJS,可以开发应用了。后续慢慢学习,赶紧去加星星。
  14. 学习maven的系列教程(正)
  15. PAT题目详解-----愿天下有情人都是失散多年的兄妹
  16. 报告|国产工业机器人产业研究报告:2019年国产机器人十大品牌
  17. STM32开发利器:STM32CubeMX
  18. 小学校本培简讯 计算机技术,【图】以爱育心,并肩同行——赤岗小学2014学年第一学期班主任校本培训简讯_海珠_广州教育信息网...
  19. 零基础同学自学编程的正确姿势
  20. 威纶通屏幕(HMI)开发进阶教程四:通过PLC控制,使宏指令跳转到不同的窗口

热门文章

  1. php数据表格的重载,layui数据表格实现重载数据表格功能(搜索功能)
  2. python ctypes 指针_Python Ctypes传递.h文件中定义的结构指针。
  3. for循环延时_前端中的事件循环eventloop机制
  4. 有生之年必看!千古第一奇书《山海经》到底是怎样的一本书?
  5. 应对程序员面试,你必须知道的8大数据结构
  6. 无法定位程序输入点dxgiget_美国ABB TZIDC 智能定位器调试方法
  7. php运算符优先级题目,详解php运算符优先级
  8. mysql连接主备_mysql主备配置方法
  9. html游戏怎么做,HTML5 制做“游戏”的一个基本流程
  10. java抓取新闻_【图片】【抓取】Java获取各大网站新闻【java吧】_百度贴吧