唐!
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(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 的状态找回来!