zoukankan      html  css  js  c++  java
  • 2020.9.17 校内测试

    2020.9.17 校内测试

    比赛链接

    A

    题解

    将所有矩形按照左上角奇偶性分成 4 类。具体地,左上角行数的奇偶性、列数奇偶性,一共四类。每一类用不同的颜色即可。

    B

    题解

    答案为边权和-最大生成树。

    C

    题解

    将“每个估价函数的和”改成“每个数对多少个估价函数有贡献”。那么使用一个线段树维护每个节点所代表的区间内每个数对多少个估价函数有贡献的和。问题在于更改,即如何计算将一个区间内的数统一赋值为 (v)。就是说对于每一个结点所代表的区间,计算一下区间内每个位置所代表的数的贡献和。

    考虑设计一个数组 (a_{i,j}) ,满足 (sum_{i=1}^nsum_{j=1}^ma_{i,j}) 的值代表 (A_n=m) 时对几个估价函数有贡献。具体的,对于一个估价函数 ((l,r,x)) ,令 (a_{l,x}=1,a_{r+1,x}=-1),那么 (sum_{i=1}^nsum_{j=1}^ma_{i,j})(lle mle r,ige x)(sum_{i=1}^nsum_{j=1}^ma_{i,j}=1) (如果其他位置都没有值的话),所以将对于所有矩阵的这样覆盖的 (a) 数组叠加起来就可以了((a) 数组在只对一个矩形的时候只有两个位置有值)。

    为了方便,设 (s_{i,j}=sum_{i=1}^nsum_{j=1}^m a_{i,j}) 。那么区间 ([l,r]) 在统一改成 (v) 后贡献就是 (sum_{i=l}^{r}s_{i,v}) 。这实际上就是前缀和((s_{i,v}) 事实上已经是 (1sim i) 的每一列的和的前缀和了)。考虑前缀和的前缀和怎么计算。

    [egin{aligned} sum_{i=l}^{r}sum_{j=1}^ix_j &=(r-l+1)(sum_{j=1}^{l-1} x_j)+sum_{j=l}^rx_jcdot(r-j+1)\ &=(r-l+1)(sum_{j=1}^{l-1} x_j)+sum_{j=l}^rx_jcdot(r+1)-sum_{j=l}^{r}jcdot x_j\ end{aligned} ]

    那么只要维护区间和、区间与位置乘积和即可。容易使用主席树维护。

    总结

    其实所谓的 (a) 数组(即构造出来的数组),就是一个差分。可以将 (a) 数组看成二维平面上的点。比较奇妙的地方就是二位前缀和。

  • 相关阅读:
    《程序员修炼之道——从小工到专家》读后感二
    2019.10.14课堂总结
    《程序员修炼之道——从小工到专家》读后感一
    2019.09.23课堂总结
    回文序列判断
    动手动脑
    2018/10/21动手动脑及类的创建
    动手动脑-java重载
    第二次上机实验体会
    Java第一次上机实验源代码
  • 原文地址:https://www.cnblogs.com/YouthRhythms/p/13693638.html
Copyright © 2011-2022 走看看