「DTOI-2」星之界
不会做,思路来自 Konata28。以下小块指分块中不完整的块,大块指分块中完整的块。
按块大小为 对序列分块,每个块内开一个桶维护元素。由于值域与 同阶,故桶的空间是 的。
先来化简柿子,不难得到 。
考虑如何合并两个块询问的答案:只需要将两个块的答案相乘,然后设两个块的和分别为 与 ,那么答案再乘上 即可。
故每一块只需要维护两个信息:区间和 与 区间答案。
考虑一次修改操作,小块的暴力修改。大块的直接改桶信息。假设有 个 要改为 ,那么区间和 ,区间答案乘 ,除 ,再除去原来区间和的阶乘,乘上新的区间和的阶乘即可。由于 ,故只要与预处理出 及以内数的阶乘的 到 次幂与他们的逆元,就能在 的复杂度内完成一次操作。
此处用到的另一个较为巧妙的技巧是代表元。发现小块暴力求解是需要获取他的真实的值。我们另一个块中一个值的代表元是块中这个数第一个出现的位置。每次整块修改时 只要将 的代表元指向 的代表元即可,若 没有代表元,则直接修改 代表元位置的值即可。
JRKSJ Round 6 2D/1B 第七学区
场切,差点一血。第一眼:什么傻逼题。第二眼: 啊,没事了。
考虑 如何做。看到或,考虑按位计算贡献。我们先枚举每一位,看有多少个子区间的或这一位是 。根据或运算的性质,我们发现只有这一位全 的区间才是 。于是对于每一位,将原序列转换为一个 01 序列,求出所有全 的连续段,某一位 的贡献就是 。 是所有全 连续段的长度。
但是发现 的复杂度是无法接受的,同时 的空间也是无法接受的。接下来的思路来自 cxy,膜拜。
考率对原序列进行分块,每个块的大小是 。将原序列的答案拆成两部分:块内贡献 与 块间贡献。采取不同方式计算。
块内贡献用暴力枚举的方式计算,每个块内的复杂度 ,块个数 ,于是这部分就在 的复杂度内轻松解决。
块间的贡献较为麻烦,接下来分步解决。
首先考虑在较低复杂度内算出每一个二进制位在块内的第一个与最后一个 的出现位置。暴力是单个块 的,不够优秀。
考虑对块内的元素 求前缀或运算和,称为序列 。对于一个数 ,块内第一个出现在 位置的二进制位就是 的所有二进制为 的位,不断取 即可。由于每一个二进制位只会在一个位置被算到,所以处理第一次出现位置的复杂度是 的,非常优秀。最后一个同理。因此单个块内处理该信息的复杂度是 (本题较卡常,故把常数带在复杂度内),即 ,所有块复杂度 。下称 二进制位在块内的第一次出现位置为 ,最后一个位置为 。
接下来延续第一种算法的思想,枚举每一个二进制位,保存该二进制位上一个 出现的位置,为 。那么这一位的跨块且或为 的且右端点在该块内的区间个数是 。又容易算出所有跨块的区间个数,用其减去所有不合法的区间个数就是这一位或为 且跨块的区间个数,乘上二进制值即为这一位贡献。块内计算该信息复杂度为 即 。所有块复杂度为 。
因此最终时间复杂度 ,取 左右时复杂度较为优秀,约为 。空间上只需要存当前块的 个值与每一位的上一次出现位置,与该块内每个二进制位出现的第一个与最后一个位置,即 ,约 个 long long
变量,绰绰有余。于是解决了此题。