2024.11.28 test

此后再无 NOIP 模拟赛。

A

给一个包含 n 个布尔变量的后缀逻辑表达式,给定这 n 个变量的初值,请你求出:若想改变表达式的值,最少需要改变(取反)其中多少个变量的值。

树形 dp,只需要设 fu 表示 u 子树的答案。

B

给定一个排列,判断是否存在等差子序列。

考虑枚举中间的那个数,那么,如果存在等差子序列那么就存在 aik,ai+k 分居同一侧。
考虑正难则反。如果不存在,那么对于所有 kaik,ai+k 都所处位置相同,考虑用 0,1 代表两侧。
判断序列的相同考虑哈希,我们从左往右扫,线段树维护哈希即可。

C

对于一个排列 P,以及一个点集 S,定义:
set(S)={x|l,rS,l<r,minalar=x}len(S)=|set(S)|
f(S)=1 当且仅当 |S|1iS,f(Si)=1len(S)=len(Si)+1
dis(S)=TS,f(T)=1[len(S)=len(T)],求 Sdis(S)

f(S)=1 的条件显然为 len(S)=|S|1
考虑建出笛卡尔树,那么 len(S) 的意义是建出虚树后非叶子节点的个数。
那么 f(S)=1 的话,限制是对于每个点 uu 本身,左子树,右子树不能同时有点。
考虑拆贡献到每个 f(T)=1 处。考虑给 T 加点使得 len(T) 不变。有两种情况:
其一是左右子树都被选了,那么在此时根节点可以选;
其二是根被选了,那么没被选的那个子树可以任选一个点出来。
所以一个 f(T)=1 的贡献是若干个位置的积。设 dpu 表示 u 子树的点的所有子集的贡献积的和。
那么,dpu=1+dpls+dprs+2×dpls×dprs+dpls×(sizrs+1)+dprs×(sizls+1)
2×dpls×dprs 指根的选不选;dpls×(sizrs+1)+dprs×(sizls+1) 指另一个子树选一个点/不选。

D

n×m 的网格,q 次给若干行或若干列染颜色,统计有多少对格子边相邻且颜色相同,有多少对格子角相邻且颜色相同。n,m,q1e5

边相邻的话,考虑时光倒流,行列分别统计。
角相邻我不会,线段树,扫描线,或者是 bitset 乱做,

posted @   s1monG  阅读(11)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· AI 智能体引爆开源社区「GitHub 热点速览」
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
点击右上角即可分享
微信分享提示