A
读错题了,真唐。
注意到是电性只和移动方向有关系,但是我们需要考虑虚实。
将其变为不交换,只变化属性,那么\(x\to \leftarrow y\) 只是属性变为碰撞球属性的相反属性。
因此我们考虑向左移动的球撞到一个向右移动的球后有什么变化,不妨设向右移动的球的树形分别为 \([c_0,\dots c_k]\),则新加入一个属性为 \(t\) 的球(往左碰撞),会使得 \(\neg c_0\) 被收集,然后序列变为 \([c_1,c_2,\dots c_k,\neg t]\)
因此不妨设实为 \(1\) 虚为零,我们动态维护序列 \(c\),有如下操作:
- 遇到一个正电荷球(右移),在 \(c\) 的末尾加入 \(1\)
- 遇到一个负电荷球(碰撞),将 \(c\) 的开头弹出并累计答案,在 \(c\) 的末尾加入 \(0\)
我们需要统计的是有多少个 \(1\) 被弹出。
不妨将当前局面的前缀负电荷球扔掉,这样我们保证 \(c\) 始终不空,那么最终只会弹出前 \(cnt_{-}\) 个球,并且我们只计算弹出的 \(cnt_+\) 个数。
也就是说,将原序列转为 01 序列(0 为负电荷),并删掉开头的零后,答案就是前 \(cnt_0\) 个数里面有多少个 \(1\)。那么开头的零也就没必要删除了。
考虑计算,对于位置 \(t\) 而言,若这是一个 \(1\),且被弹出,当且仅当 \(cnt_0\ge t\),也就可以直接计算了。
显然,\(precnt_?\) 递增,\(sufcnt_?\) 递减,而 \(t-cnt_0\) 同样递增,因此 \(x,y\) 的总变化范围是有限的,所以可以利用组合数前缀和的技巧做掉。
B
先除掉 \(X\),变为 \(\gcd=1\)
注意到 \(\mu(Y)\neq 0\),因此质因子次数都是 \(1\),那么我们就可以根据有没有质因子给每个元素赋值为最多 \(15\) 位二进制数(都不存在的位直接删掉,这样 \(Y\) 对应满 \(1\)),不妨设这对应的二进制数为 \(h(Y)\),问题就变成了树上有多少个连通块 \(V\),\(|_{x\in V}h(a_x)=Y,\&_{x\in V}h(a_x)=0\)。
当然,我们可以设 \(b_x=h(Y)\oplus a_x\),变成 \(\&_{x\in V}h(b_x)=0\)
定义 \(g(V)=g(\prod_{x\in V}v_x)=[V\text{is connected},|V|>0]\),我们可以用生成函数来表达这个式子:
定义多项式运算 \(x^ay^bv_i·x^{p}y^qv_j=x^{a\&p}y^{y\&q}v_iv_j\)
注意到 \(a_t|b_t=h(Y)\),因此 \(i,j\) 若有值必然 \(i|j=h(Y)\)。
可以暴力枚举 \(i,j\) ,则选出可用点后,这个值是一个裸树上连通块个数计数,简单dp即可。
发现对于一个点 \(t\) 而言,\(h(a_t)\&i=t,h(b_t)\&j=t\) 的 \((i,j)\),事实上只有 \(2^{popcount(h(Y))-popcount(h(a_t))}·2^{popcount(h(a_i))}=2^{popcount(h(Y))}\)
因此通过一定的预处理,可以做到 \(O(n2^{popcount(h(Y))})\)
C
这题目没意义