首页 > 其他分享 >「模拟赛」A 层多校联训 4(卖品:CTH)

「模拟赛」A 层多校联训 4(卖品:CTH)

时间:2024-10-10 08:48:37浏览次数:9  
标签:卖品 前缀 字符 后缀 模数 联训 ans CTH

双倒一啦!

感觉这次最大的错误就是没看 T2。(本质原因还是时间浪费的太多了)

赛时记录在闲话

accoder 多校比赛链接

02 表示法

唐诗题!考高精的人都\(**\),输出深度优先搜索解决。高精乘 2、高精减。

子串的子串

官方题解写的不好,放一下 Ratio好吃题解

意思就是:\(ans_{l,r-1}\) 和 \(ans_{l+1,r}\) 中 包含重复的部分 \(ans_{l+1,r-1}\),于是我们用 \(ans_{l,r-1} + ans_{l+1,r}-ans_{l+1,r-1}\) 来转移得到 \(ans_{l,r}\) 以避免重复,最后别忘了再加上字符串 \(s[l,r]\) 自己。

魔法咒语

trie 树

非官方题解思路:(CTH 巨佬的赛时思路,更好理解)

正序、倒序各建一颗 trie 树分别记为 \(tr1,tr2\),那么所有前缀的个数就是 \(tr1\) 的节点数,后缀的个数就是 \(tr2\) 的节点数。

但直接相乘显然会有重复部分,比如两个字符串:abc 和 cd,前缀 abc 和 后缀 d 可以拼成一个字符串 abcd,同样前缀 ab 和 后缀 cd 也可以拼成abcd,有重复,考虑怎么减去这部分重复。

什么时候会有这样的重复呢?发现如果我们存在一个前缀的最后一个字符和一个后缀的第一个字符相同时,就会造成 1 个重复,因为 (该前缀删去最后一个字符加上该后缀) 与 (该前缀加上该后缀删去第一个字符)可以拼成相同的字符串。

但注意,我们所找的会造成重复的前缀和后缀不能只有一个字符(这样删去一个字符后就成空串了,但题目要求不为空)。

所以我们对于 26 个英文字母分别记它们作为前缀最后一个字符的个数 \(cntQ_{字母}\) 和 作为后缀第一个字符的个数 \(cntH_{字母}\),保证这些前缀、后缀都是两个及以上的字符。

那么答案就是两棵树的节点数相乘减去 \(\sum _{i=26 个英文字母} cntQ_i\times cntH_i\)。

表达式

赛时最后五十分钟打了 45 部分分(不会 CRT),以为会很极限了,结果读入出锅保龄 RE 了。

部分分:

  • \(15pts\):暴力,每次询问从 \(1~n\) 算一遍就好了;

  • \(5pts\):每次询问时所有符号相同的情况,记一下所有数的加和 \(s\) 以及乘积 \(f\),询问 \(x\) 时符号是 + 答案就是 \(x+s\),是 * 答案就是 \(x\times f\),是 ^ 答案就是 \(x^f\);

  • \(15 pts\)(但实际有 \(25pts\)):对于没有 ^ 的样例,可以分块或者线段树简单维护就好,如果询问 \(x\) 时,序列可以转化为:\((k_1x+b_1)\times k_2+b_2=k_1k_2x+k_2b_1+b_2\),那么 \(k_{new}=k_1k_2,b_{new}=k_2b_1+b_2\),分块预处理出每个块的总 \(K\) 和 总 \(B\) 就好了,更新时把整个块重新遍历一遍,更新 \(K,B\) ,查询计算一遍所有块得到总的 \(k_总\) 和 \(b_总\),代入 \(x\) 计算。

正解:

数据点分治

前三个点模数过大但数据范围小直接暴力。

其他的点对于模数特别小的,直接维护线段树上的点所有 \(x=[0,mod-1]\) 进入该点时得到的答案,时间复杂度大概是 \(O(qn\log n mod)\)。

而模数较大但是是合数的,把模数拆分成多个小一点的互质的数作为模数,对于每个模数分别像以上方式一样维护,最后 CRT 合并即可。

End

哦对,CTH 大佬无论讲题还是调题都巨棒呢,人也很热心,什么巨型数据结构啊,5k 以上代码啊,都欢迎来找 CTH 调捏

标签:卖品,前缀,字符,后缀,模数,联训,ans,CTH
From: https://www.cnblogs.com/YuenYouth/p/18455566

相关文章

  • [44] (多校联训) A层冲刺NOIP2024模拟赛04
    A.02表示法这题放在ABCD题我可能不会奇怪,但是它放模拟赛T1了赛时代码#include<bits/stdc++.h>usingnamespacestd;classnum_string{ private: stringx; inlinevoiddevided_2(){ stringans="";intnow=0; for(inti=0;i<=(int)x.length()-1;++i){ ......
  • [42] (多校联训) A层冲刺NOIP2024模拟赛03
    今天的乐子今天的乐子2昨天晚上做梦梦见自己被关进戒网瘾学校里面的老师全和疯子一样然后我和这帮疯子老师比疯疯子老师发现他们没我疯所以就把我放了今天的乐子3lhx罗曼蒂克的辟谷A.五彩斑斓赛时的想法\(n^4\)的做法,设\(f_{i,j,k,l}\)表示以\((i,j)......
  • CSP 联训 3
    好吧,又倒数了,就签了个T2,100pts。T1我把相同颜色的存起来,每种颜色找出枚举选哪两个座位不合法的矩阵的左上和右下,如果找到的矩阵左下和右上也相同,则这个矩阵确实不合法,减去,但判断左下和右上的时候写的太急(最后十五分钟才开始打这个暴力)少判了和当前颜色是否相同,挂了80pts,!总......
  • 冲刺CSP联训模拟2
    冲刺CSP联训模拟2A.挤压考虑把一个数写成二进制,不妨记为$\sums_i\times2^i,s=0或1$,设其概率为$p_k$,则期望值:\[p_k\times(\sum_{i=0}^{29}s_i)^2=p_k\times\sum_{i=0}^{29}\sum_{j=0}^{29}s^i\timess^j\times2^{i+j}\]设$dp[i][j]$为异或后......
  • 冲刺CSP联训模拟2
    A.挤压拆位算贡献,一个数二进制表示平方为\(\sum_{i,j}s_i*s_j*2^{i+j}\),单独算每一项的贡献,枚举\(i,j\),只有当这两位都为1时结果才是1,所以我们要找异或后这两位都是1的方案数,这里需要\(dp\)用\(f_{i,j,k}\)表示前\(i\)个数异或出来的\(j,k\)两位是1/0的方案数,对于......
  • [赛记] 冲刺CSP联训模拟2
    三道计数+一道数据结构也是没谁了这场可是好好锻炼了我的写暴搜能力。。。挤压20pts暴搜20pts;把最后的答案进行二进制拆解,即$ans=2^i+2^j+2^k+...$,那么答案的平方为$\sum_{i=0}^{30}\sum_{j=0}^{30}s_is_j2^{i+j}$,其中$s_i,s_j$代表答案二......
  • [赛记] 冲刺CSP联训模拟1[衡中]
    几何100pts赛时打的$DP$没有用bitset优化过了,也是放过了暴力;考虑设状态$f_{i,j,k}$表示考虑到第$i$位,到第$j$位$x$和第$k$位$y$可不可取,直接转移即可;时间复杂度:$\Theta(|s||x||y|)$,应该是过不了的;点击查看暴力#include<iostream>#incl......
  • 冲刺 CSP 联训模拟2
    题面温馨提示代码中的变量名可能与题意、题解不同。代码不删缺省源,可以直接拿来对拍。T1挤压Solution众所周知,异或是一种按位运算,不好进行十进制的数间合并。我们考虑将每个数拆分为二进制的形式进行处理。此时,对于每一种情况,假设表示\(2^i\)二进制位的值为\(b_i\),我......
  • 冲刺 CSP 联训模拟 2
    T1挤压概率期望,二进制拆位看到异或想到拆位算贡献\[\begin{aligned}ans&=\sum_xx^2P(x)\\&=\sum_x(b_1+b_2+...+b_{30})^2P(x)\\\(b_i表示\x\二进制下\i\位的值)\\&=\sum_x(b_1b_1+b_1b_2+...b_{30}b_{29}+b_{30}b_{30})P(x)\\&=\sum_i^{30}\sum_j^{30......
  • 冲刺CSP联训模拟2
    冲刺CSP联训模拟2过T2了,赢了T3T4暴力没写满,输了A挤压我是唐诗老哥一个半小时才过T1发现要求的是\(E(s^2)\),因为有个异或,所以直接考虑拆贡献到每一位\[E(s^2)=E(\sums_i\sums_j)=\sumE(s_is_j)\]所以直接考虑后面那个咋做,就是\(i,j\)位同时是一的时候贡献\(2^......