zoukankan      html  css  js  c++  java
  • CF1451(Div.2)题解

    A. Subtract or Divide

    显然,对于一个偶数,我们可以将其通过一次操作变成 (2)。奇数可以通过一次操作变成偶数,再通过一次操作变成 (2)。所以偶数的答案是 (2),奇数的答案是 (3)。注意特判 (1) 的答案是 (0)(2) 的答案是 (1)(3) 的答案是 (2)

    B. Non-Substring Subsequence

    因为这道题对时间限制比较松,(O(n^2mq)) 的算法也是可以接受的。考虑暴力枚举整个 (01) 串禁止转移的点(显然不包括 (1)(n)),分两部分对询问的 (01) 串进行匹配,这样可以保证分割出来的方案不相邻。又考虑到遍历匹配可能出现一边直接匹配了整个字符串,所以我们还需要对询问串进行分割,将一半放在左边匹配,一半放在另一边匹配。这样就能通过了。

    C. String Equality

    因为操作可以做无限次,所以说整个字符串可以重排。所以字符串的顺序并不重要。通过第二个操作看,实际上重要的是每个字符的个数。

    显然,出现了相同的字符,我们直接匹配,相当于减少两个串中这个字符减少出现次数就行了。因为这个相同的字符如果不匹配,就一定会变成更大的字符,永远不能够匹配这个字符了。

    于是,如果字符个数相同,匹配;否则将能匹配的匹配了,然后转移给下一个字符。注意到有 (k) 的限制,注意下转移时判断一下是否是 (k) 的倍数。桶排瞎贪心即可。

    D. Circle Gam

    这种题第一步就是手模拟。不如尝试一下?

    我们发现,设 (x=dfrac{d}{k}),当:

    • (x<sqrt{1^2+0^2}) 时,先手必败;
    • (sqrt{1^2+0^2} leq x < sqrt{1^2+1^2}) 时,先手必胜;
    • (sqrt{1^2+1^2} leq x < sqrt{1^2+2^2}) 时,先手必败;
    • ……

    显然这是有规律的。映射到游戏来,会发生什么?

    注意到根号内的第二个数(没有平方)是最优情况下先手可以走的步数,第一个数同理是后手可以走的步数。

    于是可以猜测,先手一直往上,后手一直往右一定是整个游戏的最优状态。如果先手必胜,当后手往上的时候,先手可以往右调整这个状态,后手仍然是必败态;当先手是必败态的时候,后手可以同样用这个方法去调整状态。

    综上完事儿。少用 sqrt()

    E1. Bitwise Queries (Easy Version)

    这是一个没有用到任何性质的题解。

    首先给出一个式子:

    [a operatorname{xor} b + 2 imes (a operatorname{and} b) = a+b ]

    考虑证明:(a operatorname{xor} b) 部分等于 (a,b) 不相同的位减去 (a,b) 都是 (1) 的位。所以需要两个 (+a operatorname{and} b) 去调整得到 (a+b)

    对前面三个查询 (5) 次,分别是 (a_1 operatorname{xor} a_2,a_1 operatorname{xor} a_3,a_1 operatorname{and} a_2,a_1 operatorname{and} a_3,a_2 operatorname{and} a_3)(a_2 operatorname{xor} a_3) 可以通过前两次查询结果异或得出),这样就能知道 (a_1+a_2,a_1+a_3,a_2+a_3)

    联立解方程可以得出 (a_1,a_2,a_3)。然后再根据异或的性质,知道一个数,两个数异或的结果,得到另一个数。每次查询一遍即可。查询次数 (5+n-3=n+2)

    注意不要把数组开小了。

    E2. Bitwise Queries (Hard Version)

    请丢掉 E1 的做法。我们发现我们完全没有用 (n)(2) 的幂次,值域在 ([0,n-1]) 的消息。

    首先注意到数的数量是 (n),值域大小也是 (n)。所以说这个序列要么有重复元素,要么是一个 (0 sim n-1) 的排列。

    首先求 (1) 对其他数的 (operatorname{xor}) 值无可避免。于是先求出来。

    发现如果整个序列有相同的值,显然有一个数对 ((x,y)) 满足两个数与 (a_1) 异或值相等。随便找一找,如果存在这个数对,我们就能通过一次 (operatorname{and}) 或者 (operatorname{or}) 操作求出 (a_x,a_y)。然后反代回去求出整个序列。操作次数 (n)

    顺便注意一下有没有一个数满足这个数与 (a_1) 异或值为 (0)。同样的做法求一发 (a_1) 即可。

    重要的是这个排列怎么求。实际上也很简单。因为这是一个排列,所以说一定存在两个数 (x,y),使得 (a_1 operatorname{xor} a_x = n-1,a_1 operatorname{xor} a_y = 1)

    考虑这样个玩意儿的意义。首先第二个式子可以发现,(a_1,a_y) 一定只相差 (1)。进行一个 (operatorname{and}) 操作可以知道 (a_1) 除奇偶性的所有前面的信息。

    两个式子连起来一看,发现 (a_x)(a_y) 的奇偶性一定相同。所以我们也能知道 (a_1) 的奇偶性。具体就询问 (a_x operatorname{and} a_y),其奇偶性与 (a_1) 不同。综上,操作次数 (n+1)

    至此,我们解决了这道题。

    F. Nullify The Matrix

    咕一发。以后更。

  • 相关阅读:
    Allegro转换PADS终极篇.....
    PNP与NPN三极管
    windows无法设置防火墙
    SourceInsight 不断无响应的有关问题
    看片/复制/下载技巧
    WinRAR 5.01 正式版 (简体中文)附注册机及注册码
    JVM 学习笔记 1. JVM 运行模型
    Core Java笔记 9.集合(I)
    Core Java笔记 8.泛型(II)
    Core Java笔记 7.泛型(I)
  • 原文地址:https://www.cnblogs.com/amagaisite/p/14027353.html
Copyright © 2011-2022 走看看