zoukankan      html  css  js  c++  java
  • C. 【UNR #3】配对树

    题解:


    首先可以贪心 于是问题可以等价成一条边被算当且仅当子树中个数为奇数个

    题解的做法比较简单

    考虑每条边,加入其子树内的点

    然后为了保证区间长度为偶数

    分成f0,0 f0,1 f1,0 f1,1即可

    暴力插入复杂度不对改成启发式合并即可

    这里插入的时候可用线段树维护 把x-n这一段翻转即可

    这样是两个log

    一般可以用线段树合并优化启发式合并

    但是这里改成线段树合并的话要换一种维护方式

    我们维护左儿子ddl的个数来决定右儿子中的信息是直接加还是需要翻转

    这样就可以线段树合并了

    复杂度一个log

    另外我开始想了一个2个log的做法

    为了保证区间长度为偶数 我们分成从奇数还是偶数开始两种情况,之后把两个看成一组

    于是我们现在要维护的就是,到当前考虑的序列的点

    树上的每个点,其子树内有偶数个点的方案数、奇数个点的方案数

    然后观察插入两个点的时候

    当且仅当这个点在两个点的路径上(除lca) 增加了奇数个点,其余都是增加偶数个点

    取出两点路径可以利用树链剖分

    然后要支持两种操作 1.偶数=原本奇数,奇数=原本偶数+1 2.偶数=原本偶数+1,奇数=原本奇数

    这个我们采用线段树维护

    维护三个标记 rev、偶数+、奇数+即可

  • 相关阅读:
    java File获取字节流
    mybatis返回自增主键问题踩坑
    电脑右键没有新建选项解决
    mysql 索引
    高并发-原子性-AtomicInteger
    Cannot find the declaration of element 'ehcache'.
    CSRF拦截
    java责任链模式
    java实现一个简单的计数器
    Java并发编程
  • 原文地址:https://www.cnblogs.com/yinwuxiao/p/11130550.html
Copyright © 2011-2022 走看看