Atcoder Begining Contest 367

Atcoder Begining Contest 367

A

  • 题意:

    B 时刻睡觉,C 时刻起床,问 A 时刻是否在睡觉

  • 题解:

    如果 B ≤ C B \leq C BC,判断 A ∈ [ B , C ] A \in [B, C] A[B,C]

    如果 B > C B > C B>C,判断 A ∈ [ B , 24 ] ∪ [ 0 , C ] A \in [B, 24] \cup [0, C] A[B,24][0,C]

B

  • 题意:

    将一个小数末尾的 0 去掉

  • 题解:

    从后往前删 0 即可,记得如果小数位全是 0 的话也要删除小数点

C

  • 题意:

    找到所有满足以下条件的数列

    1. a i ∈ [ 1 , R i ] a_i \in [1, R_i] ai[1,Ri]
    2. ∑ a i ≡ 0 (   m o d     k ) \sum a_i \equiv 0(\bmod\ k) ai0(mod k)
  • 题解:

    爆搜

D

  • 题意:

    一个环形区域,从 i i i 号点走到 i + 1 i+1 i+1 号点的花费位 a i a_i ai,从 n n n 号点走到 1 1 1 号点花费为 a n a_n an,求有多少点对 ( i , j ) (i,j) (i,j) 使得从 i i i 号点走到 j j j 号点花费为 k k k 的倍数

  • 题解:

    先考虑 i < j i < j i<j,从 i i i 号点走到 j j j 号点的花费为 s u m j − s u m i − 1 sum_j-sum_{i-1} sumjsumi1 s u m sum sum 表示前缀和),只需要拿一个桶 c n t p cnt_p cntp 记录所有 s u m i   m o d     k = p sum_i \bmod \ k=p sumimod k=p 的个数,即可统计答案

    再考虑 i > j i > j i>j 的情况,发现花费为 s u m n + s u m i − s u m j − 1 sum_n+sum_{i}-sum_{j-1} sumn+sumisumj1,再用上面的方法扫一遍即可

  • code

E

  • 题意:

    给定长度为 n n n 的数组 A A A X X X,定义一次操作为 B i = A x i B_i=A_{x_i} Bi=Axi,然后再交换数组 A A A B B B,求 k ( k ≤ 1 0 18 ) k(k \leq 10^{18}) k(k1018) 次操作后的 A A A 数组

  • 题解:

    倍增,求出 t o x , i to_{x,i} tox,i 表示位置 x x x 经过 2 i 2^i 2i 次交换后的数字在最初是哪个位置的

    k k k 二进制分解,之后每个位置分别处理即可

  • code

F

  • 题意:

    给定数列 A A A B B B,每次询问 A A A 的子数列 A l ∼ r A_{l\sim r} Alr B B B 的子数列 B L ∼ R B_{L\sim R} BLR 是否相同

  • 题解:

    k k k 进制异或哈希裸题

    听说不用异或,随机出来一个哈希表 H i H_i Hi,使 A i = H [ A i ] A_i=H[A_i] Ai=H[Ai] B i = H [ B i ] B_i=H[B_i] Bi=H[Bi],直接求子段和是否相等也行

  • code

G

  • 题意:

    给定数列 A A A,对于 A A A 中的任何一个长度为 m m m 的倍数的子序列,令其价值为这个子序列异或和的 k k k 次方,求 A A A 所有长度为 m m m 倍数的子序列的价值

  • 题解:

    在质量如此差的一场 A B C ABC ABC,最后竟然放了一个这样的神题

    首先理解一下进行异或 f w t \rm fwt fwt 的本质, f w t A , i fwt_{A,i} fwtA,i 表示 ∑ i ∘ j = 0 A j − ∑ i ∘ j = 1 A j \sum\limits_{i\circ j=0} A_j - \sum\limits_{i\circ j=1} A_j ij=0Ajij=1Aj,此时有 f w t A × f w t B = A ⊕ B fwt_{A} \times fwt_{B} = A\oplus B fwtA×fwtB=AB

    B i B_i Bi 表示 A j = i A_{j}=i Aj=i 的元素个数,将 B B B 数组进行 f w t fwt fwt 变化后,枚举每一位 f w t B , i fwt_{B,i} fwtB,i,就可以得到 a j ∘ i = 0 a_j\circ i=0 aji=0 的个数和 a j ∘ i = 1 a_j\circ i =1 aji=1 的个数,实质上,就是有一堆数对 f w t B , i fwt_{B,i} fwtB,i 的贡献是 1 1 1,其他的贡献为 − 1 -1 1

    这样,在 A A A 数组选取子序列的问题就可以转化为在 f w t B fwt_B fwtB 上进行操作了

    先不考虑子序列长度为 m m m 的倍数这一限制

    这样的话做法大概是枚举 f w t B fwt_{B} fwtB 的每一位,如果 f w t B , i = n fwt_{B,i}=n fwtB,i=n 的话将其变成 2 n 2^n 2n,否则将其变成 0 0 0,之后将新数组 i f w t \rm ifwt ifwt 即可,最后得到的数组第 i i i 为就表示子序列异或和等于 i i i 的个数。因为子序列选取偶数个贡献为 − 1 -1 1 的数,这个子序列的价值为 1 1 1,否则价值就是 − 1 -1 1

    考虑加上选取子序列长度必须为 m m m 的倍数这一条件

    f i , k f_{i,k} fi,k 表示总共有 i i i 1 1 1,选取了 k + t × m k+t\times m k+t×m 1 1 1 的方案数, g i , k g_{i,k} gi,k 表示有 i i i − 1 -1 1,选取了 k + t × m k+t\times m k+t×m − 1 -1 1 的贡献和(贡献指 ( − 1 ) k + t × m (-1)^{k+t\times m} (1)k+t×m),其中 t t t 表示任意非负整数

    枚举 f w t B , i fwt_{B,i} fwtB,i,求出原数组有 k 1 k_1 k1 个贡献为 1 1 1 的数, k 2 k_2 k2 个贡献为 − 1 -1 1 个数,更新 f w t i fwt_{i} fwti ∑ i = 0 m f k 1 , i × g k 2 , m − i \sum\limits_{i=0}^m f_{k_1,i} \times g_{k_2,m-i} i=0mfk1,i×gk2,mi ,之后对新数组做 i f w t \rm ifwt ifwt 即可

  • code

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值