zoukankan      html  css  js  c++  java
  • BestCoder Round #60 题解链接

    题解  题目

    1001 GT and sequence

    注意先特判000的情况:如果读入的数据有000,那么去掉所有的000且最后答案和000取一个max。

    剩下的正数显然全部乘起来比较优。

    对于负数的话,如果个数是奇数个我们就去掉绝对值最小的那一个,然后全部乘起来即可。

    1002 GT and numbers

    如果AAA大于BBB那么显然无解。

    考虑把AAA和BBB分解质因数。

    BBB存在AAA没有的质因数也显然无解。

    对于某一个AAA的质因数的次数。为了加速接近BBB,它一定是每次翻倍,最后一次的时候把剩下的加上。

    那么答案就是最小的kkk使得2k∗Anum≥Bnum2^{k}*A_{num} geq B_{num}2k​​Anum​​Bnum​​。

    最后把每个质因数的答案max起来即可。

    感觉本场比赛没有trick(雾~),我就打算加入一个很经典的trick:

    BBB可以刚好等于2632^{63}263​​,这样就要开unsigned long long。

    同时我还在题目里特别提醒了“注意M的范围”

    可惜仍然有很多选手没有注意。

    这里我表示歉意,也希望你们以后可以更加仔细一点。

    1003 GT and set

    可能一些选手题意不是很清楚,我这里再提供一个转化后的问题:

    给出N个集合。每次你可以指定一个数,然后所有包含这个元素的集合可以被删掉。

    问你能否经过最多L轮操作使得所有集合都被删掉。

    因为LLL只有555,考虑直接dfs。

    对于第一个集合,我们枚举它的那个公共的数是多少。

    然后线性扫描过去,找到接下来第一个没有这个数的集合。

    (它显然不能通过这个公共的数与第一个数在同一个部分)

    对于这个集合,再枚举它公共的数是多少,然后线性扫描过去找到第一个没有这两个数的集合……

    这样重复555次后如果还是没有,就直接NO好了。若中途扫完序列就是YES。

    这样最坏的效率就是O(N∗105)O(N*10^{5})O(N105​​),足以通过此题。

    其实我们可以预处理使得效率变成O(105)O(10^5)O(105​​) ><然而出题人很良(lan)心(duo)。

    1004 GT and strings

    其实这题就是一个大暴力。

    首先可以证明:如果对于每次询问,计算的效率是min(∣Si∣,∣Sj∣)min(|Si|,|Sj|)min(Si,Sj),

    且把同样的询问记下来(map记忆化),效率是正确的。

    我就感性地证明一下。首先我们来考虑如何hack这个算法。

    首先因为效率是min的,我们询问的时候要尽量做到两个串长度一样。

    (如果不一样的话,还不如把大的串分给小的串一点。)

    那么数据一定是之前有一堆一样长且比较长的串(后面可能还存在较短的串凑数)。

    设有P个比较长的串,有效的两两询问只有P2P^2P2​​级别的。

    那么效率就是min(P2,100000)∗(L/P)min(P^2,100000)*(L/P)min(P2​​,100000)(L/P)

    当$P = sqrt(N)$的时候取到最大效率O(N1.5)O(N^{1.5})O(N1.5​​)。

    所以这道题直接按min(∣Si∣,∣Sj∣)min(|Si|,|Sj|)min(Si,Sj)计算即可。 对于子序列,直接建一个“序列自动机”(第iii个点以后jjj字母第一个出现的位置)跑一下。 对于子串,我们就可以AC自动机或SAM预处理再做,总之很模板。

    1005 GT and trees

    众所周知,众数是一个很难搞的东东,很难用数据结构维护。

    这里采用的是树上莫队的方法,由于还带修改,所以效率为N5/3N^{5/3}N5/3​​ (NNN和QQQ同阶)

    现在考虑维护这样一个操作:每次加一个数或者删除一个已经出现了的数,在线询问现在次数最大的数是多少。

    本来可以很方便地开一个线段树维护一下,但是之前的效率已经很满了,加个log显然会T。

    为了降下插入和删除的效率,我们可以利用块状数组。

    具体的做法是:记f[i]f[i]f[i]表示权值i出现的次数,size[i]size[i]size[i]表示出现了iii次的权值个数。

    然后对于sizesizesize的下标我们分块,假设块的大小为SSS,记best[i]best[i]best[i]表示∑size[k]sum size[k]size[k],其中(i−1)∗S+1≤k≤i∗S(i-1) * S + 1 leq k leq i*S(i1)S+1kiS

    每次加入和删除一个点的时候,只需O(1)O(1)O(1)更新f和size和best数组。

    查询的时候,我们倒序扫描每个块iii,若best[i]>0best[i] > 0best[i]>0那么答案肯定在这个块中。然后再在这个块里暴力寻找最后一个size[i]>0size[i] > 0size[i]>0的iii即可。

    这样效率就是O(N5/3+N3/2)O(N^{5/3}+N^{3/2})O(N5/3​​+N3/2​​)

  • 相关阅读:
    ubuntu 安装mysql和redis 开放远程连接
    linux时间不对,执行ntpdate时间同步始终不对。
    Web漏洞
    生产者消费者模型
    多进程抢票问题
    socket通讯-----UDP
    python3读写csv文件
    # 把csv转xls
    python os模块 用资源管理器显示文件,pyinstall打包命令
    创建一个最简单的pyqt5窗口
  • 原文地址:https://www.cnblogs.com/dzzy/p/4888421.html
Copyright © 2011-2022 走看看