一道让我做得相当高兴的题目。

原题链接 (这是付费比赛。)

题意简述

给定长度为 nn 的序列 aa。定义函数 f(S)=TSF2(sTs)f(S)=\sum\limits_{T\subseteq S} F^2(\sum_{s\in T} s),也即“对于 SS 的所有子集,求 F(子集所有元素之和)的平方F(\text{子集所有元素之和})\text{的平方} 之和”。其中 F(x)F(x) 为斐波那契数列的第 xx 项。有F(0)=0,F(1)=1,F(x)=F(x1)+F(x2)(x>1)F(0)=0, F(1)=1, F(x)=F(x-1)+F(x-2) (x > 1)

你需要支持以下操作,操作总数为 mm

1 x y:将 axa_x 修改为 yy

2 l r:输出 i=lrj=irf({ai,ai+1,,aj})\sum\limits_{i=l}^{r}\sum\limits_{j=i}^{r}f(\{a_i, a_{i+1}, \cdots, a_{j}\}),对 998244353998244353 取模。

数据范围:对于 50%\text{50\%} 的数据,有 n,m100n,m\leq 100;对于 70%\text{70\%} 的数据,有 n,m1000n,m\leq 1000;对于 100%\text{100\%} 的数据,有 n,m105,ai105n,m\leq 10^5, a_i \leq 10^5

(更多…)

More
  • 2022年6月20日

一场相当有收获的比赛。比赛链接

A – 石老板举世无双

解法一

尝试观察规律。我们发现,在完成ss次操作以后,左端点的可能取值为xa+(2sx)b2s,x[1,2s]\dfrac{xa+(2^s-x)b}{2^s}, x \in [1, 2^s],右端点的可能取值为xa+(2sx)b2s,x[0,2s)\dfrac{xa+(2^s-x)b}{2^s}, x \in [0, 2^s)。假如现在我们达到最终状态,其l=(x+1)a+(2sx1)b2s,r=xa+(2sx)b2sl=\dfrac{(x+1)a+(2^s-x-1)b}{2^s}, r=\dfrac{xa+(2^s-x)b}{2^s}。那么,在xx的二进制表示中,如果从高到底pos\mathrm{pos}位为11,则在第pos\mathrm{pos}轮中,有check (mid) == 0,向右区间递归;否则向左区间递归。这是很容易解释的:若向右递归,则右端点不变。而在下一层,右端点表示中a,ba, b的所有系数乘22,所以体现为二进制位末尾添一个00。反之,就变成(x+(x+1))/2(x+(x+1))/2,在下一层中体现为2x+12x+1。如果其有popc(x)\operatorname{popc}(x)位为11,则到达该状态的概率为p0popc(x)p1spopc(x)p_0^{\operatorname{popc}(x)}p_1^{s-\operatorname{popc}(x)}

s=3s=3时的状态l=3a+5b8,r=2a+6b8l=\dfrac{3a+5b}{8}, r=\dfrac{2a+6b}{8}为例。22的三位二进制表示为0b010\text{0b010},则推断出在前三轮分别向右、左、右区间递归,到达其的概率为p0p12p_0p_1^2(更多…)

More
  • 2022年5月17日

格雷码(Gray code)是一种任意两相邻项有且仅有一位不同的二进制编码。

直观来看,其构造方式如下:假如我们构造出了格雷码g0,1,,2m1g_{0, 1, \cdots, 2^m-1},现在考虑构造m+1m+1位格雷码。我们将前2m2^m位复制一遍,然后反转在原序列中的位置,也即g2m+i=g2m1i,i[0,2m)g’_{2^m+i}=g_{2^m-1-i}, i \in [0, 2^m);然后在最后2m2^m项格雷码的左侧分别添上11。由此有g2m+i=g2m1i+2mg_{2^m+i}=g_{2^m-1-i}+2^m

实际操作时,可以采用相邻两项的异或值与前缀异或和快速构造。假若有gxg_xgx1g_{x-1}的异或值序列s1,2,,2m1s_{1, 2, \cdots, 2^m-1},那么便有s2m+i=si,i[1,2m)s_{2^m+i}=s_{i}, i \in [1, 2^m),同时有s2m+1=g2m+1g2m=2ms_{2^m+1}=g_{2^m+1} \oplus g_{2^m}=2^m

例如,前8项格雷码的二进制表示为:{0b000,0b001,0b011,0b010,0b110,0b111,0b101,0b100}\{\text{0b}000, \text{0b}00{\color{blue}1}, \text{0b}0{\color{blue}1}1, \text{0b}01{\color{blue}0}, \text{0b}{\color{blue}1}10, \text{0b}11{\color{blue}1}, \text{0b}1{\color{blue}0}1, \text{0b}10{\color{blue}0}\},相邻两项异或值为{1,2,1,4,1,2,1}\{1,2,1,4,1,2,1\}

(更多…)

More
  • 2022年5月2日

Algorithm 457: Finding All Cliques of an Undirected Graph [H] – Coen Bron* and Joep Kerboscht – Archives of Communication of ACM

原Essay详细而准确地描述了该算法的过程,不需要额外的注解也能轻松理解。若英语阅读吃力,也有一份不错的中文详述:

极大团(maximal clique)算法:Bron-Kerbosch算法 – Bowiee – 简书

下面给出一份参考实现,能够找出所有极大团。使用unsigned long long存储各状态点的集合,二进制表示下从低到高第(x1)(x-1)位为11表示点xx存在于集合中。 (更多…)

More
  • 2022年4月14日

考虑这个排列是怎样生成的。转述一下题意,可以发现,popcount(PiPi+1mod2n)=K\operatorname{popcount}(P_i \oplus P_{i+1 \mod {2^n}})=K,也即全集msk=2N1\text{msk}=2^N-1的一个大小为KK的子集。

由于这是一个环排列,我们不妨令P0=0P_0=0。这样一来,Pi=j=1iSj,Sj=KP_i=\operatorname{\bigoplus}\limits_{j=1}^{i}S_j, |S_j|=K。结合上文可知,这是一个相邻元素二进制位恰相差KK位的格雷码问题。有K=1K=1时,满足条件的SjS_j恰有NN个,也就是NN位格雷码。

考虑推广。我们发现,如果按照类格雷码的方式生成排列,则所有的SjS_j应构成异或空间,其大小应当恰为2N2^N,并且由线性空间知识可以得到,该线性空间的(基的大小)应当恰为NN。这恰好符合NN位格雷码的构造。因此,只要满足上述条件,就一定能够生成符合题意的排列。

可以证明,除了2K(K=NN>1)2\mid K \lor (K=N \land N>1)以外,总是有满足条件的线性空间生成的。

下述解法的时间复杂度O((NK)+2N)\operatorname{O}\left(\dbinom{N}{K}+2^N\right)(更多…)

More
  • 2022年4月11日

以下所有操作均可以通过递归DFS每一位并作相应判断实现。但以下写法实现简洁、常数较小,不失为一种优美的技巧。

下文采用SiS_i表示第ii个集合,msk\text{msk}表示其二进制表示。

简单集合运算

  • S1S2msk1msk2S_1 \cup S_2 \leftarrow \text{msk}_1 \mid \text{msk}_2
  • S1S2msk1 & msk2S_1 \cap S_2 \leftarrow \text{msk}_1\space\&\space\text{msk}_2
  • S1S2msk1 & (msk2)S_1 \setminus S_2 \leftarrow \text{msk}_1\space\&\space(\sim\text{msk}_2)
  • (相对于该二进制数类型最大值的)补集msk\sim\text{msk}
  • 对称差集S1ΔS2msk1  msk2S_1 \Delta S_2 \leftarrow {\text{msk}_1}^{\space\land}\space \text{msk}_2

(更多…)

More
  • 2022年4月9日

介值定理

若有连续函数f:[a,b]Rf: [a, b] \mapsto \mathbb{R},且不失一般性地,令a<b,f(a)<f(b)a< b, f(a)< f(b),则对于任意实数x[f(a),f(b)]x\in [f(a), f(b)],存在c(a,b),f(c)=xc \in (a, b), f(c)=x

容易由实数完备性证明。直观理解,即可以画出一段连续曲线,其两端点分别为(a,f(a)),(b,f(b))(a, f(a)), (b, f(b)),而笔不离开纸面。

离散函数值上的介值定理

若存在函数f(x)Z,xZf(x) \in \mathbb{Z}, x \in \mathbb{Z},且满足f(x)f(x+1)1|f(x)-f(x+1)|\leq 1,则对于a<b,f(a)<f(b)a<b, f(a)<f(b),若有整数x[f(a),f(b)]x \in [f(a), f(b)],存在一个c(a,b),f(c)=xc \in (a, b), f(c)=x

证明显然。

在OI中的实际意义?

我们常遇到这样一类函数:在某些数列上进行统计,邻项函数值之间的差为{1,0,1}\{-1, 0, 1\},如括号序前缀和(‘(‘+1,‘)’1\text{‘(‘} \rightarrow +1, \text{‘)’} \rightarrow -1),则可以通过上述性质判断某两点之间函数值是否存在。

例如CF1695C – Zero Path,本质上路径上数字和是一个满足上述条件的整数离散函数。

再例如CF1658F – Juju and Binary String,可以将题意转化为一个函数f(x)[0,n],x[0,n]xp,f(xp)>0f(x) \in [0, n], x \in [0, n] \land \exists x_p, f(x_p) >0,且满足上述性质;同时有函数g(x)=x,x[1,n]g(x)=x, x \in [1, n],则可以证明一定存在x0,g(x0)=f(x0)x_0, g(x_0)=f(x_0)

More
  • 2022年3月28日

考虑合并若干重叠线段。使其有序化后考虑每两个线段的交,如果其为空则新建一条独立线段,反之合并。

最后应当恰好有77条水平线段,88条垂直线段,否则依题意不可能拼凑出“THUPC\textbf{THUPC}”图形。

DFS搜索组成每个字母的所有可能线段组合。需要合理剪枝,亦可以使用二进制状态压缩减小常数。时间复杂度理论上限为O(75×85)\mathrm{O}(7^5\times 8^5),实际远远达不到。

赛时1A(实际上因为无主函数返回值RE了两次)7KB7\text{KB}代码: (更多…)

More
  • 2022年3月12日

CodeForces Round #755 Div.2 F / Div.1 D Serious Business

此题整整困了我一天半,耗费了好几张草稿纸。实在走投无路,翻看题解,却发现正解曾经近在咫尺。有必要稍作整理。

考虑DP。

错误转移1

这道题与清理班次(《算法竞赛进阶指南》上的一道例题)过于相似,都是“给定一些段落[lp,rp][l_p, r_p],选择其中一些完整覆盖[l0,r0][l_0,r_0],求最小花费”的形式。记上述花费为f(l0,r0)f(l_0, r_0)。但本题与原题不一样之处在于其起点和终点是任意给定的。我的第一反应是枚举在x2x_2位置从第22行转到第33行,利用数据结构维护所有x1x2x_1\leq x_2,在x1x_1转移到第二行,解锁到达x2x_2的最小代价。对于各行前缀和,我们可以利用线段树或树状数组维护。同时我们也知道可以利用数据结构优化在O(nlogn)\mathrm{O}(n \log n)的时间内,计算出对于一个固定的起点l0l_0,所有f(l0,r0),r0[l0,n],p,rp=r0f(l_0, r_0), r_0 \in [l_0, n], \exists p, r_p=r_0的值。 (更多…)

More
  • 2022年3月8日