• Codeforces #344 Div.2


    Codeforces #344 Div.2

    Interview

    题目描述:求两个序列的子序列或操作的和的最大值

    solution
    签到题

    时间复杂度:(O(n^2))

    题目描述:有一个棋盘,对其进行染色,每次染一行或一列,后来的颜色会覆盖原来的颜色,输出最后的棋盘。

    solution
    题解用二维线段树,其实可以不用。
    对染色进行离线操作,那么染过的格子、行、列就不用再染了。所以每个格子可以记录四个指针,分别是行前驱,行后继,列前驱列后继,染色时按照这个跳着来染就好了。

    时间复杂度:(O(alpha(nm) nm))

    Report

    题目描述:给出一个序列,操作为选定一个位置(i),然后把序列前(i)个数按升序或降序排列,输出最后的序列

    solution
    经观察可得,对于先后两个操作,如果后者的(i)大于前者的,则相当于前者没有操作。所以可以对操作进行删减,使得操作的范围是递减的,然后用线段树维护最大最小值即可。

    时间复杂度:(O(nlogn))

    Messenger

    题目描述:一个字符串将以若干个字符区间的形式给出:((s, ch)),表示该区间为(s)(ch)字符组成,然后把这些区间连起来就是完整的字符串。给出两个这样的字符串,问二串在一串中的出现次数。

    solution
    先将相邻的同字符区间进行合并,假设二串有(m)个区间,那么第(2)个区间到第(m-1)个区间一定要与一串区间一一对应,区间(1)(m)可以只匹配一串的区间的一部分。那么就相等于把区间(2)到区间(m-1)看成一个新串,然后做KMP,算答案时判断头尾是否可行就可以了。
    要特判(m=1,2)的情况。

    时间复杂度:(O(n))

    Product Sum

    题目描述:给出一个序列,序列的值为(sum_{i=1}^{n} a_i cdot i),现将一个数取出,然后任意找一个地方放回,只能操作一次,为序列的值的最大值。

    solution
    我们可以求修改之后的序列的值与原序列的值的差。
    对于区间([L, R]),如果把(a_L)放到位置(R)则差为((sum)为前缀和)
    (sum_L-a_L cdot L + a_L cdot R -sum_R)
    如果把(a_R)放到位置(L)则差为
    (sum_{R-1}-a_R cdot R + a_R cdot L -sum_{L-1})

    枚举左端点或右端点,式子的前两项为定值,后两项可看成是直线,那么就可以用线段树维护凸壳。

    时间复杂度:(O(nlogn))

  • 相关阅读:
    python学习6—数据类型之集合与字符串格式化
    python学习5—一些关于基本数据结构的练习题
    21-python-time,random模块的应用
    20-python-装饰器⭐
    19-python-迭代器、生成器
    18-python-文件的操作
    17-python-主要内置函数
    16-python-map、filter函数
    15-python-局部变量全局变量
    14-python-函数
  • 原文地址:https://www.cnblogs.com/GerynOhenz/p/5285079.html
Copyright © 2020-2023  润新知