zoukankan      html  css  js  c++  java
  • HEOI2016题解

    d1t1

    我一眼看过去打了一个倍增+树链剖分+线段树(3log)大力写过

    然后静静思考一下,发现(dfs)序上线段树一个(log)完美解决

    每次修改子树,把每个位置上赋成深度最深的值

    d1t2

    排序

    二分+线段树

    二分答案,每次假设答案是(1-mid)中的数字

    然后我们把这些数字在线段树中全部变为(1),其他数字变为(0)

    那么排序只要根据升序降序把区间中所有(1)放到最前面或最后面

    然后检查(q)位置是否是(1)

    d1t3

    序列

    只能更改一个数字,我们先想一个(n^2)的大力(dp)

    (f[i])表示(1-i)中最长不下降子序列的长度

    (f[i]=f[j](i<j,a[i]ge mx[j],mn[i]ge a[j]))

    我们发现后这是个三维偏序。。考虑一下(cdq)分治

    每次右边的位置用左边位置的最大值来更新

    d2t1

    游戏

    我们把横着的能影响的连通块和竖着的能影响到的联通块都标上号

    每个能放炸弹的点对应着两个编号,在他们之间连边

    然后跑二分图最大匹配,答案是最大匹配数

    数据范围明示

    d2t2

    求和

    斯特林数不会,鸽子了

    d2t3

    字符串

    先搞一波(SA)出来

    我们容易发现答案有单调性,二分一波答案

    然后根据(height)数组的定义,我们发现对于某个长度(len),以(c)开头的符合条件的子串的排名是一段连续的区间

    这段区间我们可以用二分+(st)(O(logn))找出来

    那么问题变成:排名在某段连续区间内,且下标在某段连续区间内有没有符合要求的子串

    二维偏序问题,可以拿主席树草掉

    ddy提供了SAM做法

    我们还可以二分之后把问题看作(s[c……c+mid-1])有没有在(s[a……b])中出现过

    那么我们找到前缀(s[c+mid-1])对应的那个节点,倍增跳到(parent tree)上第一个(lenge mid)的节点

    然后康康这个节点的(endpos)集合中有没有([a+mid-1,b])中的数字

    (endpos)集合用线段树合并维护

  • 相关阅读:
    oauth
    web api Authorization
    sql 找到前三
    js计算误差修正代码(真实版)
    js操作keyframes动态赋值
    元素拖拽缩放的jquery插件
    js生成组织结构树(原创)
    js图片拖拽、缩放、添加图层功能(原创)
    for循环,forin循环和Array.every(),obj.forEach()方法运行速度对比
    for循环+forin循环生成内容模版
  • 原文地址:https://www.cnblogs.com/knife-rose/p/12670771.html
Copyright © 2011-2022 走看看