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

    A. 老夫

    发现这个问题有点类似二维偏序。

    所以考虑类似扫描线的做法,枚举第一个维度,同时在第二个维度上用一个数据结构维护答案。

    所以枚举 $c$ 的取值,然后发现每次的操作是插入一个点。

    以值域为下标建立一个数据结构,对应的操作就是前缀加下标,询问操作就是全局查询最大值。

    所以用一个简单的分块凸包就完事了。


    B. 打算

    对于原问题横纵坐标只能有一个变化,所以维护并不方便。

    考虑把坐标 $(x,y)$ 转化为 $(x+y,x-y)$,这样每次横纵坐标都有变化,并且每种变化可以唯一的还原。

    所以可以分别考虑横纵坐标。然后最后合并输出方案。

    考虑令 $s_i$ 表示时刻 $i$ 的位置。

    那么每个点实际上就表示 $x_i=s_{t_i mod L}+s_{L}*lfloor frac{t_i}{L} floor$。

    考虑通过 $s_L$ 把 $s_{t_i mod L}$ 表示出来,可以得到一个形如 $s_x=A*s_L+B$ 的东西。

    对于每两个相邻的 $x$ ,可以由时间的差值,坐标的差值得到一个不等式,对所有的不等式求个交集,是可行的 $s_L$ 区间。

    然后把 $s_L$ 一一代入即可构造答案。


    C. 报复社会

    这道题的关键是通过前缀的信息来统计答案。

    对于字符 $a,b$ ,设$g_i=cnt_{i,a}-cnt_{i,b}$。

    $a,b$ 合法等价于 $g_i$ 始终在一个长度不超过 $k+1$ 的区间中,因为如果超了那么一定说明两个最值位置中间的部分不合法。

    首先考虑只有两个字符。

    所以可以写一个 dp,枚举了左端点 $l$,那么现在计算右端点不超过 $l+k$ 的答案。

    因为枚举了多个左端点,可以发现这个东西重了,所以要再枚举左端点 $l$,减掉右端点不超过 $l+k-1$ 的答案。

    通过计算可以得知这样的话每个真实长度区间对答案的系数贡献都是 $1$。

    考虑把这个容斥拓展到三维(也就是三个字符的两两组合),其实就是枚举 $2^3$ 的子集,然后奇减偶加。

    对于三维情况,一个显然的 $dp$ 做法是把 $a-b,a-c,b-c$ 都记录进去,但是有些重了,前两种可以表示出第三种。

    这也导致了一个问题,第三种的区间并不容易确定,写一下式子可以发现可以用前两个状态加减来判断是否在第三种的区间中。

    所以这个东西也只有 $O(k)$ 种不同的转移矩阵。 

    然后可以枚举三个的区间分别是什么,通过矩阵快速幂加速转移就完了。

  • 相关阅读:
    java代理模式 (转)
    android平台中编写jni模块的方法(1)
    android平台中编写jni模块的方法(2)
    Android AIDL——实现机制浅析
    android平台中编写jni模块的方法(3)
    Android AIDL使用详解
    android Launcher——拖放功能深入研究
    android 布局长度单位深入研究
    android Launcher——数据加载与变更
    PHP安装
  • 原文地址:https://www.cnblogs.com/skyh/p/12507069.html
Copyright © 2011-2022 走看看