zoukankan      html  css  js  c++  java
  • CF1358 简要题解

    咕咕咕,昨晚忘记打了,因此被 D 了一顿(

    Good problems, pathetic memes.

    • A

    显然放一个灯泡点亮两个格子,等价于用可重叠的骨牌覆盖黑白棋盘。因此答案就是 (lceilfrac{nm}{2} ceil)

    • B

    由于同时邀请多个人的时候,她们之间会互相看到,因此分成多次邀请一定不如一次性把所有人都邀请来优(先被邀请到的人不能看到后被邀请的人)。

    于是只需要考虑最多能邀请多少人即可。显然,按照 (a_i) 排序后,如果后面的人能被邀请,那么前面的人也可以。因此,能邀请的最后一个人是最大的 (i, a_ileq i)

    • C

    计算本质不同的结果数,有 arc 内味了(

    由于对于任意的 (y>1),有 (f_{x+1, y-1}=f_{x, y}+1),因此对于一条 ((x_1, y_1) ightarrow (x_2, y_2)) 的路径,假如它不是 L 形,即先一直向下,再一直向右的情况,那么将任意一组 (x e x_2, (x, y) ightarrow(x, y+1) ightarrow(x+1, y+1)) 的操作变成 ((x, y) ightarrow(x+1, y) ightarrow(x+1,y+1)),必然会让路径的权值和恰好增大 (1);反过来同理。可以证明,除了 L 形之外,所有路径都至少存在这样的一个操作。因此,在路径的权值和从最小向最大变化时,中间的每一个值都可以取到;并且 ((x_1, y_1) ightarrow (x_2, y_1) ightarrow(x_2, y_2)) 必然是最大的路径,((x_1, y_1) ightarrow (x_1, y_2) ightarrow(x_2, y_2)) 必然是最小的路径。

    考虑如何计算这两条路径的权值差。实际上不难发现,我们并不需要计算出每个位置的值或某条路径的权值和,只需要比较每一对对应的位置,对这一对位置的差求和即可。由于每一对位置都恰好在同一条反对角线上,它们的差随着路径延伸,是一个先增大,持续一段时间,再缩小的过程。分别算一下即可。

    • D

    可以发现,结束的时间点必然是某个月的月末。

    设持续的区间为 ([l, r], r=l+x-1),考虑 (r) 所在的月份 (i),如果 (r) 没有卡在第 (i) 个月的月末的话,比较 (l)(r+1) 在当月中天数的大小 (p_l, p_{r+1})。如果 (p_l>p_{r+1}),那么直接将整体向左移更优,直到 (r) 成为第 (i-1pmod n) 个月的月末为止。由于 (p_l>p_{r+1}),这样移动一定可以移到某个月末。否则,类似地,直接将整体向右移到第 (i) 个月的月末,答案也不会变差。

    因此,只需要考虑 (r) 在每个月的月末的情况,双指针维护 (l) 所在的月份和天数即可。跨年的情况可以将月份数组直接复制一份接在后面。

    • E

    很有趣的题目,但是边界之类的细节略多,写起来很头疼(

    首先是一个很好证明,却没那么容易得到的观察:假如某个 (kin [1, lfloorfrac{n}{2} floor]) 满足条件,那么任意整数 (x>1, xkleq n),对应的 (xk) 都满足条件。证明只需要考虑将首尾相邻的 (x) 个区间拼起来即可,由于每个部分都有 (sum_{i=l}^{l+k-1} a_i>0),显然拼起来之后也 (>0)

    因此,我们只需要考虑 (kin [lfloorfrac{n}{2} floor+1, n]) 的即可。注意到这些 (k) 都满足,任意一个长度为 (k) 的子区间 ([r-k+1, r]),都满足 (r+1) 在 “the same” 范围内。换句话说,对于每个左端点,它对 (k) 的限制都形如 (c+kx >0)(kgeq b)(即这个左端点对应的子区间右端点超过了 (n),它自然就不存在了)。

    (xgeq 0)(x<0) 讨论一下,第一种情况实际上只需要判断 (sum_{i=1}^n a_i>0) 是否成立即可(因为在 (k) 尽量大时,一定能满足更多的限制)。

    否则,每个限制都可以解出 (kleq a)(kgeq b),只需要将 ((a, b)) 这个区间内打上标记,最后判断 ([lfloorfrac{n}{2} floor+1, n]) 内有没有不带标记的位置即可。边界和细节比较多,需要仔细判断。

    • F

    一个关键的观察是,从 (b) 逆着还原 (a) 时,设 (R(b)) 表示 (b) 翻转后的结果,如果当前的 (b e a)(R(b) e a),那么它至少还要经过一次 (P) 操作,因此此时的 (b) 必然是单调增或单调减的。

    因此,只要它仍然是严格单调的,就可以直接模拟从 (b)(R(b)) 还原 (a) 的过程。对于一个 (a ightarrow b) 的过程,考虑所有可能性中值最小的一个,即初始全为 (1),每次只执行 (P) 操作,发现 (a_n)(m) 次操作后会变为 (inom{n+m-1}{n})。换句话说,(max a_i) 的增长速度是以 (n-1) 为底,关于 (m) 的指数级的。只要 (n>2),直接模拟就跑得飞快。

    对于 (n=1) 的情况,有解当且仅当 (a=b)

    对于 (n=2) 的情况,如果 (a={1, 1})(b={1, 10^{12}}),直接模拟显然不行。但是注意到,除了最后一段连续的 (P) 操作,剩下的都可以用取模代替。

  • 相关阅读:
    搞笑视频分析---1、老番茄-最强间谍王
    尚学linux课程---11、vim操作命令1
    php开发面试题---php缓存总结
    legend2---17、legend2里面怎么面向对象
    北风设计模式课程---10、创建型的设计模式对比总结
    北风设计模式课程---8、装饰器模式
    Linux下安装Tomcat服务器
    种子软件下载种子慢怎么解决
    php开发面试题---Redis和Memcache区别,优缺点对比
    Make a dent in the universe
  • 原文地址:https://www.cnblogs.com/suwakow/p/12975176.html
Copyright © 2011-2022 走看看