初赛
考虑把这些数分成 $n$ 组,每组内部比较,然后大的那些选最大,小的那些选最小。答案为 $3n-2$。
double
除 int
或者 int
除 double
的返回值都是 double
,而 int
除 int
会向下取整。
300iqContest2 B
首先考虑 $a_i\oplus a_j\le x$ 这个限制不好做,考虑转化,经过分类讨论,异或有以下性质:
$$
a\le b\le c\Rightarrow \min(a\oplus b,b\oplus c)\le a\oplus c
$$
证明:
$a=c$ 是平凡的。若 $a\not c$,设 $w$ 是 $a,c$ 最高的二进制下不同的一位,因为 $a\le b\le c$,所以 $b$ 从 $w+1$ 及以上的这些位置 $a,b,c$ 都是一样的。所以异或结果这些位上全是 $0$。考虑位 $w$,显然 $a$ 为 $0$,$c$ 为 $1$,而 $b$ 不管这一位选什么总会导致 $a\oplus b,b\oplus c$ 某一个 $w$ 位变成 $0$。综上可知等式成立。
所以题目限制可以转化为相邻两个数的异或大于等于 $x$,于是可以设计一个 DP,设 $f_i$ 表示以 $i$ 结尾的合法序列个数,则转移应该为:
$$
f_i=\sum\limits_{a_i\oplus a_j\ge x,j\le i-1} f_j+1
$$
利用 Trie
树优化可以做到 $O(\log V)$ 的转移。
1 | int n,X,a[N],f[N]; |
ZR 2022.9.20 赠送赛 A
如果能处理一下两种询问,那么这道题就做完了:一棵树内所有点到某个点的路径之和。一棵树内两个点的距离之和。
容易发现在本题中,询问中任意的点都应该是题目中给定的点,且设 $a$ 由 $b,c$ 组成,那么 $a$ 中的点会在 $b,c$ 出现,但是 $b,c$ 中点不会在 $a$ 中出现,是满足左边条件的题目中给定的带你。容易发现,这样的点一共有 $m^2$ 个。
考虑第一个询问,可以通过第二个询问把第一个询问规模缩小,且最多缩小 $m$ 次,所以仅考虑第二个询问时间复杂度即可。
考虑第二个询问只可能是以后的一个点与这一层这个点之间的询问,所以总的询问个数应该是 $m^3$ 的。
所以加上记忆化,总的复杂度应该是 $m^3$ 的。
ZR 2022.9.21 赠送赛 B
场上有一个 $n^3$ DP,设 $f_{i,j}$ 表示玩了 $i$ 轮,有 $j$ 个人还活着的概率是多少,转移式是显然的,每次枚举选了那个人,死了几个人即可。
但是发现所有人都是等价的,如果我们给每个点标上号,设题目中小 R 所在的点编号为 $n$,那么我们可以认为选点序列是从 $1$ 到 $n$ 选,这样做实际上是钦定了小 $R$ 一定是最后一个,那这样做的概率是 $\frac{1}{n}$,最后给答案乘上这个数即可。
接下来,设 $f_{i,j}$ 表示该考虑 $i$,$i$ 到 $n$ 被攻击了 $j$ 次的概率是多少。转移只需要考虑 $i$ 是否已经被攻击没了。
CF812Div2E
首先考虑主对角线,也就是对角线上所有点的横纵坐标之和一样的对角线,发现每次一个物体移动都会从一个对角线移动到另一个对角线,这同时表明了不可能存在某一时刻,一个对角线上存在两个物体,也就是说,合并是不可能存在的。
现在考虑一个询问 $t,x,y$,显然如果 $t<x+y$,那么肯定是没有任何物体到达 $x+y$ 这条对角线,所以一定是 NO
,现在考虑 $t\ge x+y$,那么可能到达 $(x,y)$ 的那个位置一定是 $t-x-y$ 时刻被放在 $(0,0)$ 的,所以 $t-x-y-1$ 时刻之前的 $t-x-y$ 放的都可能会对这个时刻的东西的路径产生贡献。
观察可以得到,我们可以对一些球一起做,来得到 $x+y$ 这条对角线上每个位置的东西的个数,如果 $(a,b)$ 放了 $k$ 个东西,那么等价于 $\lfloor\frac{k}{2}\rfloor$ 往下走,$\lceil\frac{k}{2}\rceil$ 往右走。这样我们只需看 $t-x-y$ 情况下 $(x,y)$ 放的东西个数,和 $t-x-y+1$ 情况下 $(x,y)$ 放的东西个数。
1 | int Q,t,x,y; |
ZR 2022.9.21 C
我的 DP 是真的不行了。
考虑枚举最小的那个塞不下去的物品,那么比它小的都要放进去,比它大的,就是一个 $01$ 背包求方案数的 DP。如果 DP 已经做不了的事情,不妨加一点限制,多是枚举一个值。
XOR
这个题没有给题目链接。题目如下:
把所有 $a_i\oplus b_i$ 加入 Trie 树。
首先要去掉绝对值号,考虑枚举 $x$ 的最高位,如果是 $0$,那么最高位为 $1$ 对应的子树的所有 $a,b$ 之间的最大最小值就已经确定了,剩下的我们在子树里面暴力搜索。如果 $x$ 最高位填 $1$,同样暴力搜索。然后可以接着往下递归去做。
暴力搜索怎么算贡献?只需要在每个节点上统计经过这个点的数有多少个,就可以知道在某一位选择 $0$ 还是 $1$ 会有多大的贡献。
显然,一个点在搜索中被访问的次数是其祖先的个数。所以总的复杂度应当是 $O(n\log^2 V)$。
AGC044C
两个操作哪个都不会维护。
题解比较巧妙,考虑把所有的数放进三进制 $Trie$ 中,第一个操作等价于我们交换每个节点的 $1,2$ 儿子,而第二个操作需要我们把 $1$ 儿子改成 $1$ 儿子,$1$ 儿子改成 $2$ 儿子,$2$ 儿子改成 $0$ 儿子,然后别忘了进位,所以我们要从低位到高位建立 $Trie$ 树。
进位的处理只需要递归到子树接着处理即可。复杂度是 $\log$ 的,而第一个操作只需要打标记和标记下传。
1 | int pw[13],n,ans[N],cnt; |
SOJ #41
我愿称这种操作为区间覆盖加。
区间赋值是可持久化平衡树可以做的虽然我不会,但是考虑这个题是一个加法的操作。
加法!这提示我们想到卷积,考虑把一个区间 $l,r$ 加到上面,只需要让 $cnt_l$ 变成 $1$ 然后对两个数组做差卷积即可。
但是这里并不是直上直下的加法,考虑 $n$ 为 $10^5$,我们自然想到分块。散块直接处理了。对于整块的贡献,考虑枚举每一个块,然后对于每一个操作计算它对这个块的贡献,维护一个 $cnt$ 数组,然后把 $cnt$ 和 $a$ 数组做一个差卷积即可。
1 |
|
Zhengrui 2022ABDay1 A
其中 $n\le 2e5$
闵可夫斯基和裸题。显然函数 $f(k)$ 是一个凸函数。极差不好做,进行转化:分成 $k$ 段,每段里面有一个 $1$,一个 $-1$,其余都是 $0$,问带权和最大是多少。
考虑如何合并,需要知道最左边和最右边两个区间是否都为 $1$,是否都为 $-1$,以及是不是 $1,-1$ 都有。合并时注意我们不认为只有 $1$ 和 $-1$ 的区间是一个完整的区间,其次,有可能会出现一个区间里面没有任何贡献,要处理这种合并只需要直接把左右儿子区间传上来即可。
其余的合并都是平凡的。
1 | int n,a[N]; |