题目大意:首先给你所有的A集合,第i个集合里的数全部小于i,接着开始构造B集合,第i个B集合是由{i}∪前面所有满足条件的Bk集合的交,满足条件的Bk集合指的是满足k∈Ai,然后给Q个询问,每次询问一堆B集合的并的元素个数

这题考试的时候我看了挺长时间....到最后也没想出来...考完了之后xuruifan告诉我是虚树,然后我就震惊了,因为我没看出来跟树有半毛钱关系...

然后就只能回去接着看题,最后发现只有深刻理解了题目让你干的事情的本质才能进行下一步

我们可以把B集合想象成一棵树,根为0,每个节点到根所经过的节点(不包括0)就代表B集合

然后我们开始想象这棵树的建立,对于第i个B集合,假如他之前的树都已经建好了,那么指定集合的交相当于指定节点的LCA,这个LCA到根的路径就是这些集合的交,然后我们在她的下面接一个i节点,就相当于并上了一个{i}

这样我们就可以在O(NlogN)的时间复杂度内建出B集合树

然后有Q个询问,因为询问总节点个数是有限制的,所以我们只需要像虚树那样O(tot logtot)的时间内算出所有的关键节点到根的路径的并

开启读入优化会效果显著

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define N 3000010
using namespace std;
int to[N],nxt[N],pre[N],cnt;
void ae(int ff,int tt)
{cnt++;to[cnt]=tt;nxt[cnt]=pre[ff];pre[ff]=cnt;
}
int fa[N][21],d[N],cf[21];
int LCA(int x,int y)
{int i=17;if(d[x]<d[y]) swap(x,y);while(d[x]>d[y]){if(d[x]-d[y]>=cf[i]) x=fa[x][i];i--;}if(x==y) return x;i=17;while(fa[x][0]!=fa[y][0]){if(fa[x][i]!=fa[y][i]) x=fa[x][i],y=fa[y][i];i--;}return fa[x][0];
}
int dfn[N],cn;
void build(int x)
{int i,j;cn++;dfn[x]=cn;for(i=pre[x];i;i=nxt[i]){j=to[i];build(j);}
}
int a[N];
bool cmp(int x,int y){return dfn[x]<dfn[y];}
int main()
{int n;scanf("%d",&n);int i,j,x,y,tar;cf[0]=1;for(i=1;i<=20;i++)cf[i]=cf[i-1]*2;for(i=1;i<=n;i++){scanf("%d",&x);if(!x) tar=0;else scanf("%d",&tar);for(j=2;j<=x;j++){scanf("%d",&y);tar=LCA(tar,y);}ae(tar,i);fa[i][0]=tar;d[i]=d[tar]+1;for(j=1;j<=17;j++)fa[i][j]=fa[fa[i][j-1]][j-1];}build(0);int Q;scanf("%d",&Q);while(Q--){int ans=0;scanf("%d",&x);for(i=1;i<=x;i++)scanf("%d",&a[i]);sort(a+1,a+x+1,cmp);for(i=1;i<x;i++)ans+=d[a[i]]-d[LCA(a[i],a[i+1])];ans+=d[a[x]];printf("%d\n",ans);}
}

BZOJ2851: 极限满月相关推荐

  1. BZOJ2851 极限满月

    我们造一颗树,把B集合对应到树上,点i的B集合即为i到根的路径上的所有点,这样在构造点x的B集合的时候就相当于把所有A集合里的点取LCA,然后再LCA下面接上x 询问就相当于求询问点到根的路径并的长度 ...

  2. BZOJ2851 Violet 0 极限满月

    (这个题目想法太神了..我看了好多神犇的讨论才弄懂.. (鉴于我看的时候理解得很困难,我就讲详细点. 要存储下所有的元素.直接放在一个树结构或者什么里面显然是不行的.. 考虑第i个集合里的所有数字都不 ...

  3. [bzoj] 2851: 极限满月

    这道题初看时没想到过树,看了题解才知道可以建虚树. 对题目分析可以将b数组想成一颗树,第i个b数组就是点i到根节点的上路径的所有点的集合. 那么在构造树时就相当于将a数组中的所有点取lca ,再将i节 ...

  4. 潘淳(寒树Office):不务正业的公众号满月了,都写了些啥?

    三喜临门 一    喜 今天真是个好日子,"流浪太阳"又回来了,阴雨绵绵长恨无期,今天苏州终于天晴,于是心情大好!都说好心情会带来好运气,冥冥感觉要写点啥了,果不其然今天还有另外两 ...

  5. 数学——函数极限知识以及sympy库的limit

    函数极限与Sympy库 欢迎访问我的博客 这部分可以参考sympy库中的limit 在$z_0$点处计算$e(z)$函数的极限 \(\lim_{z \to z_0} e(z)\) = limit(e, ...

  6. 极限学习机的matlab程序_新程序员七宗罪,新手别踩雷

    每一次过渡到一个新的职业都需要学习曲线;在完全适应新的工作环境之前,我们都必须经历这个过程.具有较强的适应能力和对变化的灵活性的人可能会发现它是平稳和简单的;其他的人可能需要更多的时间和精力. 无论你 ...

  7. 【MATLAB】数据分析之求函数的极限(limit)

    在MATLAB中采用limit函数求某个具体函数的极限,其调用格式如下: limit(expr,x,a):当xa时,对函数expr求极限,返回值为函数极限. limit(expr):默认当x0时,对函 ...

  8. 深度学习的发展可能已达极限!

    [编者按]回首 2018 年,身处技术圈的你是否曾反思过些什么--科技与非科技企业界限的日益模糊.技术的发展现状和前景.科技发展的正向助推到负面效应,乃至个人心态上的变化.人文.生态.社会--玩技术的 ...

  9. 100万人同时抢1万张火车票,极限并发带来的思考

    欢迎关注方志朋的博客,回复"666"获面试宝典 每到节假日期间,一二线城市返乡.外出游玩的人们几乎都面临着一个问题:抢火车票!虽然现在大多数情况下都能订到票,但是放票瞬间即无票的场 ...

最新文章

  1. 我的《机器学习》课程的课件合集下载
  2. centos mysql 5.6.19_Centos5.8 安装 MySQL5.6.19
  3. GraphQL在SAP Kyma中的广泛应用
  4. centos系统服务器关机,centos 7 重启服务器
  5. java xpdf 转换成html_java将Word/Excel/PDF文件转换成HTML整理
  6. virtualbox虚拟机安装Ubuntu异常处理:FATAL: NO bootable medium found! System halted
  7. YC StartupSchool 2018 2019 笔记
  8. 2019秋季学习计划
  9. java 前端导出exvel_java导出数据到Excel文件 前端进行下载
  10. mysql group by order_(Mysql5.7踩坑)Mysql关于同时使用Group by 和Order by问题
  11. iOS -- SKPhysicsJointSpring类
  12. php宠物社交领养网站
  13. python机器学习分析影响房价的主要因素
  14. 计算机网络(自顶向下方法)-应用层
  15. 服务器版系统和w7区别,小编告诉大家W7精简版和旗舰版啥区别
  16. cad坐标归零lisp_CAD坐标Z归0问题
  17. Python混合图片操作
  18. ur机器人编程-创建程序
  19. telnet不是内部或外部命令怎么办
  20. [JZOJ5454]仔细的检查

热门文章

  1. 2022-2028全球瓶盖用HDPE原料行业调研及趋势分析报告
  2. java中import一个项目时出现中文全是繁体字时的解决情况
  3. 为什么公司里普遍存在内斗现象?
  4. 小马哥--高仿苹果6s 主板W1113 6571芯片刷机拆机主板图与开机识别图
  5. 你以为技术圈只有女汉子 我们用颜值和才艺征服你
  6. java 函数给默认值_函数参数的默认值
  7. C#基础之秒表的简单实现
  8. 明胶纳米颗粒GNPs,50-100nm,呈光滑球形,颗粒尺寸分布较为均匀/齐岳生物
  9. 【论文代码】VIBE 基于视频的人体3D形状和姿态估计
  10. 这6种开源协议(GPL,LGPL,BSD,MIT,Apache)