s5o 时隔一年复活状态修复过程记录

· · 个人记录

同步发表于 cnblogs

1.6

T1 傻子都会。

T2 高级数学题,不会。

T3 线段树维护一个区间做的工序,pushdown 比较好实现,注意维护糕点彻底废了的情况。

赛时 100+20+70=190,rk2,但是 T2 想不到预处理,怒挂 40pts。

Liujiaxin 怎么这么强,给 Liujiaxin 磕头了/bx /bx。

rating:1310\rightarrow1513

1.7

T1 想到平衡树想不到权值树状数组,被核膜 2log BIT 爆踩,怒挂 50pts。

T2 傻子题,开个队列随便搞我却不会,再挂 50pts。

T3 神秘树形 DP,我肯定不会。

赛时 50+50+0=100,rk5,ljx 怎么又 AK 了。/bx

rating:1513\rightarrow1573

1.15 ~ 1.17

期末考,但是生物倒三,甚至比语文都差。

1.19

从今往后都只有小基班。

T1 唐诗物理题。

T2 逆序对判断无解然后冒泡乱搞能过,不知道为啥。

T3 单调队列优化 DP 我都不会,已经被初二大神单调队列了。

T4 神秘状压 DP,我肯定不会。

赛时 100+100+35+10=245,rk1,拜谢 ycy 用正解过了 T2。

rating:1573\rightarrow1730

1.20

T1 神秘找规律,大概和进制有关,推一推就找到了。

T2 暴力 DP 可过,我没过,望周知。

T3 RBIT 傻子题,拜谢 zzx 爆切权值线段树。

T4 直接 CV 题目给的 code 拿了 30。

赛时 100+40+100+30=270,rk1。膜拜巨佬 ymz 和 tyh 过了 T2。

rating:1730\rightarrow1835

1.21

换成 J 组模拟了,不想写。

unrated 了,rk2。

1.22

还是 J 组模拟,但是 T1 不开 long long 不特判翻车了,怒挂 20

T2 非常唐,T3 用个 multiset 模拟一波就完事了。

T4 好像是余弦定理加上 S=\dfrac{1}{2}ab\sin C 找到夹角正弦值最大,然后枚举 a,b,后面不会了。

好像大家都过了 T1。

赛时 80+100+100+40=320,rk1。

rating:1835\rightarrow1915

五场合计升了六百多分,状态保持地还算不错(主要是一起打比赛的人变了)。

1.23

被 TheShuMo 和 Scene 还有 Qshuqi 大神炸鱼了,%%%%%%%%%%%%%%%,我是唐诗。

罚时惨败 qsq 2h,喜提 rk4。

T1 n,m\le 10,一开始误导了我正解的复杂度,但是后面发现不会 \mathcal{O}(n!m) 之类的做法,结果发现可以神秘 \mathcal(n^7) 记忆化搜索,好像也可以直接 DP。

T2 看见删除想到可以离线反过来加边,然后暴力 Floyd 可做,复杂度 \mathcal{O}(n^3),直接秒了。

T3 写了神秘 25 分暴力,T4 一点不会。

这几天 S 组模拟赛加上两次正式的 CSP-S 的 T4 一共喜提 0+0+10+30+0=40 分,还是太菜了。

赛时 100+100+25+0=225,rk4。拜谢 TheShuMo 和 Scene 过了 T3。

rating:1915\rightarrow1913,如果罚时战胜 qsq 的话能上分的。

1.24

又被 TheShuMo 和 Scene 炸鱼了。

T1 枚举虱子对答案的贡献,先搞下来虱子出现的信息,然后排个序,差分一下,然后用异或前缀和统计只有一个信息对应这一天的信息编号,统计一下就完事了。

Scene 大神是枚举每一天对答案的贡献,然后去找这一天这只虱子只有一条信息的答案,反正也差不多,%%%。

T2 只会 \mathcal{O}(2^nn^3) 的做法,卡卡常能过 n\le 16,喜提 40

T3 好像卡常能过。拜谢 TheShuMo 卡常过了 2s。只能说人唐常数大。

T4 直接 01 背包,但是我没有发现背包大小只有 5n 而不是 x,怒挂 20

赛时 100+40+40+60=240,错失反杀 TSM 和 Scene 的绝佳机会。

TheShuMo 大神 100+0+100+60=260,Scene 巨佬 100+0+60+80,但是最后罚时惜败 Scene 1.5h,喜提 rk3。

致敬传奇线段树分治 -296 巨佬 qsq。

rating:1915\rightarrow1947,不知道为啥到了榜七,但是明天 ljx 大神 WC 结束强势回归,又要被炸鱼了,到时候要是拿个 rk5 可要掉大分了。

1.25

今天没被炸鱼 /bx

T1 写了 \mathcal{O}(2^n) 暴力,但是 tyh 写了 n^2 的,膜拜。

T2 不难发现后手不能改变两个不互质的数的先后顺序,所以先手需要把不互质的数对中小的数卡在前面,然后先手可以直接把序列从小到大排,这样小的数一定会卡在前面。

我们找到所偶遇不互质的数对,建立有向边(小的一定在大的前面),后手用 priority_queue 拓扑排序即可做到字典序最大。

T3 不会,写了暴力,而且忘记判重边保龄了。

T4 打了 \mathcal{O(nq)} 暴力。

% zzx 爆切 T2。

赛时 20+100+0+21=141,rk1。

rating:1947\rightarrow1998

下午 lg gks,100+100+0+26,rk21,上大分。

放个小基班所有人每天的内部排名(不算炸鱼的),这样有助于 TSM 等巨佬判断谁有实力(反正我肯定没有)。

1.19 1.20 1.22(pj) 1.23 1.24 1.25
sto_5k_orz 1 1 1 1 1 1
bbbzzx 6 2 9 3 3 2
yemengzhi 9 6 8 6 4 10
YDMaYi 5 5 5 6 7 7
Dicer_L 7 8 10 9 7 7
tyh_27 4 3 3 2 2 3
54ycy 2 7 2 4 10 5
ljc_07 10 10 4 8 6 6
fly_fire 8 9 6 10 7 9
lzh301 3 4 6 5 5 4

名次总和不想算,大概 tyh 第二。% tyh。

bbbzzx、tyh27 和 54ycy 一人拿了两次单场第二,%%%

寒假还有一波集训,估计还有比赛。

综上所述,前半期我没有打出任何 pj 难度以上的算法(RBIT 板子不能算),我就是 fw。

2.6

开场半个小时后才发现有比赛。

T1

我们令 x^2-y=a^2,移项,得到 y=(x-a)(x+a),显然 x-a\le \sqrt n,直接枚举 x-a 即可。

T2

先进行一次差分,得到差分数组 b,然后任务就是给一个点 +x,另一个点 -x,最后前 n 项全为 0

我们定义一个 dp_i 表示将状态 i 包含的数全部清空为 0 的最小步数。

然后考虑如何从 dp_{i-2^j} 转移至 dp_i

如果 b_j=0,那么可以直接转移过来。

如果这些 i 包含的所有位置的差分值之和为 0,可以发现最后把所有数赋值成一样的之后不用再全变为 0 了,所以也可以直接转移。

否则加个一。

T3 不难发现给的那个 G(i,j) 是可以快速算的,复杂度应该是 O(1) 的。

所以我们直接枚举 y\lfloor\dfrac{x}{y}\rfloor,然后直接算 G(x,y),枚举 x,找到 g(x,y)=G(x,y),就可以得到方案数非常小,只有 25n 不到。

赛时数组只开了 20n 挂了 10 分,好像直接开大会 T,还要加快读。

赛时 100+100+90+0=290,rk1,算是比较好了。

rating:1998\rightarrow2056

2.7

寄麻了,被初二爷单调队列了。

T1

明显的背包,不难发现回文数只有 500 个,直接 O(nm) 的背包就完事了,但是我写了前缀和优化 DP,记 dp_{i,j} 表示和为 i,最大的回文数为 j 的方案数,然后前缀和优化一下,也能过。

T2

不会,写了特殊性质(但是没有写 O(na) 暴力,因为 a\le 10^9)。

T3 看不懂,T4 写了暴力。

最后 100+20+0+40=160,rk3,被初二爷单调队列了 5 分。

T2 O(na) 暴力能多过一个点,T3 全输出 -15 分。

拜谢 ycx2010 T4 打了 70 分。

rating:2056\rightarrow2061

2.8

小基班寄麻了,怒拿 rk6。

T1

非常简单,这个不会可以去喂猪了。

T2

我们令 g=\gcd(n,k)

不难发现当 g=1 时无论 s 的值是几答案都是 \sum\limits_{i=1}^n a_ig>1 时周期是 \dfrac{n}{g}

sg 是定值时,可以发现单个周期内经过了 i 当且仅当 i\equiv s\pmod g,而且每个点的次数都不变,所以答案只和 sg 有关。

由于 g\mid n,我们可以以 \mathcal{O}(d(n)) 的复杂度枚举 g,然后预处理每种 s 的和,单点修改的时候枚举 g 修改和就可以了,对于每个 g,我们用 multiset 统计最大值,最后乘周期出现的次数就可以了。

T3 不会 AC 自动机,T4 写了 $30$ 的哈希暴力结果 string 没 resize 变成 $10$ 了,草。 rating:$2061\rightarrow 2017

2.9

红温场,又寄麻了,挂了比前两场加起来都多的分,但是 rk2 了(不挂 rk1 了)。

T1

不难发现答案只能是 012

$1$ 的情况是满足割一个点就行了,我们用 DP 统计 $(1,1)$ 到 $(n,m)$ 的方案数 $d$,然后统计 $(1,1)$ 到 $(i,j)$ 的方案数和 $(i,j)$ 到 $(n,m)$ 的方案数 $a$ 和 $b$,然后乘法原理得从 $(1,1)$ 经过 $(i,j)$ 到 $(n,m)$ 的方案数为 $ab$,当 $ab=d$ 时 $(i,j)$ 割掉 $(i,j)$ 就够了。 然后有个 sb 写了这个 DP 我不说是谁。 ```cpp f[n][m] = 1; for(int i = n; i; i--) { for(int j = m; j; j--) if(!wall[i][j]) { f[i][j] = f[i + 1][j] + f[i][j + 1]; } } ``` 他甚至算 $(1,1)$ 到 $(i,j)$ 的时候都写对了。 ```cpp for(int i = 1; i <= n; i++) { for(int j = 1; j <= m; j++) if(!wall[i][j]) { if(i == 1 && j == 1) continue; dp[i][j] = dp[i][j - 1] + dp[i - 1][j]; } } ``` 因为这个怒挂 $70$。 T2 是 P9401 原题。 我们可以先全选 $b_i$,然后只能选 $a_i$,这样答案一定不大于 $a_i$。 如果两个 $(a_i,b_i)$ 和 $(a_j,b_j)$,当 $a_i=a_j$ 时,可以将两个数对合并为 $(a_i,\gcd(b_i,b_j))$,因为选一 $a$ 一 $b$ 肯定不如两个 $a$。 然后枚举答案 $ans$,当 $ans\mid a_i$ 时,一定可行,然后我们记 $B_{a_i}=b_i$,对 $B$ 数组建立 ST 表,然后看 $[k\times ans+1,(k+1)\times ans-1]$ 的 $\gcd$ 能不能被 $ans$ 整除即可。 然后各种神仙乱搞做法都能过,我强烈怀疑数据是不是就是生成个随机数然后乘个 $g$ 就完事了,甚至 $\mathcal{O}(2^n)$ 都能过 $10^6$。 T3 直接暴力 DP 有 $60$ 分,T4 权值树状数组也有 $60$ 分,但是有个 sb 没开 ll,我不说是谁。 最后 $30+100+60+30=220$,罚时大胜 bbbzzx 和 zhuhangyu,喜提 rk2。 % ycx2010 连续三天榜一。 zhenghong 最后几秒把 T3 交 T4 上来了,绷。 rating:$2017\rightarrow 2053

2.10

又 tm 寄麻了,200\rightarrow 110,并列第一但是 OI 赛制有罚时变成 rk6 了,也是第一次没有拿到小基班 rk1(bbbzzx 太巨了)。

T1

显然每个串自己的逆序对是必然要算的,这个不重要。

o_ss1 的个数,z_ss0 的个数。

对于两个串 s_1,s_2,将 s_1 排在 s_2 前面的逆序对数是 o_{s_1}z_{s_2}s_2 排在 s_1 前面的逆序对是 z_{s_1}o_{s_2},比较大小即可,用这个拿来贪心,不难证明是对的。

T3

链式前向星记住了清空 head 记不住清空 idx,然后没加快读,100\rightarrow 10

我们令两个人奔袭的周期是 len_1len_2这是路径长的两倍。

我们考虑对每个点 i,得到 Alice 和 Bob 经过的时间,都用 k_1\times len_1+d_1k_2\times len_2+d_2 表示(d_1d_2 都是常数),由于在 i 这个点这里相遇,所以

k_1\times len_1+d_1=k_2\times len_2+d_2\\ k_1\times len_1-k_2\times len_2=d_2-d_1

很明显这是 exgcd 的形式,而且 len_1len_2 是定值,可以预先求好 xlen_1+ylen_2=\gcd(len_1,len_2) 的解,然后乘一下,甚至都可以不用 exgcd,直接暴力也没事。

注意到 d_1d_2 有两种情况(回来的 d 是不一样的),一共四种情况,全算一遍。

复杂度 \mathcal{O}(nq)

超级唐诗 5.0k 代码

rating:2053\rightarrow 2004,写出 T3 就能上大分了。

2.11

30pts 惜败 ycx2010。

过了 T3 没过 T1 是什么水平。

T1

不会,不知道为什么打了链表还是 TLE。

T2

不会,写了 \mathcal{O(2^nm)} 的分,m 是非 0 的数的个数,比较简单骗了 70

T3

\sum\limits_{i=0}^{n} (-1)^i\gcd(n,i) 考虑枚举 $\gcd$,令 $\gcd(n,i)=g$。 如果 $n$ 是奇数,那么所有 $g$,$(-1)^i$ 是 $1$ 和 $-1$ 的情况是一样的,所以答案是 $0$。 否则,根据 $g$ 的奇偶性可以判断 $\dfrac{n}{g}$ 的奇偶性(实在不行你就算 $\dfrac{n}{g}$ 都行),然后按照 Longge 的问题做就完事了。 虽然 $n\le 10^{12}$,复杂度是 $\mathcal{O}(d(n)\times \sqrt n)$ 的,但是 $\mathcal{O}(\sqrt n)$ 是算 $\varphi$ 的,如果 $d(n)$ 特别大那么 $n$ 的小质因子就特别多,所以 $\varphi$ 就跑不满。如果 $\varphi$ 跑得满说明 $d(n)$ 不大,所以复杂度可以接受。 最后 $50+70+100+0=220$,rk2,但是 T1,T2,T3 得分单调递增是什么成分。 但是又被 ycx2010 杀完了,我是 fw。 rating:$2004 \rightarrow 2053$。 ycx 有一场看题没交但是现在已经 $2013$ 了,幸好没有下一场,不然我就寄了。 初二巨佬 zcq、zyx、hlc 都要来小基班,%%%。 ### 2.17 虽然这场前年打过,但是打得比前年都低,喜提小基班 rk7,rating -154。 就这水平还能 CSP-S 1=,真是个笑话。 T1 非常简单,把每个面包当成坐标系的一个点,斜率最大的直线一定是 $x$ 相邻的两个点,新插入一个点的时候直接和边上两个连线算一下斜率就完事了。 我不能理解为什么这种题我都能翻车。 T2 是 CF1710C,但是我不会数位 DP。 T4 本来打了树的分和暴力,结果一个数组开小一个 $\ge$ 写成 $>$ 一分没得。 赛时 $70+10+20+0=100$,rk7,rating -= 140。 真不知道就这水平凭什么能进复赛。 ### 5.5 Dicer_L 对着网络最小费用最大流专场。 T1 和 T2 就是板子。 T3 最小割 = 最大流。 T4 经典拆点最大费用最大流。 T5 餐巾计划。 某 sb 将 $i$ 拆成 $2i$ 和 $2i+1$,然后汇点写了 $2n+1$,我不说是谁。 T6 T7 不会。 最后 $100+100+36+100+100+10+2=448$,rk9。 赛时 T3 数组开小了,可以退役了。 rating:$1905 \rightarrow 1852$。 rk6 五题都是是贺的,无敌了。 Dicer_L 喜欢用 AI 生成的代码。 ### 7.7 省流:运气非常好。 时隔两个月(说两年也可以)再碰 OI。 T1 纯搞笑题。可以把每条直线的函数表达式都算出来,然后就能发现可以用 $x+y$ 和 $x-y$ 的范围判断。 T2 写了个数据分治,但是不知道为什么 $\mathcal{O}(n^2)$ 能过 $10^5$ 但是 $\mathcal{O}(n\sqrt n)$ 过不了。 正解是 bitset,但是某 sb 没想到,我不说是谁。 如此肺雾,如何 NOIP? T3 “每个节点最多连接 $3$ 条边”被我略过了,然后可以边三。 注意到两个点之间的最大流最多只有 $3$,不连通说明是 $0$,联通但是不在一个边双说明是 $1$,在同一边双但是不在同一边三说明是 $2$,在同一边三说明是 $3$。 某 sb 订正 T3 的时候并查集没有初始化 $rt_i=i$,好难猜是谁啊。 很显然两个点 $x,y$ 在同一个边三当且仅当删除任意一条边时,$x,y$ 均在同一边双。可以枚举删除的边跑一遍 tarjan,记 $scc_{i,j}$ 表示 $i$ 在删除边 $j$ 的时候所在边双的编号,然后 hash 一下就完事了。 不知道为什么 EK 跑得比 Dinic 还快。 T4 不会,遂输出 $-1$。 喜提 $100+80+45+10=235$,rk7/52,小基班 rk1,运气好了属于是。 ### 7.8 省流:$60+60+30+0=150$,rk20/52,小基班 rk3,非常糟糕的分。 T1 纯纯 kruskal 重构树 + 倍增板子题但是我没 AC,望周知。 T2 打出了个 $\mathcal{O}(nP(\sqrt n)\log n)$ 的复杂度没过 $2\times 10^5$,以空间换时间导致的。 T3 P2664 原题,但是只写了暴力和菊花的分。 T4 会第一档但是只有 $5$ 分,所以没写。 ### 7.9 省流:打得非常烂,绿题都没切。 T1 非常简单的一个前缀和优化 DP。 T2 看到 $k\le 10^{18}$ 不难想到倍增,但是赛时拼尽全力无法战胜交了暴力还忘记 $k=0$ 的时候也要取模了,赛后 20min 终于战胜。 T3 曼哈顿生成树模板题,但是我咋啥都不会。 遂写了货车运输拿了 $40$ 分,反正是 $\mathcal{O}(n^2\log^2n)$ 的所以没写倍增直接暴力爬树了。 T4 暴力有 $16$ 分,但是在看 T2 所以输出样例 $1$ 分跑路。 最后 $100+60+40+1=201$,rk12,小基班 rk1。T2 但凡记得取模就有 $70$ 了,这样就能 rk10 了。 绿题都场切不了还咋 NOIP 啊。 ### 7.10 啥也没修复,所以今天的模拟赛记录被我吃了。 看题要用眼,想题要用脑。 ### 7.11 生日场,靠着生日 buff 现场发明了笛卡尔树并且在本地跑了 8s 的情况下过了 T2。 最后 $100+100+40+0=240$,喜提 rk8,小基班 rk1。 T1 显然 $n=1$ 和 $n=2$ 的情况是 $1$,然后我们令 $P_i$ 为 $n$ 个点在同一半圆上的概率。 很显然我们需要前 $n-1$ 个点在同一半圆上,然后前 $n-1$ 个点连成的半径相互所构成的圆心角的期望是 $\dfrac{n-2}{n-1}\pi$(没有也用不着任何严谨的证明,看出来就行了),然后第 $n$ 个点要在半圆上必须在 $n-1$ 个点中间或两侧,且与最远端的圆心角小于 $\pi$,可得 $P_i=P_{i-1}\dfrac{n}{2(n-1)}$,裂项可得答案是 $\dfrac{n}{2^{n-1}}$。 T2 现场手搓出了笛卡尔树,但是寄搜常数巨大,本机跑了 8s,不过评测姬上过了。 赛时想的是算每个点的贡献。 令 $dp_{l,r,k}$ 表示 $[l,r]$ 区间内选了 $k$ 个数的答案的最小值。 然后对于一段区间找到最大值的位置 $mid$,然后枚举左右两边的数的个数,分治下去,不难发现状态数只有 $n^2$ 种,加个记忆化就能过了。 记录答案的数组用了个 unordered_map,然后赛时本机跑了 8s(赛后发现编译器忘记开 O2 了),然后一直回忆 custom hash 怎么写,甚至尝试手写哈希表。不过最后我认为本机 8s 评测姬上肯定过不了,拿个暴力分认了算了,没想到过了,fxt 大神的评测姬还是良心啊。 本质相同的正解:先建笛卡尔树,不难发现 $f(l,r)$ 就是 $a_{\operatorname{LCA}(l,r)}$,然后树上 DP 一下就行了。 怎么大家都会 T3,数据随机可还行,所以不难发现只取代价最小的 $200$ 条边可过。 T4 是集训队胡策题,弱化版甚至是个黑。 集训之前定的目标是要拿 15 天的小基班 rk1,现在 5 天了只拿了三次小基班 rk1,还得努力啊。 大基班都是巨佬,我基本上比他们四个都低,退役两年确实影响太大了。 ### 7.12 啥也没修复,所以今天的模拟赛记录被我吃了。 看题要用眼,想题要用脑。 ### 7.13 nmd T2 是个绿题你 tm 甚至还做过你还 tmd 过不了,你还是赶紧退役吧。 T1 是个整除分块板子。 T2 原题 P8097,注意到我 2023 年就过了这题,所以我这两年越来越菜了。 T3 是个线段树合并优化 DP,普及组选手表示不会。 T4 全场加起来拿了 10 分,还是个打表的。 最后喜提 $100+25+15+0=140$,rk18。 nmd 赛时过了 16 个 T2 我都没过,被绿题薄纱了你还咋 NOIP 啊? ### 7.14 你 tm 能不能憋 `// freopen` 了。 T2 `// freopen` $40\rightarrow 0$,rk12 -> rk26。 $100+0+0+0=100$ 很好玩吗。 ### 7.15 黄蓝蓝绿,但是喜提 $100+75+15+0=190$,成功打出了普及组小朋友都不如的分数。 T1 唐题。 T2 可以拆贡献然后推出 $O(n^2)$ 的组合数的式子,但是我不会数学,所以优化不来,拜谢 Tyih 算出来了。 被打表找规律老哥爆踩了 /fn。 T3 是个树状数组,但是我忘记了有个东西叫树状数组了。想到了 $n\le 2000$ 是 bitset,但是由于暴力调了 1h 所以还没有很推明白就结束了。 T4 看错数据范围导致没开 long long,糖丸了。 最后喜提 $100+75+15+0=190$,rk11。 上 225 不是有脚就行。 九天总榜出了,挂的相当多,但是有 rk13,小基班 rk1。 差强人意吧,退役两年能和 Vector_net 和 hlc110516 平分秋色已经很不容易了。 ### 7.16 省流:T1 黄题做了 2h,T2 遍历图不用 dfs,T3 还没看对题比赛就结束了。 喜提 $100+60+0+10=170$,rk10,我比普及组小朋友还菜。 但是不知道为什么很多人没有战胜黄题,所以十天总榜拿下 rk11。 Feather_Moon 270pts rk2,还有 10 天,100 分 / d 的分差已经足够抹平我前 9 天的总分了,总榜别被战胜了就行了吧。 T1 可以想到倒着做,非常唐。 T2 不难想到并查集(我都想到了),然后可以遍历整个图连接,不要 tmd 枚举每个点合并若干轮,而且 tmd 要开 ll(我 tm 开了就过了)。 T3 神秘组合数前缀和 + 莫队优化,这玩意能想出来莫队真的是太巨了,不过我相信 bbbzzx 一定能 AC 这道题。 式子推出来是 $\sum\limits_{i=1}^m \dbinom{n}{i}$,然后莫队转移 $m$ 是容易的,转移 $n$ 的时候可以用杨辉三角 + 前缀和优化做到单次 $O(1)$,所以总复杂度是 $O(m\sqrt n)$,但是这玩意谁 tm 能想出来莫队啊。 T4 不会。 ### 7.17 这啥玩意啊,咋就 rk3 了。 T1 在 $n>m$ 时,打个表发现答案是 $$\dbinom{n}{m+n}-\dbinom{n+1}{m+n}$$ 然后某 sb 没判 $n=m$,我不说是谁。(但是好像有两车人没判) T2 树状数组,要让 $i$ 满足就要把 $i$ 前或后所有 $>a_i$ 的数交换掉,然后两种情况取个 $\min$ 就好了,算这个东西可以用树状数组。 T3 只会 $O(2^nn^2)$ 的 $40$ 分做法,但是好像就是这 $40$ 分拿下了 rk3。 T4 写了个树状数组 + 二分(不太会 RBIT 求 mex 导致的),反正你就说是不是拿了 $10$ 分吧。 T4 原题 P12485,我肯定不会。 最后 $80+100+40+10=230$,不知道为啥 rk3,小基班 rk1 了。 ### 7.18 3.5h 狂攻 T2 获得 $30$ 分的高分,喜提 $100+30+70+0=200$,小基班 rk2,总榜 rk18,拜谢 Tyih 过了 T2,Feather_Moon 过了 T3,被单调队列了。 T1 傻子题。 T2 可以想到按照奇偶性做,然后发现是个括号序列问题,开个栈就维护类似于括号匹配的东西,中间统计一下最值就可以了。 T3 是个容斥。 ### 7.19 寄飞了,T2 纯唐题挂成 60,rk7 $\rightarrow$ rk20。 为啥大家都过了 T1、T2,之前放黄题也没这么多人切啊。 Z 老师还是太会造数据了。 红温了,今天模拟赛记录被我吃了。 ### 7.20 T1T2 都保龄还算人类吗。 $0+0+71+10$,rk30,总榜成功从 rk9 掉到 rk11。 ### 7.21 T1 又保龄了,你 tm 赶紧退役吧。 $0+70+80+29=179$,本来 $279$ 是由 rk3 的,结果只有 rk19。 `#define int long long` 开到快读下面的是个人物。 [T3 题解](https://www.luogu.com.cn/article/yla37gh5) ### 7.22 被 T3 和 T4 创飞了。 $100+100+6+0=206$,rk19。 T1 纯唐,T2 纯唐(赛时有二十多个人场切了 T2,四十多人场切了 T1)。 A_zjzj:这个 T2 的难度和 NOIP T1 差不多。 T3 神秘随机化乱搞,甚至不需要会判偶环就能过。 彻底红温了。 ### 7.23 又被 T3 创似了。 T1 唐题。 T2 $dp$ 前缀和优化简单题,我没做出来。 T3 也是个题。 T4 打了 $O(n)$ 暴力,打表打不出来,痛失 50pts。 喜提 $100+24+0+30=154$,rk14。 ### 7.24 被 T1 唐诗记忆化创似了。 被 T2 唐诗树状数组创似了。 T3 两年前做过,那个时候看到题解写了个线段树分治就不想看了,结果打完听大神 wangkangyou 讲分治找中转点我才恍然大悟,谁 tm 说这题要线段树的来着。 T4 一点不会。 $40+50+20+20=130$,rk19,就这个 B 分数也配打 NOIP。 总榜被大神 wangkangyou 反超,现在第 12 了。 ### 7.25 $100+100+0+50=250$,rk14,我是 250。 T1 唐诗树状数组维护题。 T2 唐诗贪心题。 T3 赛时做了 40min(前面俩唐题做了 3h 我太唐了没办法),甚至没有战胜 20pts。 T4 神秘 exkmp,不会。 ### 7.26 成功被数学题创死。 T1 赛时甚至没有想到矩阵快速幂的 60pts。 T2 赛时甚至没有想到分块打表。 T3 T4 赛时甚至没有看。 喜提 3= 的分。 总榜也是成功掉到了 rk13,小基班 rk1。 qzez 小基班(马上大基班了)成功被义乌同届爆踩。 ### 10.12 停更这么久仅仅是因为他们做的模拟赛是我两年前做过的。 $100+100+10+0=210$,rk5,被 ycy 爆踩。 T1 写假了,但是数据更假,反正我过了。 T2 考虑暴力,记 $dp_{i,j}$ 表示该字符串中出现子序列 $p[i+1,j]$ 的方案数。 ```cpp #include<bits/stdc++.h> using namespace std; #define int long long const int N = 110, mod = 998244353; int n, m; string s, p, t; struct str { int dp[N][N]; void init() { for(int i = 0; i <= m; i++) { for(int j = i + 1; j <= m; j++) dp[i][j] = 0; } for(int i = 0; i <= m; i++) dp[i][i] = 1; } }; str add(str s, char ch) { str ans = s; for(int i = m; i; i--) if(ch == p[i]) { str now = ans; for(int j = 0; j < i; j++) { now.dp[j][i] = (now.dp[j][i] + ans.dp[j][i - 1]) % mod; } ans = now; } return ans; } str merge(str s, char ch) { str a = add(s, ch); str ans; ans.init(); for(int i = 0; i <= m; i++) { for(int j = i + 1; j <= m; j++) { for(int k = i; k <= j; k++) { ans.dp[i][j] = (ans.dp[i][j] + 1ll * a.dp[i][k] * s.dp[k][j] % mod) % mod; } } } return ans; } signed main() { freopen("multiply.in", "r", stdin); freopen("multiply.out", "w", stdout); cin >> n >> m >> s >> p; p = ' ' + p; str ans; ans.init(); for(int i = 0; i < n; i++) { ans = merge(ans, s[i]); } cout << ans.dp[0][m] << '\n'; return 0; } ``` 然后在合并串的时候合并一波 DP 状态,只需要写串和字符合并、串和串合并就行了。 T3 神秘数据分治出错,$20\rightarrow 10$。虽然但是好像 $220$ 也是 rk5。 由于写完 T2 还有 6min 所以没有写 T4,实际上 T4 暴力傻子都会。 ### 10.30 $10+100+12+0=122$,rk7,我是这个。 T1 神秘简单绿题写挂。 T2 考虑启发式合并,如果会就秒了。 T3 将 $8$ 步分成从起点和终点各走 $4$ 步,然后按照 $k$ 的情况分讨,拜谢 bbbzzx 赛时过了 $k=6$ 的档。 ### 11.16 模拟赛请注意起床时间。 8:00 开始的模拟赛 10:30 起床,我无敌了。 $100+100+50+5=255$,并列 rk2,rating:$1847\rightarrow 1929

起床速通唐诗 T1,然后 20min 写完 T2 线性。

第一段前缀和,第二段拆贡献。 ```cpp #include<bits/stdc++.h> using namespace std; #define int long long const int N = 1000010; int dp[N], n, p, sum[N]; signed main() { ios::sync_with_stdio(0); cin >> n >> p; for(int i = 1; i <= n; i++) { dp[i] = (sum[i - 1] + 1) % p; int k = __lg(i); for(int j = 0; j < k; j++) if(i & (1 << j)) { dp[i] = (dp[i] - (sum[(1 << j) * 2 - 1] - sum[(1 << j) - 1]) + p) % p; } sum[i] = (sum[i - 1] + dp[i]) % p; } cout << sum[n] << '\n'; return 0; } ``` T3 50pts 是 Nim 游戏,然后考虑直接倍增维护答案。 啥都可以二进制拼起来。 T4 不会。 rating:$1844\rightarrow 1929

11.17

T1 纯模拟。 T2 考虑将每个字符串用二进制表示,然后 bfs 找状态,将数字取反找最近的就说明原数是最远的。 T3 神秘树状数组,T4 神秘矩阵优化套线段树,我不会。 rating:$1929\rightarrow 1953

11.18

T1 神秘原。

T2 没找到规律,我是这个。

T3 预处理阶乘不取模,我是这个。

rating:$1953\rightarrow 2005

11.20

T1 m 写成 n 怒挂 70,也算是还 CSP-S 2024 的债了。

T2 n\le 3\times 10^5 开了 1e5 的数组,又挂 70

T3 人唐常数大没卡过去,T4 暴力 45pts

rating:$2005\rightarrow 1808

11.21

T1 傻子题,T2 初一写过。

T3 先删黑子树,然后手搓一下发现答案跑数奇偶点、直径有关。

然后某 sb 求直径写挂了,我不说是谁。

T4 O(n^2) 乱搞冲过了随机数据,喜提 70

rating:$1808\rightarrow 1926

11.24

NOIP 模拟赛第一次上 300(不是第一次场切 T3),记之。

T1 过于唐。

T2 直接找最长的不交的数值相同的段即可,不难发现 DP 可做。

T3 神秘人类智慧,总之一定是头顶数字最大的那个人先知道。

然后可以根据手搓过程递归,个人觉得统计转了几圈比较方便。

#include<bits/stdc++.h>
using namespace std;
const int N = 510;
int t, x;
struct node {
    int a, b, c;
};
vector<node> ans;
int dfs(int x, int y, int z) {
//  cout << "x = " << x << ' ' << y << ' ' << z << '\n';
    if(x == y || y == z || z == x) return 0;
    int mx = max({x, y, z});
    if(mx == x) return dfs(abs(y - z), y, z) + 1;
    else if(mx == z) return dfs(x, y, abs(x - y));
    else return dfs(x, abs(x - z), z) + (z > x);
}
int main() {
    ios::sync_with_stdio(0);
    while(cin >> t >> x) {
        if(t == -1 && x == -1) break;
        ans.clear();
        for(int i = 1; i < x; i++) {
            int ret = 0;
            if(t % 3 == 1) {
                ret = dfs(x, i, x - i);
                if(ret == t / 3) ans.push_back({x, i, x - i});
            }
            if(t % 3 == 2) {
                ret = dfs(i, x, x - i);
    //          cout << i << ' ' << x << ' ' << x - i << ' ' << ret << '\n';
                if(ret == t / 3) ans.push_back({i, x, x - i});
            }
            if(t % 3 == 0) {
                ret = dfs(i, x - i, x);
    //          cout << i << ' ' << x << ' ' << x - i << ' ' << ret << '\n';
                if(ret == t / 3 - 1) ans.push_back({i, x - i, x});
            }
        }

        cout << ans.size() << '\n';
        for(auto it: ans) {
            cout << it.a << ' ' << it.b << ' ' << it.c << '\n';
        }
    }
    return 0;
}
rating:$1926\rightarrow 1991

11.25

神秘线下模拟赛,来自义乌中学。

已严肃完成《数据有梯度》大学习。

T1 神秘构造,直接取质因子只有 2,3,5,7,11 的数,然后统计一波,没到一半的质因子给他乘到一半,反正够用。

T2 神秘分治。考虑画笛卡尔树,然后记节点 u 的左子树大小为 L_u,右子树大小为 R_u,可以发现:

\sum\limits_{i=1}^n \min(L_i,R_i)=\mathcal{O}(n\log n)

证明思想类似于启发式合并,大概就是完全二叉树能取到最大。

于是枚举节点,计算每个较小子树中的 a_j,在较大子树中有多少数满足 a_k\le \dfrac{a_i}{a_j} 即可。这个可以离线二维数点解决。

注意到每个点的子树对应的都是一个区间,所以只需要单调栈求出左右儿子对应的区间就行了,不需要画出笛卡尔树。

总复杂度 \mathcal{O}(n\log^2n)

#include<bits/stdc++.h>
using namespace std;
#define pii pair<int, int>
#define mk_p make_pair
#define fi first
#define se second
#define int long long
unordered_map<int, int> tr;
const int N = 100010, M = 1e9 + 10;
int lbt(int x) {return x & (-x);}
void add(int x) {
//  assert(x);
    for(; x <= M; x += lbt(x)) tr[x]++;
}
int ask(int x) {
    int ans = 0;
    for(; x; x -= lbt(x)) ans += tr[x];
    return ans;
}
int a[N], n, tot, le[N], ri[N], m;
pii b[N];
struct Query {
    int id, x, flag;
} q[N * 40];
bool cmp(Query a, Query b) {
    return a.id < b.id;
}
signed main() {
//  freopen("pair.in", "r", stdin);
//  freopen("pair.out", "w", stdout);
    ios::sync_with_stdio(0);
    cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    for(int i = 1; i <= n; i++) {
        while(tot && b[tot].fi < a[i]) tot--;
        le[i] = b[tot].se + 1; b[++tot] = mk_p(a[i], i);
    }
    tot = 0;
    for(int i = n; i; i--) {
        while(tot && b[tot].fi <= a[i]) tot--;
        ri[i] = tot ? b[tot].se - 1 : n; b[++tot] = mk_p(a[i], i);
    }
    for(int i = 1; i <= n; i++) {
//      cout << i << ' ' << le[i] << ' ' << ri[i] << '\n';
        int L = i - le[i], R = ri[i] - i;
        if(L <= R) {
            if(i > 1) q[++m] = {i - 1, 1, -1};
            q[++m] = {ri[i], 1, 1};
            for(int j = le[i]; j < i; j++) {
//              cout << i << ' ' << j << '\n';
                q[++m] = {ri[i], a[i] / a[j], 1};
                if(i > 1) q[++m] = {i - 1, a[i] / a[j], -1};
            }
        }
        else {
            q[++m] = {i, 1, 1};
            if(le[i] > 1) q[++m] = {le[i] - 1, 1, -1};
            for(int j = i + 1; j <= ri[i]; j++) {
//              cout << i << ' ' << j << '\n';
                if(i > 1) q[++m] = {i, a[i] / a[j], 1};
                if(le[i] > 1) q[++m] = {le[i] - 1, a[i] / a[j], -1};
            }
        }
    }
    sort(q + 1, q + 1 + m, cmp);
    int ans = 0, j = 1;
    for(int i = 1; i <= n; i++) {
        add(a[i]);
//      cout << i << ' '
        while(j <= m && q[j].id == i) {
//          cout << "i = " << i << ' ' << q[j].x << ' ' << q[j].flag << '\n';
            ans += ask(q[j].x) * q[j].flag;
            j++;
        }
    }
    cout << ans;
    return 0;
}

注意二维数点之前应该先离散化,但是我懒所以直接写动态开点了。

T3 只会 \mathcal{O}(n^2),拜谢 bbbzzx 切了。

T4 题都没看,但是拜谢 bbbzzx 切了。