省选集训-模拟赛2

A

读错题了,真唐。

注意到是电性只和移动方向有关系,但是我们需要考虑虚实。

将其变为不交换,只变化属性,那么xy 只是属性变为碰撞球属性的相反属性。

因此我们考虑向左移动的球撞到一个向右移动的球后有什么变化,不妨设向右移动的球的树形分别为 [c0,ck],则新加入一个属性为 t 的球(往左碰撞),会使得 ¬c0 被收集,然后序列变为 [c1,c2,ck,¬t]

因此不妨设实为 1 虚为零,我们动态维护序列 c,有如下操作:

  1. 遇到一个正电荷球(右移),在 c 的末尾加入 1
  2. 遇到一个负电荷球(碰撞),将 c 的开头弹出并累计答案,在 c 的末尾加入 0

我们需要统计的是有多少个 1 被弹出。

不妨将当前局面的前缀负电荷球扔掉,这样我们保证 c 始终不空,那么最终只会弹出前 cnt 个球,并且我们只计算弹出的 cnt+ 个数。

也就是说,将原序列转为 01 序列(0 为负电荷),并删掉开头的零后,答案就是前 cnt0 个数里面有多少个 1。那么开头的零也就没必要删除了。

考虑计算,对于位置 t 而言,若这是一个 1,且被弹出,当且仅当 cnt0t,也就可以直接计算了。

1tn,at=?at=1x=0precnt?y=0sufcnt?(precnt?x)(sufcnt?y)[x+ytcnt0]

显然,precnt? 递增,sufcnt? 递减,而 tcnt0 同样递增,因此 x,y 的总变化范围是有限的,所以可以利用组合数前缀和的技巧做掉。

B

先除掉 X,变为 gcd=1

注意到 μ(Y)0,因此质因子次数都是 1,那么我们就可以根据有没有质因子给每个元素赋值为最多 15 位二进制数(都不存在的位直接删掉,这样 Y 对应满 1),不妨设这对应的二进制数为 h(Y),问题就变成了树上有多少个连通块 V|xVh(ax)=Y,&xVh(ax)=0

当然,我们可以设 bx=h(Y)ax,变成 &xVh(bx)=0

定义 g(V)=g(xVvx)=[Vis connected,|V|>0],我们可以用生成函数来表达这个式子:

定义多项式运算 xaybvi·xpyqvj=xa&pyy&qvivj

ans=g(V)=1[x0y0xVvx]i=1n(1+xh(ai)yh(bi)vi)=g(V)=1[x0y0V]IFWT(i=1nFWT(1+xh(ai)yh(bi)vi))=g(V)=1,i,j[xiyjV](1)i+j[tV,h(at)&i=at,h(bt)&j=j]

注意到 at|bt=h(Y),因此 i,j 若有值必然 i|j=h(Y)

可以暴力枚举 i,j ,则选出可用点后,这个值是一个裸树上连通块个数计数,简单dp即可。

发现对于一个点 t 而言,h(at)&i=t,h(bt)&j=t(i,j),事实上只有 2popcount(h(Y))popcount(h(at))·2popcount(h(ai))=2popcount(h(Y))

因此通过一定的预处理,可以做到 O(n2popcount(h(Y)))

C

这题目没意义

posted @   spdarkle  阅读(7)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示