唐!

polaris

有一个序列,初始为空。你可以进行以下三种操作:

1:在序列末尾添加一个 1;
c:进行该操作需要序列长度>=1。该操作会将序列末尾的元素再 push_back 一份。
+:进行此操作需要序列的长度>=2。该操作首先会把末尾两个元素从序列中删除,把序列中剩下的元素都减去 1,然后在序列的末尾插入一个数,它是删去两数的和。
现在给定长为 n 的序列 a,你需要使用至多 1e5 次操作将一个空序列变成序列 a。(n<=1e3,ai<=1e6)

全场最复杂 t1。

显然要考虑如何凑一个数 x。

itosh 做法

考虑牛魔的二进制拆分。

1
1 1
2
2 2
2 2 2
2 4
2 4 4
2 8
10

但是可能会有损失。实际上 10 会变成 8。

暴力 1+ 只有 50 分。

智慧地,考虑所有“x 变成 y”关系,要加入 y,就找最近的 x。

预处理 2e6 个“变成”关系,常数优化后是 vlogv 的。


  • 若 x 为 1 就 1
  • 否则先凑 x/2,然后 c+,接着视情况 1+

caged

考虑一个长为 k,每个数都是 [1,n] 中的随机正整数的序列。求其众数出现次数的期望值乘以 nk 的结果。(k<=1000,n<=300)

对标 NOIP2021T2。

一个想法是,枚举众数出现次数。但卡在这里只能度过相对失败的人生。

暴力 DP:枚举众数出现次数 m,设 \(f(n,k)\) 是 1~n,填入 k 个数的方案数。

向 n 平衡复杂度,换维是最直接的想法,即切换主体。

对长为 n 的出现次数序列填数,最大数正是众数出现次数。设 \(f(k,n,s)\) 是从 K 填到 k,填入 n 个数,这些数和为 s 的方案数。显然有

\[f(k-1,n+d,s+d\cdot k)\gets f(k,n,s)(1+[s=0\land d>0](k-1))(k!)^{-d}(d!)^{-1} \]

后面的阶乘分别是原序列和出现次数序列的合并系数。

答案 \(f(1,N,K)N!K!\)

eternal

两个长为 n 的整数序列 a,b 和一个非负整数 v。定义 b 的一个区间 [l,r] 是好的,当且仅当所有元素按位或 >=v。你需要维护 Q 次操作:

  • 1 i x:b[i]|=x
  • 2 k:你需要选择一个好的区间 [l,r],在 r-l+1>=k 的基础上最小化 a 的区间 [l,r] 的最大值。输出最小值。如果不存在这样的区间,输出 -1。(n,Q<=1e6,bi,v,x<230,ai<=n)

没看错就能秒。红温了!

全局查询,走一个枚举最大值,显然扩张到最大,这是单调栈或笛卡尔树干的。总共 n 个这样的区间。

考虑修改。显然,区间的状态一定是由不好到好,这是势能说的道理!

考虑笛卡尔树,显然越靠近根越是“好”的,这是有单调性的。

写个倍增都行。

anfang

对于可重集 S 和非负整数 v,你希望选择一个 S 的可重子集 T,要求在满足从 T 中任取两个元素 x,y,都有 x^y<v 的前提下,最大化 T 的大小。q 次单点修改,每次修改后输出答案,即 T 的大小。(n,q<=1e5)

类似:https://www.luogu.com.cn/problem/CF1616H

显然是个 01trie 题。

贪心不够明朗,考虑 DP。

01trie 上走:

  • 若 v 该位为 0,只能走一侧;
  • 若 v 该位为 1,允许走岔路。

学习一下。设 f(x,y) 表示考虑 trie 上 x 和 y 两棵子树,最多选多少个,不考虑某一棵子树内部的限制。

01trie 上走:

  • 若 v 该位为 0,只能走一侧,f(x,y)=max(f(x.l,y.l),f(x.r,y.r))。
  • 若 v 该位为 1,允许走岔路
    • x=y 时有 f(x,y)=max(x.l.siz,x.r.siz,f(x.l,x.r))
    • 否则有
int t1 = dfs(ls(x), rs(y),d - 1), t2 = dfs(rs(x), ls(y), d - 1);
ckmax(res, siz[ls(x)] + siz[ls(y)]);
ckmax(res, siz[rs(x)] + siz[rs(y)]);
ckmax(res, t1 + max(siz[rs(x)], siz[ls(y)]));
ckmax(res, t2 + max(siz[ls(x)], siz[rs(y)]));
ckmax(res, t1 + t2);

由上过程可推知,一个 x 只能对应一个 y,故状态数等于节点数。

修改比查询简单。改完 O(logV) 个点后重新 DP 即可。

反思

T1 浪费 1h,T3 看错题浪费 0.5h,这状态去 NOIP 绝对垫底了!

二进制拆分,被卡操作次数,建议直接除以 2。

多维 dp 优化,换维是最直接的想法,即切换主体。

想尽量简单的做法是难的。这是必须正视的问题。

复杂度分析更应该留心眼。

从 8.18 到现在,我已经不知道多少次看错题了!你也不想 NOIP 的时候看错题吧?必须把模拟赛的状态、NOIP 的状态找回来!

posted on 2024-09-01 17:51  Zaunese  阅读(224)  评论(0编辑  收藏  举报