Public NOIP Round #7

A

答案为 k0i=1nj=1n[ai+bj10k]。先把 a,b 排序,枚举 k 后双指针统计答案即可。时间复杂度 O(n(logn+logV))

B

|aiaj|=k 就在它们之间连一条无向边。因为保证序列没有相同元素所以图是若干条链。

容斥,相当于断开若干条边,然后把剩下的链拼接在一起,其中长度 2 的链要乘一个 2 的系数(顺序正着或者反着均可)。预处理出长度为 i 的链断成 j 条链的贡献系数,最后直接 DP 即可。

时间复杂度 O(n2)

C

考虑固定了 w,b 如何算 f(w,b)。不失一般性假设 wb

S 为必须是白色的点(其所有子树大小均 <w),分类讨论。

  • S,把 S 中的点删除后黑点只能在其中一棵子树内,f(w,b) 为大小 b 的子树个数。
  • S=f(w,b) 只能为 12f(w,b)=1 当且仅当存在一个点,它有两棵子树 w,另外还有一棵子树 b。感性理解一下,若这个条件不满足那么黑色连通块相当于被白色连通块堵住了,要么在它前面要么在它后面,不可能跨过它,所以等价类数量为 2

得到这个结论后计算答案是简单的。仍然分两类讨论。

  • S,从大到小枚举 w,并查集维护删除 S 后各个连通块的大小。线段树维护 b×f(w,b) 即可。
  • S=,我们预处理出每个点前三大的子树大小,然后算出第二大子树大小 w 时第三大子树大小的最大值 t。那么 b[1,min(t,w)]f(w,b)=1b[min(t,w)+1,w]f(w,b)=2

这样只计算了 w=1n1b=1min(w,nw)w×b×f(w,b),把答案乘 2,最后减去 i=1ni2f(i,i) 即可。

时间复杂度 O(nlogn)

D

考虑 ai10 的部分分。

拆贡献,转 01,枚举一个 p,令 bi=[bip],把所有 p 的情况的 1 的个数求和即可。

差分,转化为计算 i=1xai

发现只有 01 的冒泡排序过程是非常好看的,大致形如每个 0 每轮都会往前移一格。所以我们不妨统计 0 的个数和。发现这个就是 [l,min(l+x+k1,r)]0 的个数对 xmin

这个是很好用主席树算的。大概就是求出区间中第 rl+2x 大的数,设其为 t,那么 pt 时贡献为区间 0 的个数(这个等于 i=lrmax(tai,0),可以主席树计算),p>t 时贡献为区间长度。

时间复杂度 O(nlogn)

posted @   zltzlt  阅读(109)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示