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$ 分在二分图的两部分,直接跑一个最大费用可行流就可以解决问题。

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

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

  • 相关阅读:
    Java 基础(接口的应用:代理模式 Proxy)
    Appium 环境配置
    破解CCleaner
    数据驱动
    (C语言内存二十)C语言内存泄露(内存丢失)
    (C语言内存十九)C语言野指针以及非法内存操作
    (C语言内存十八)malloc函数背后的实现原理——内存池
    (C语言内存十七)栈溢出攻击的原理是什么?
    (C语言内存十六)C语言动态内存分配
    (C语言内存十五)用一个实例来深入剖析函数进栈出栈的过程
  • 原文地址:https://www.cnblogs.com/skyh/p/12398084.html
Copyright © 2011-2022 走看看