zoukankan      html  css  js  c++  java
  • 2019 ICPC 南昌 Regional 部分题解

    B - A Funny Bipartite Graph

    参考题解:https://blog.csdn.net/cat_pikapikapi/article/details/103494593

     

    二分图左部点和右部点个数都<=18

    代价:$sum M_i^{D_i}$ $M_i$是左部点的一个权值 $D_i$是左部点新图中的度数

     法一:

    爆搜+最优化剪枝+合理化剪枝=可过?

    法二:

    易证,新图所有右部点最多连一个边。

    所有右边的点,原图度数总和最多是54

    若爆搜右边点的连边,那么最多的复杂度,就是右边所有点度数都是3(用均值不等式可以证明!)

    这样是$3^n$,加剪枝就可过了。

    法三:(我的)

    暴力枚举左部点选择情况+网络流决定边的选择情况

    Mi=1要特殊处理。

    加上各种剪枝跑得飞快?

    (260行代码,写去吧)

    法四:(看上面博客)

    折半爆搜+子集求前缀和

    (利用左部点只会向编号更大的右部点连边)

    K - Tree

     求树上点对,满足:

     n,k是1e5

    注意:up to是<=k

    做法:

    法一:DSU On Tree

    全局桶---->全局n棵动态开点权值线段树(维护区间和)

    线段树的编号是v[x],内部权值位置是dep[x],

    正常维护即可。

    相当于枚举z(LCA)

    空间:O(nlogn)

    时间:O(nlog^2n)

    法二:线段树启发式合并

    线段树外层是v[x]编号,叶子再挂上为权值dep[x]的线段树

    然后儿子之间启发式合并,查询+统计答案。

    采用节点回收,让空间复杂度可以降下来。

    空间:O(nlogn)

    时间: O(nlog^2n)

    (但是难写很多)

    总结:

    DOT是个好东西。全局数据结构就是好!

    (解决有根树点分治)

  • 相关阅读:
    linux下使用g++编译cpp工程
    c++字符串互相转换
    MFC双缓冲绘图实例
    Python进阶之迭代器和生成器
    <大话设计模式>笔记
    配置程序成为Linux服务
    Django的设计模式
    Django ModelForm修改默认的控件属性
    Android活动生命周期
    MySQL必知必会笔记
  • 原文地址:https://www.cnblogs.com/Miracevin/p/14305862.html
Copyright © 2011-2022 走看看