zoukankan      html  css  js  c++  java
  • Codeforces #471

    C(分段)

    题意:

    分析:

      我们分别考虑p=2和p>=3的情况
      当p=2的时候,个数明显是[L,R]内完全平方数的个数

      当p>=3的时候,我们注意到这样的数字个数是1e6级别的,且a最多也不超过1e6

      我们可以对于每个a去枚举对应的p,然后丢到一个set里去重

      还有一点要注意的,p=2可能会和p>=3的情况重复,所以我们还要从set里去除所有的完全平方数

      于是对于每个询问就在我们构造出的set里二分+[l,r]内完全平方数的个数

    D(扩展kmp)

    题意:

      给出一个长度为n的字符串s,一个长度为m的字符串t。n>=m

      输入一个整数k,你需要从字符串s中拿出两个不重合的长度为k的子串并拼接起来形成一个长度为2k的字符串f

      请问是否存在一种取法使得t是字符串f的子串?

      n,m,k<=5e5

    分析:

      我们来枚举字符串t的前缀,把这个前缀作为第一个切片的后缀,把t的对应后缀作为第二个切片的前缀,看看是否可行

      为了让两个切片不相交,我们肯定想让第一个切片尽量靠左,第二个切片尽量靠右

      我们注意到处理右边切片和处理左边切片恰好是对称的,这个我们只需要把字符串逆序再同样的做法求就行了,所以我们不妨就只讨论处理左切片

      现在问题就变成了:在原串s中寻找一个尽量靠左的长度为k的子串,这个子串的长度为i的后缀恰好是pret[i]

      我们可以用exkmp预处理求出extend[i]表示s[i..n-1]与t的最长公共前缀,那么对于每个i,本质上就是找到最小的j使得extend[j]>=i且j>k-i

      我们可以从小到大枚举i,用一个set去维护满足extend[]>=i的所有下标就行了

      时间复杂度O(nlogn)

    E(去绝对值)

    题意:

      给定长度为n的数组a[i],你需要自己决定一个T,1<=T<=n,那么b[i]=a[i]+|T-i|

      b[i]表示b[i]秒后位置i上空的冰锥就会掉落到底面,你就无法通过该位置了

      现在有一个人从左边位置1向右边跑,如果某一时刻,该人前面的位置中有冰锥掉下来了,并且后面的位置中也有冰锥掉了下来,那么他就被困住了。

      现在你需要定一个T,使得该人被困住的时刻尽量早。

      如果不存在这样的T,那么输出-1

      n<=1e5

    分析:

      最简单的想法就是枚举所有的T,然后求出该人被困住的时刻,取个最小值就行了

      假设现在我们枚举了一个T,那么b[i]就已经确定了,我们先来看个简单的问题,就是如何判断该人是否会被困住

      被困住的话,那么就是一定会存在一个i,使得b[i]<i,我们找一个满足条件的最小的i,那么该人就在i前面被挡住了不能再跑了(但要注意一点,就是有可能后面某个冰锥很早就掉下来了,他前方其实早就被封住了)

      然后这个时候的答案还需要等他后方最早的冰锥掉落

      所以该情况下的困住时刻是max(min(b[1..i-1]),min(b[i+1..n]))

      这样还是O(n^2)的,我们得优化我们的判定

      我们把b[i]中的绝对值去掉,那么就是

      b[i]=a[i]+T-i   (i<=T)

      b[i]=a[i]+i-T   (i>T)

      我们可以考虑分类讨论两种情况下满足b[i]<i的最小的i是谁,这个东西的处理和D题的是一样的,用一个set来维护就行了

      找到这个分界点i之后,问题就是对前半部分取min,对后半部分取min

      我们注意到每次T的递增只是使得整体的一段+1,一段-1,然后我们需要求区间最小值,那么这用线段树就解决了

      时间复杂度O(nlogn)

    F(dp计数)

    题意:

      给出一个n点的有根树,根是1。

      dp[u][k]表示在以u为根的子树里,我们需要去寻找一个子图,它是一个满k叉树,并且这个子图的深度最大,dp[u][k]就是这样的最大深度

      我们需要对所有1<=u<=n,1<=k<=n的dp[u][k]去求和,将结果输出

      n<=3e5

    分析:

      我们如果按照题目的这样去设计状态,那么状态就直接爆炸了,更不需要提转移了

      我们把问题分成k=1和k>=2,k=1的情况直接树形dp就行了

      对于k>=2的情况,我们发现所有dp[u][k]中有很多数字都是重复的且连续的,因为深度不可能会很大,最多是20

      于是我们可以反过来设计状态,dp[u][dep]表示以u为根的深度为dep的子树,最大的k值是多少(因为如果存在深度为dep的k叉树,那么一定存在深度为dep的k-1叉树)

      这样状态数就是O(nlogn)了,我们再来考虑转移

      考虑枚举dep,然后就是dp[v][dep]转移到dp[u][dep]

      很明显是我们对所有的dp[v][dep]从大到小排序,然后去找个最大的k满足a[k]>=k,这个我们直接sort暴力

      复杂度是O(nlog^2n)的

  • 相关阅读:
    创建zabbix监控,添加监控机(server、agent、windows)
    KVM虚拟化平台简介及环境部署
    利用nginx的stream模块实现内网端口的转发代理
    Mysql主主同步+keepalived实现高可用
    基于 MHA 的 MySQL 高可用方案
    mysql基于Amoeba(变形虫)实现读写分离
    mysql主从异步复制
    基于mysqld_multi实现MySQL多实例多进程配置
    基于Haproxy+Keepalived构建高可用负载均衡集群
    yum 安装报错The GPG keys listed for the "CentOS-7
  • 原文地址:https://www.cnblogs.com/wmrv587/p/8687179.html
Copyright © 2011-2022 走看看