• 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) 数组看成二维平面上的点。比较奇妙的地方就是二位前缀和。

  • 相关阅读:
    Ajax的工作原理
    ios 应用多语言自由切换实现
    开源码应用之Eclipse篇
    搜索引擎solr和elasticsearch
    字符串截取进阶
    nginx源代码分析--nginx模块解析
    C#网络编程系列文章(五)之Socket实现异步UDPserver
    mysql存储引擎的种类与差别(innodb与myisam)
    程序的记事本--log4net
    在海思hisiv100nptl平台上交叉编译并安装SRS
  • 原文地址:https://www.cnblogs.com/YouthRhythms/p/13693638.html
Copyright © 2020-2023  润新知