2023.3月比赛记录
以下为挂分记录:
2023/3/11:期望得分:215 实际得分:85
2023/3/13:期望得分:160 实际得分:90
2023/3/14:期望得分:110 实际得分:26(freopen 写错了,有一个要开 __int128 的地方也没有开,虽然没有卡) 没有题解,就不补了
2023/3/16:期望得分:78 实际得分:78 我是废物
2023/3/17:期望得分:300 实际得分:300
2023/3/18:期望得分:125 实际得分:125 被橄榄了😂😂😂
2023/3/20:期望得分:260 实际得分:200 lower_bound 里面传参传成n了!!!
2023/3/21:今天没有考试,所以没有挂分捏🤣🤣🤣
2023/3/23:期望得分:143 实际得分:81
2023/3/24:期望得分:150 实际得分:50 两个题都忘记清空了!!! T2 是原题,T1sb题,T3乱批程序,所以就不写题解了。😁😁😁
2023/3/25:期望得分:220 实际得分:120
2023/3/27:期望得分:120 实际得分:120 sbAK森,能不能去死啊😅😅😅
2023/3/28:期望得分:50 实际得分:30 我输输输,最后输光光😰😰😰
要退役了🙂🙂🙂
2023/3/7
T2
Description
给出一个 \(n\times n\) 的矩阵,有 \(q\) 次操作,每次为以下两种之一:
-
给出 \(\text{dir},x,y,r\),表示可以覆盖 \(x^{'},y^{'}\) 满足 \(|x^{'}-x|+|y^{'}-y|\le r\),且 \(x^{'},y^{'}\) 在 \(x,y\) 的 \(\text{dir}\) 方向。当 \(\text{dir}=1\) 时要求 \(x^{'}\ge x,y^{'}\ge y\),当 \(\text{dir}=2\) 时,要求 \(x^{'}\ge x,y^{'}\le y\),当 \(\text{dir}=3\) 时,要求 \(x^{'}\le x,y^{'}\ge y\),当 \(\text{dir}=4\) 时,要求 \(x^{'}\le x,y^{'}\le y\)。
-
给出 \(x,y\),求覆盖到它的点的个数。
\(n\le 5\times 10^3,q\le 10^5\)。
Solution
其实也很简单,但是感觉大家都开始摆了🤔🤔🤔
难点在于这玩意覆盖的范围是一个三角形,不太好处理,但是其实我们可以发现的是,我们容斥一下,变为:
总的部分显然是可算的,需要减去的部分可以变化坐标一下,\(y\to y-x\),就变成矩阵了。然后我们就可以二维树状数组直接处理了。复杂度 \(\mathcal O(n\log^2 n)\)。
2023/3/11
爆编啦,哈哈哈哈哈,还tmRE了,挂了130分😄😄😄
别jb构造函数传1e9了!!!别tm用data当结构体名字了!!!
T1
Description
定义 \(s(i)\) 当 \(i\) 为平方数的时候为 \(1\),其他时候为 \(0\)。
求出 \(\sum_{i=1}^{n} \sum_{j=1}^{m} s(i\cdot j)\)
\(n,m\le 10^{12}\)
Solution
md,几乎推出正解了,结果最后一步没想到😅😅😅
我们可以看出,答案就是:
我们又可以推出:
然后答案就是:
可以看出后面部分直接整除分块就可以做到 \(\mathcal O(\sqrt n\log n)\)。
T3
Description
有 \(n\) 个数 \(a_{1,2,...,n}\),设 \(f(T)\) 表示用 \(a_{1,2,...,n}\) 组合出 \(T\) 的方案数。有 \(q\) 次查询,每次查询第一个 \(f(T)\ge H\) 的 \(T\)。
\(n\le 5,a_i\le 10,H\le 10^{15}\)
Solution
这个题目很厉害啊,做不出来对于现在的我来说也很正常。
我们设 \(W=\text{lcm} a_i\)(显然有 \(W\le 9\times 8\times 7\times 5\)),那么我们的答案多项式就可以写成:
后面的东西就可以写成:
可以看出前面是可以用组合数算系数的,而后面的可以直接暴力算出系数,不妨设第 \(i\) 位系数为 \(p_i\),而且它的系数最多是 \(nW\) 的。
那么我们考虑求 \(kW+r\) 这个位置的答案,可以看出答案就是:
可以看出这个东西是关于 \(k\) 递增的,那么我们就可以枚举 \(r\) 然后二分 \(k\) 了。答案记得开 \(\text{long double}\) 即可。
一种简单的方法是直接猜测这个东西对于每个 \(r\) 是关于 \(k\) 的一个多项式,然后直接拉格朗日插值。但是我是个飞屋,写个 T2 都写了1个多小时,最后还爆编了!!!😛😛😛
2023/3/13
哈哈哈,又挂麻了🤣🤣🤣
T1
Description
给出 \(n\) 个平面上的点,两个点距离 \(\le d\) 时存在边,对于每个 \(d\in [0,m]\) 求出最大团大小。
\(n\le 100,m\le 10^5,-10^5\le |x_i|,|y_i|\le 10^5\)
Solution
其实很简单,但是自己又没有想到😏😏😏
我们可以考虑枚举一个团里面距离最大的两个点,不妨设距离为 \(d\),那么能选的点就长成这样:
可以注意到的是两边的点内部一定距离都是 \(\le d\) 的,那么距离 \(>d\) 的不合法点对只能一边一个,所以这玩意的补图是个二分图,那么直接求最大匹配即可。
原题里面是需要求出一组构造的。构造的话用网络流求比较方便,左部选与 \(S\) 联通的,右部选不与 \(S\) 联通的(联通指能通过残余流量不为 \(0\) 的边走到),感觉是对的,但是不太会严谨证明😥😥😥
T3 「JOISC 2017 Day 2」门票安排
Solution
做不出来是正常的捏😣😣😣
我们首先注意到 \(c_i\) 没有什么用,拆成 \(c_i\) 个即可。然后我们先假设一开始所有区间都是选择的 \([l,r)\),可以选一些区间翻转成为 \([l,n],[1,r)\)
- 第一个性质是任意两个翻转的区间一定会存在交,否则一定会存在不劣的解。
我们不妨假设翻转的区间的交集是 \([L,R]\),翻转前的答案为 \(a_{1,2,...,n}\),翻转后的答案为 \(b_{1,2,...,n}\)。假设 \(t\) 是 \(b_{L,L+1,..,R}\) 中最大值的位置。
- 一个性质是 \(b_t\ge \max b-1\)。
否则我们一定可以通过翻转一个 \(l=L\) 的区间和 \(r=R\) 的区间使得区间 \([L,R]+1\) 而别的不增,这样答案一定不劣
- 另外一个性质是存在最优方案使得 \(a_t=\max a\)。
注意到如果 \(a_t\) 不是最大的,那么最大值 \(a_k\) 的 \(k\not \in [L,R]\),那么至少存在一个被翻转的区间没有覆盖到 \(k\),这意味着 \(a_k-b_k\le a_t-b_t-1\rightarrow b_k-b_t\le 2\),而这显然是不合法的。而我们可以进一步地推出 \(a\) 的所有最大值都会在 \([L,R]\) 之中。
找出性质之后我们考虑如何解决这个问题。我们首先进行二分,假设当前需要判断 \(K\) 是否合法,我们先枚举一下翻转的区间个数 \(c\),再枚举上面的 \(t\),那么需要判断是否有 \(K=b_t=a_t-c\) 或者 \(K-1=b_t=a_t-c\),那么就会有 \(c=a_t-K(+1)\)。那么我们就可以考虑贪心地去翻就可以了,毕竟总共会翻多少个都确定了,每次都选没翻地右端点最大的翻就好了,这样显然会最优秀。
复杂度 \(\mathcal O(n\log^2n)\) 。
2023/3/15
没什么好说的,什么都做不出来了😎😎😎
T1
Description
给出一个大小为 \(n\times m\) 的矩阵,每个点有高度,在高度之上有水,删掉一个点定义为流到它上面的水都会消失,对于每个 \(i\in [1,K]\),求出删掉 \(i\) 个节点能够得到最小的还剩的水量。
\(n,m\le 500\)
Solution
可以看出的是,删掉一个位置之后,一个点的水的高度会变为到该位置路径最大值的最小值。我们考虑建出树形结构,因为是点权,所以我们可以建出一个类似于kruskal重构树的东西,满足是个大根堆。我们一个点的变化就可以拆到根到它的链上面去。那么问题就变成了选 \(i\) 条链使得其并的权值最大。这个问题随便做一下就好了。
复杂度 \(\mathcal O(nm\log nm)\) 的。
T2
Description
给出 \(n,m\),求大小为 \(n\times m\) 的 \(01\) 矩阵有多少个使得不存在其他 \(01\) 矩阵使得其行、列 \(1\) 的个数都相同。
\(n,m\le 10^5\)
Solution
我是废物,很显然的一步都看不出来🤗🤗🤗
我们一眼看出其实就是不能存在两行两列,使得其交点分别为 \(0,1,1,0\)。进一步的,合法的矩阵一定会满足任意两列都是子集关系。那么我们就可以列出式子:
问题出在我们没有办法快速计算 \(\begin{Bmatrix} i\\j-1\end{Bmatrix}\),我们考虑直接将其暴力展开,就变成了:
我们考虑枚举 \(k\) 就变成了:
这玩意就可以直接卷了。复杂度 \(\mathcal O(n\log n)\)。
2023/3/18
T2
Description
给出 \(a_{1,2,...,n}\),问有多少个排列使得冒泡排序 \(m\) 之后为 \(a_i\)。如果 \(a_i=0\) 表示该位没有限制。
\(n\le 5000\),答案对 \(998244353\) 取模。
Solution
还是经典老结论,设 \(b_i=\sum_{j=1}^{pos_i}[a_j>i]\),那么每次对 \(a_{1,2,...,n}\) 冒泡排序相当于 \(b_i\to \max(b_i-1,0)\)。很显然 \(b_{1,2,...,n}\) 与 \(a_{1,2,...,n}\) 是一一对应的。
我们考虑枚举我们最后的 \(b_{1,2,...,n}\),假设初始为 \(b^{'}_{1,2,...,n}\),如果 \(b_i\) 不为 \(0\),那么 \(b^{'}_i=b_i+m\),否则 \(b_{'}i\in [0,m]\),那么也即是说我们需要统计 \(b_{1,2,...,n}\) 中 \(0\) 的个数。而 \(b_i=0\) 则相当于其为前缀最大值。所以我们就相当于每次统计到前缀最大值就贡献 \(\times (m+1)\)。直接算一下就好了。复杂度 \(\mathcal O(n^2)\)。
T3
Description
给出 \(n\) 个数,有 \(m\) 次查询,给出 \(w\),\(1\to n\) 依次考虑,如果 \(w\ge a_i\),可以选择操作 \(w\to w\otimes a_i\)。对于每个 \(w\) 求出最多可以操作多少次。
\(n\le 3\times 10^5,m\le 10^6,w,a_i\le 2^{30}\)
Solution
设 \(\text{hei}(x)\) 表示 \(x\) 的最高位,一个结论是答案要么是 \(\text{hei}<\text{hei}(w)\) 的 \(a_i\) 个数,要么是其加 \(1\)。因为我们最多选一个最高位与 \(w\) 相同的值。
考虑每次去判断能不能取到。发现真正需要用到的点是很少的。假设 \(w\) 的最高位为 \(t\),我们设 \(s_i\) 表示最高位 \(<t\) 的 \(a_i\) 的前缀异或和,那么可以取 \(a_i\) 判定相当于:
-
\(w\otimes s_i\ge a_i\)
-
\(w\otimes s_j\otimes s_i\ge a_j(\text{hei}(a_j)<t,j>i)\)
注意到假如有 \(j<k\) 使得 \(\text{hei}(a_j)<\text{hei}(a_k)\),那么显然我们只需要判断 \(k\) 即可,所以现在需要判定的点的 \(\text{hei}\) 就是单调下降的。另外,对于同一 \(\text{hei}\) 我们只需要保留最先出现的两个位置,因为如果同时存在 \(j<k\) 使得 \(\text{hei}(a_j)=\text{hei}(a_k)\),那么一定有 \(\text{hei}(w\otimes a_i\otimes s_i)>\text{hei}(a_j)\),那么 \(k\) 后面的点也就一定满足了。
也就是说我们现在保留了 \(\mathcal O(\log v)\) 个点。每次只需要判这些点即可,这样就做到了单次 \(\mathcal O(nm\log v)\)。考虑优化,我们发现我们可以放到 trie 树上面,对于每个 \(i\) 我们可以从高位到低位一直找合法的初始值 \(w\),然后合法的是一个子树,打一下标记就好了。复杂度 \(\mathcal O(n\log^2 v+m\log v)\)。后面优化的部分有点含糊,但是大致就这个意思。😗😗😗
2023/3/20
T3
Description
给出 \(n\) 个点,求出满足矩阵内部(不含边界)不含点的最大的矩阵周长。
\(n\le 3\times 10^5\)
Solution
妈妈生的,因为 lower_bound 里面传参传错,挂了nm60分🤣🤣🤣原题还做不出来🤗🤗🤗
我们注意到这玩意是求周长,而我们的答案至少都是 \(2\max (H,W)\) ,所以最优解一定会跨过 \(H/2\) 或者 \(W/2\)。那我们考虑如何计算,假设对于 \(x\) 轴分治,发现我们可以对于左右两边的每个点求出加入后缀/前缀后包含这个点的 \(y\) 轴能选的范围,然后直接算就好了。
复杂度是 \(\mathcal O(n\log n)\) 的。不想写,翘了😏😏😏
2023/3/23
T1
Description
有一个长度为 \(n\) 的未知序列,有 \(m\) 个信息,每次给出三个位置的中位数,构造出一个合法的序列。
\(n,m\le 10^5\)
Solution
妈妈生的,这也没有做出来🤣🤣🤣
我们发现三个数的中位数为 \(x\),意味着当一个数 \(<x\) 的时候,另外两个数 \(\ge x\),当一个数 \(>x\) 的时候,另外两个数 \(\le x\)。然后我们就可以跑 2-sat 了。复杂度 \(\mathcal O(n+m)\)。
T2
Description
给出两棵大小都为 \(n\) 的树 \(\text{T1,T2}\),有 \(m\) 次查询,给出 \(x,y\),求出 \(\min_{i=1}^{n} \text{T1 dist}(x,i)+\text{T2 dist}(i,y)\)。
\(n\le 10^5,m\le 5\times 10^5\)
Solution
写了一个点分树的 \(m\log^2 n\),被卡了捏😃😃😃
我们发现我们在第二棵树下面每个点建一个虚点,边权为 \(\text{T1}\) 中 \(x\) 到它的距离,然后维护直径的两个端点,那么我们可以直接查到 \(y\) 的距离。然后我们发现我们其实可以换根地维护这个东西,就可以做到 \(\mathcal O((n+m)\log n)\) 了。但是我没有写。
T3
Description
给出一个大小为 \(n\) 的树,有 \(m\) 次查询,每次查询到 \(x\to y\) 这条路径上距离 \(\le d\) 的点的个数。
\(n,m\le 2\times 10^5\)
Solution
to be done.
2023/3/24
T2
妈妈生的,原题也做不出来了😅😅😅😅 my solution link
2023/3/25
T2
Description
给出一个长度为 \(n\) 的序列 \(h_{1,2,...,n}\),有 \(m\) 次查询,给出 \(l,r\),查询 \(\max_{l\le i\le j\le r} \min h_{i,i+1,...,j}\times (j-i+1)\)。
\(n,m\le 2\times 10^5\)
Solution
我是飞屋🤣🤣🤣
我们考虑对于 \(i\) 求出它能覆盖到的区间 \([a_i,b_i]\),那么我们对于一个区间 \([l,r]\) 的答案就是 \(\max (\min(b_i,r)-\max(a_i,l)+1)\times h_i\)。对于 \(l\le a_i\le b_i\le r\) 以及 \(a_i\le l\le r\le b_i\) 的情况我们可以直接树状数组维护。然后考虑 \(a_i\le l\le b_i\le r\) 的情况,我们发现这个情况可以直接 cdq 分治+李超树。然后就做完了。
cnmcnmcnm。代码翘了,理论过题捏😏😏😏
2023/3/27
T2
Description
有一个 \(n\times m\) 的矩阵,有 \(62\) 种字符,有三种操作,要么交换相邻两个字符,要么旋转以下四宫格,要么把一个矩阵换成给定的 \(k\) 个中的一个。
\(n,m,k\le 20\)
Solution
sb 题,但是不知道自己发了什么癫,去开 T3 而没有看这个题😃😃😃
我们考虑倒着考虑,那么覆盖操作相当于把一个与给定矩阵中一个相同的矩阵换成通配符,那么我们可以不断移动把可以凑成一个给定矩阵的字符都放在左上角把它们都变为通配符即可。
所以最多进行 \(nm\) 次覆盖操作,\((n+m)nmk\) 次交换操作。
2023/3/28
T1 CF1510J Japanese Game
Solution
我不知道出题人死了多少个妈组出来这样一套题🙃🙃🙃
有这样一个事实:对于已经构造出来的 \(\{p\}\),它一定出现的位置是最靠左的构造方案和最靠右的构造方案的交。(考场上想到然后被自己叉了捏😅😅😅不知道是个什么sb😄😄😄)很显然如果你从左边移到右边,那么你左边就一定不必须出现了。
那么我们考虑枚举最靠右和最靠左的位移差 \(d\),那么对于一段必须出现的段 \([l_i,r_i]\),那么最靠左的时候连续的 #
段就是 \([l_i-d,r_i]\)。然后我们就需要考虑中间剩余的连续的 _
段了。首先它的长度必须是 \(\le d\),否则就会有必须出现的位置。然后对于长度为 \(1\) 的显然是无解的,其余情况我们就可以用 \(2,3\) 去构造出来。比如长度为 \(2\) 的我们就可以用 #_
构造,\(3\) 就可以用 ##_
。
那么我们显然就会 \(\mathcal O(n^2)\) 了。不过可以发现的是,我们的 \(d\) 只需要枚举 \([0,3]\) 了。复杂度就是 \(\mathcal O(n)\) 了。
T2 CF794G Replace All
Solution
考试的时候没有仔细想,所以不好评价捏😎😎😎
首先考虑没有 ?
的情况。设第一个串叫 \(s_1\),第二个串叫 \(s_2\)。如果 \(s_1=s_2\),那么答案显然就是 \(2^{n+1}-2\)。
否则我们找到两个串第一个不同的位置,而这也意味着一个串是另外一个的前缀,假设是 A
是 B
的一个前缀,那么我们把 A
都换成 B
的前缀,最后两个串还是要相等,这意味着这两个串都是一个长度为 \(\gcd(|A|,|B|)\) 的一个循环,这个是可以证明的,但是不太好形式化表述。我们假设 \(s_1\) 比 \(s_2\) 多 \(a\) 个 A
,\(s_2\) 比 \(s_1\) 多 \(b\) 个 B
,这意味着 \(a|A|=b|B|\),当 \(a=b=0\) 的时候,答案就是:
否则,我们设 \(a^{'}=a/\gcd (a,b),b^{'}=b/\gcd(a,b)\),我们就有 \(|A|/\gcd(|A|,|B|)=b^{'},|B|/\gcd(|A|,|B|)=a^{'}\),那么我们的答案就是:
不妨设对于不同 \(a,b\) 答案为 \(f(a,b)\)。
然后我们就需要考虑存在 ?
的情况,我们假设已经有的差为 \(a,b\),\(s_1\) 有 \(c_1\) 个 ?
,\(s_2\) 有 \(c_2\) 个 ?
,那么答案就是:
那么我们就可以考虑枚举 \(i,j\) 差值从而使用范德蒙德卷积,那么答案就是:
直接算就好了。复杂度 \(\mathcal O(n\log n)\),瓶颈在于求 \(\gcd\)。
思维难度感觉还是有点大的,如果省选真这样考我就退役了捏😌😌😌