zoukankan      html  css  js  c++  java
  • 省选模拟35 题解

    A. two

    考虑现在要通过蓝边删掉红边。

    其实等价于要找出有哪些红边,满足恰好只有一个端点在蓝边的儿子方向子树中。

    考虑对蓝树跑出一个 $dfs$ 序来,那么问题转化为恰好一个端点在给定区间中。

    这像是一个二维偏序问题。考虑以线段树下标为其中的第一维,第二维进行排序处理。

    然后用一个 $set$ 就可以简单维护了,但是这样做的复杂度是两个 $log$ 的。

    考虑一个特殊的操作,开两棵线段树,第一棵以连接两个点中小的 $dfs$ 序为下标,大的为权值,第二棵则相反。

    那么问题就转化为取一段前缀或后缀了,因为本题只需要每个边操作一次,用单调指针就可以维护了。 

    B. bracket

    显然要搞一个点分治。然后只要统计经过当前分治父亲的路径。

    然后就是常见的我想不到的。

    发现从分治父亲到一个子孙的路径合法的条件是,路径权值的总和是路径上的最值。

    而出现次数就是这个最终出现的次数,两条路径配对的条件是总和互为相反数。

    把这些东西都处理出来,发现问题是个卷积。

    但是直接分析复杂度似乎是三个 $log$ 的。

    考虑如果说对于一个权值和出现的子孙个数为 $t$,那么多项式的级数也是 $t$ 级别的,因为次方数增加 $1$ 至少导致节点数增加 $1$。

    所以直接做一个 $fft$ 优化一下卷积就结束了。

    C. sum

    一个结论,考虑最终被选上的数含有的质因子不超过两个。

    并且如果质因子个数为 $2$,那么一定可以表示为$p_1^k*p_2$,其中 $p_1 leq sqrt n,p_2 > sqrt n$。

    有了这个结论,可以发现把质因子按照是否大于 $sqrt n$ 分在二分图的两部分,直接跑一个最大费用可行流就可以解决问题。

    然而这个玩意跑的有点慢,所以过不去。

    考虑一个优化,首先分别令每个质因子统计一下答案,然后只把能够增广的边建出来就完事了。

  • 相关阅读:
    基于VitralBox 的 OpenEuler系统 安装增强功能
    OpenEuler 操作系统 安装 银河麒麟GUI界面
    OpenEuler 操作系统的安装
    vscode 安装markdown插件 及 实用markdown语法
    无限技能下的密码系统愿景
    商用密码企业调研
    实验四 Python综合实践 ——20191331刘宇轩
    20191331 《Python程序设计》实验三报告
    9.29载入史册的一天
    人生的四天半
  • 原文地址:https://www.cnblogs.com/skyh/p/12398084.html
Copyright © 2011-2022 走看看