zoukankan      html  css  js  c++  java
  • ZJOI2016

    小星星
    根据套路进行dp
    (f_{i,j,k})表示i子树内代表原树集合为j,i映射到k的方案数。
    枚举i的儿子p,把p的dp数组合并到i上。
    i的儿子p映射到的节点不能和i已经被合并过的节点映射到的点相同,根据这个转移。
    枚举j的子集l,(f_{i,j,k}+=f_{p,l,v}*f_{i,j-l})且k,v有边
    这个是个子集卷积,可以优化。
    但是要求(n^4)次子集卷积,不可接受
    题目中要求i节点对应原树集合恰好为j的情况,可以修改定。
    由于j时用于去重的,可以删除。
    (f)可以删除一维j。
    此时(f_{i,k})表示(i)节点映射到原图的(k)的方案数,可以重复映射
    则转移方程(f_{i,k}+=f_{j,l})且j,l有边。
    此时(f_{root,k})是root的子树(整棵树)映射到1...n的子集的方案数,可以使用容斥原理计算。
    删除原图的一个集合s,让它不能被选择,再进行dp,乘上容斥系数即可。
    大森林
    电阻网络
    题目要求我们求出两两点对之间是否为串并联图。
    可以使用点双树求出两个点所有简单路径的点的并集。
    根据点双树经典结论,两个点x->y所有简单路径上的点的并集等同于它经过的圆点和方点所对应的环的并集。
    考虑如何一个图是否为串并联图。
    首先删除桥,桥肯定是由串联连成的,不然就会有一个环经过这个桥。
    然后有一个想法:枚举一个点拆开,判定子问题。
    但是这样子需要枚举拆开的点,时间复杂度很高。
    考虑建出合并树。每个节点都是一个二元组(x,y)。
    叶子节点代表原图中的边。
    每个非叶子节点有两种:
    1.代表1操作的点。
    它的二元组(x,y)代表收缩完子树后要进行的操作
    2.代表2操作的点。
    它的二元组(x,y)代表收缩完子树后要进行的操作
    发现如果从叶子->根连边,则任意一个拓扑序都是可行的操作序列。
    而且,每个子树代表了原图一个连通子图。
    考虑串并联图的另一种定义方式:初始有边s->t
    则接下来可以进行2种操作
    1.添加中转点x变成s->x->t
    2.加一条重边。
    然后每次把操作序列和操作的二元组(x,y)插入到答案序列的开头,当过程进行完后,这个答案序列就成为了串并联图的答案序列。
    考虑感性理解这个过程的正确性。
    如果当前图最后一次操作是并联,
    无论把拆开(s,t)后的点怎么合并,由于这个过程是正确的,所以一定会合并成一些重边。
    如果最后一次是串联同理。
    实际上,再把上面这个生成的过程倒过来。每次变成删除一个二度点/删除一条重边,则可以删除一个二度点/删除一条重边,如果能变成一条边则可行。
    发现剩余的两个点就是起/终点。
    如果当前图是
    可以使用队列+unordered_map维护。
    每次删点/寻找重边。
    如果删完重边后存在一个点的入度为2,则把这个点添加进队列。
    时间复杂度O(n+m)
    实际上,上面判定的过程就是从叶子收缩到根,所以再次证明了它的正确性。
    题目要求设定起/终点,则这两个点不能被删除。
    可以对这两个点进行特判,在删点的时候不能删现在这两个点,时间复杂度还是O(n+m)。
    观察数据范围,发现要对于每两个点做这个过程,不太能做。
    回到本题。考虑对(x,y)分类讨论是否可行。
    结论是:(x,y)的lca要在(x,y),且这个节点要是一个一类点。
    https://gitee.com/riteme/blogimg/raw/master/circuit/proof-1.svg
    这张图讲的十分清楚。
    但是有一个问题。
    如果根节点的度数为2,则怎么合并都行。
    解决方法:
    先特判掉单环的情况。
    每次先合并度数为2的节点再删除重边即可。
    在点双树上dp,时间复杂度O(n+m)
    旅行者
    根据套路进行分治。
    把最大的边切开,变成((l,md),(md+1,r)),处理过中线的询问,接着继续递归。
    处理的方法是对于每一个节点跑最短路,用中线((s->md)+(md->t))更新答案。
    这样一次询问时间复杂度是中线长度。由于每次选择较长的边切开,所以询问的时间复杂度不会超过(sqrt(n*m))
    网上neither_nor的证明是错的。因为长边/2以后不一定会变为短边。
    这道题要用主定理证明时间复杂度。
    设x为短边长度,y为长边长度,则(x^2*y*log(xy))就为每次最短路时间复杂度。
    由于(x<=y),所以(x<=sqrt(n))
    (x^2*y*log(xy)<=ssqrt(s)*log(xy))
    递归式是(O(s)=2O(frac{s}{2})+ssqrt{s}log_2(s))
    直接套用主定理。在此题中a=b=2,log_b a=1
    由于f(s)>=Ω(s^{1.5})
    所以时间复杂度就是(O(s sqrt{s}log_2s))
    线段树
    随机树生成器
    不存在题解。

  • 相关阅读:
    Blender 2.8 [学习笔记-001] 基本设置
    Blender 2.8 [学习笔记] 编辑模式下显示边长、面积等信息
    第十八章节 BJROBOT 安卓手机 APP 建地图【ROS全开源阿克曼转向智能网联无人驾驶车】
    第十七章节 BJROBOT opencv_apps 图像处理示例【ROS全开源阿克曼转向智能网联无人驾驶车】
    第十六章节 BJROBOT 开机自启动服务【ROS全开源阿克曼转向智能网联无人驾驶车】
    第十五章节 BJROBOT cartographer 算法构建地图【ROS全开源阿克曼转向智能网联无人驾驶车】
    第14章节 BJROBOT karto 算法构建地图【ROS全开源阿克曼转向智能网联无人驾驶车】
    第13章节 BJROBOT 雷达跟随【ROS全开源阿克曼转向智能网联无人驾驶车】
    第十二章节 BJROBOT 摄像头寻线 【ROS全开源阿克曼转向智能网联无人驾驶车】
    第十章节 BJROBOT PID 动态调节【ROS全开源阿克曼转向智能网联无人驾驶车】
  • 原文地址:https://www.cnblogs.com/cszmc2004/p/13253098.html
Copyright © 2011-2022 走看看