做题日志1
2025-2-12
-
一道博弈题,经典的套路是找到一个先手必胜局面可以使得先手可以在每个回合后重新回到先手必胜局面.
这道题找到的先手必胜局面是通过将所有已经被操作过的
i所对应的 \(A_i\) 看做同样的东西发现的 , 具体地,如果i被操作 , 就令 \(X\leftarrow X+A_i-1\) .然后选手们可以进行两种操作,一种是将
X变大 , 另一种是令 \(X\leftarrow X-1\) .然后发现
X=0的时候 , 若先手有操作能够必胜, 那X=2的时候也有办法必胜 .如果对手操作
X, 先手也操作X.否则该怎么来怎么来 .
所以我们可以只考虑
X的奇偶性 .然后我们就可以只考虑 \(A_i\) 的奇偶性了 , 这样就有两种,令其数量为 \(C_o,C_e\). 对
X造成不同的影响.剩下的就是分类讨论 , 这里只讲套路 .
a. 找到一种情况之后,可以将其他情况归到这种情况.
b. 枚举先手/后手出手,再让对手拆招,回到对必胜方有利的局面.
2025-2-13
-
一道做法很多的交互题,我的做法理论上是
2n-3但是写起来很难受 , 关键在于dist(1,x),dist(2,x)<dist(1,2)时可以判断被夹在中间 . 在两边的情况是很容易判断的 . 然后再计算 \(A_{P_1}\) , 就可以了 .交互题的教训 , 输出
-1的交互库提示要利用好,否则自己都不知道怎么爆炸的.然后就是还是得利用内置的交互库快速判断自己的代码是否正确.
关于题解的做法,先直接找到
1或n的位置 , 再视情况确定他是1还是n代码非常好写 -
这道题最重要的地方在于将其分解质因子再看 , 然后就能发现 (
f(x/y)的p因子个数) 就是 (x,y的p因子个数之差的绝对值) 然后就能简易地Dp -
两道水题 罚时却吃满了
B 题有个小换元 , 求
x变成求x^n然后就很简单了
2025-2-14
-
这道题是真的抽象 , 题解的做法一直接构造
(A,M)=(N+1,N*N)\[(N+1)^n-1=\sum_k \begin{pmatrix}n\newline k\end{pmatrix}N^k-1 \equiv n*N \pmod {N^2} \]然后就很显然.
我想到的做法依赖于原根 , 如果一个质数
P=kN+1, 那么有一个原根a,a^k就满足答案.这是为什么呢 , 因为如果存在比
N小的n满足,那么 \(a^{nk}=1\) , 不符合原根的定义.但是我不会求这个
P题解居然直接暴力随机...
2025-2-15
-
仍然是一道分类讨论风格的题目,用到工具只有
f(A)=Dist(s,A)+Dist(A,t)用于判断是否在路径上,是否存在这一路径首先最短路一定是答案要走的,我们考虑如何让两个棋子交换位置 , 一个显然的事情就是我们不能让他们在 "简单链" 上交换 , 所以我们要先确定是否是简单链 :
-
f(A)=Dist(s,t)的点的个数是否大于最短路径上点的个数,如果是,说明没有第二条最短路径,否则答案为2*Dist(s,t). -
否则找是否存在
f(A)=Dist(s,t)+1这个路径一定不会走重边 , 这是显然的 , 如果存在 答案为2*Dist(s,t)+1. -
看路径上有没有
度数>=3的点 , 这样的话其中一个棋子可以退出去缓存 . 如果存在 答案为2*Dist(s,t)+2. -
现在就可以先把这条最短路径上的边删了 , 看看有没有其他路径 这样子也一定不会有重边 , 就不可能在简单链上交换.
-
还有一种方法就是在路径外的点也存在
度数>=3的 这样也可以交换 (类似高铁掉头?) , 和情况4取最小值就是答案!!!.
-
2025-2-16
-
这道题最重要的就两点
- 行和列可以分开处理,然后再乘法原理, 就是因为想不到这点我完全没思路
- 然后第k次操作一定是作用在
A或B上的,就可以通过简单的分类讨论动态规划得出答案. - 最恶心的情况是
k=n时 , 这时候不能简单乘法原理 , 因为四种方案都是一样的 , 需要乘以1/4.
-
最重要的就是将合并
100..001之后的111...111看作 1,这样就能简单地递推出答案 -
先将数组差分, 非常套路, 做完之后发现可以对奇偶位分别进行交换,也就是可以排序.
2025-5-5
Gym的题目可以通过 vjudge 搜索到
-
用后缀数组求出
Hei之后 , 以Rk序列分治 , 即[L,R]区间内的元素是[Sa[L],Sa[L+1],...,Sa[R]].那么答案满足
|Sa[i]-Sa[j]|小于min(Hei[L+1]...Hei[R]), 用启发式合并的分治就可以解决
2025-5-6
-
如果A串的字符互不相等,那么我们可以在
O(|B|)的时间复杂度求出最大子串 . -
标记永久化即可,每个节点给一个
multiset.另外需要离散化,记得将空隙也加入到被离散化的集合中,否则就会错
-
树上启发式合并 , 确定
lca,r之后 , 用树状数组和dfn序 查找合法的 l 的数量 .
2025-5-7
-
发现一个性质 ,
x通过k进制变成y当且仅当k是y的因子, 然后一次操作内y能到达的位置大约是[y-k/2,y+k/2], 使k是他最大的因子,就可以推出一次操作能去到的数构成区间 !然后考虑倍增法 , 用
RMQ求出2^i次操作后能去到的区间 , 时间复杂度 \(O(Nlog^2N)~N=150000\) , 据说有方法可以证明y往大走只会去到150000, 证明:若一个
z是被需要的 , 最大的因子是z/2, 左端点为 \(z-\frac z4<100000\) , \(z<133333\) -
首先先注意到 ,
k较大的时候 , 答案和k较小的答案一致 . (上界我不会估算)然后动态规划 , 这里比较自然的思路是先思考
k=0的情况 , 作为辅助数组协助后继的动态规划 .考虑 \(f_i\) 为 通过
i-1后通过i的期望步数 \(:\)\[f_i=1-p+p(1+f_1+\cdots+f_i)\\ f_1=1-p+p(1+f_1)\Rightarrow f_1=\frac{1}{1-p} \]考虑 \(S_i=\sum_{j=1}^if_j\)
\[S_i-S_{i-1}=1-p+pS_i\Rightarrow (1-p)S_i-S_{i-1}=1-p \newline (1-p)^iS_i-(1-p)^{i-1}S_{i-1}=(1-p)^{i-1}\newline \cdots\newline (1-p)^2S_2-(1-p)S_1=(1-p)\newline \Rightarrow (1-p)^iS_i-(1-p)S_1=\frac{(1-p)^i-(1-p)}{-p}\newline S_i=-\frac1p+\frac1{p(1-p)^i}\Rightarrow f_i= \frac1{1-p}^i \]然后就考虑 , 带
k的情况, 待证明
2025-5-8
-
假设我们在第
i+1个时刻拿 , 拿到最大的是j. 这对不同的i是等概率的 , 员工随机拿取可以看做等概率的全排列顺序拿取 , 那么对于n答案为\[\begin{aligned} &\frac{1}{n\times n!}\sum_{i=0}^{n-1}\sum_{j=1}^n \begin{pmatrix}j-1\newline i+j-n\end{pmatrix}(n-i)!i!\times j\newline =&\frac{1}{n\times n!}\sum_{i=0}^{n-1}(n-i)!i!(n-i)\sum_{j=1}^n\frac{j!}{(i+j-n)!(n-i)!}\newline =&\frac1n\sum_{i=0}^{n-1}\frac1{\begin{pmatrix} n\newline i \end{pmatrix}}(n-i)\sum_{j=1}^n\begin{pmatrix} j\newline n-i \end{pmatrix}\newline =&\frac{1}{n}\sum_{i=0}^{n-1}\frac{\begin{pmatrix} n+1\newline i \end{pmatrix}}{\begin{pmatrix} n\newline i \end{pmatrix}}(n-i)\newline =&\frac{n+1}{n}\sum_{i=1}^n\frac{i}{i+1} \end{aligned} \] -
可以用数学归纳法证明 , k 步可以到达的点集为
\[S_k=\{(\frac{Ai}{2^k},\frac{Bj}{2^k})|i,j\in \N \cup[0,2^k]\} \]可做了 .
2025-5-11
- Red-Blue MST
只会LCT, 整体二分法待补 .
2025-5-13
-
我们考虑一个有序对 \((a,b)\) 是否出现 , 如果在一次操作出现 , 就在线地将所有答案中带这个对的 \(count\) 减一 (初始是长度-1) , 由于是排列 , 那么当 \(count\) 归零意味着这个询问出现了 .
维护我们可以考虑
unordered_map<long long,vector<int>>分析时间复杂度 , 发现时间复杂度大概是 \(mq\frac{4}{n},\) 那么当 \(n\) 较小的时候直接自动爆炸 .
对于 \(n\le 100,\) 可以直接上
Trie时间复杂度是 \(nm+nk.\) 空间复杂度 \(nk.\)
2025-5-15
-
考虑
Trie对于每一个Trie上的节点 , 对所有 \(j\) 贡献 \(\left \lfloor \frac{siz}{j} \right \rfloor\) , 因为我们只考虑这个点所代表的字符 .那么插入 \(S\) 的时候 , 对于经过的每一个字符 , 修改 \(\left \lfloor \frac{siz}{j} \right \rfloor\) 和 \(\left \lfloor \frac{siz+1}{j} \right \rfloor\) 不同的这些 \(j\) 的答案,也就是 \(siz+1\) 因数集合的子集 .
-
首先发现一个事情 , 一个
Mahjong中每个吃只可能有0~2个 , 不然可以转化碰 .那么我们可以用 \(d_1,d_2,d_3,d_4,d_5,d_6\) 代表每种吃的个数 , 从而算出来用于吃的麻将个数 .
这一个想法很重要的原因是他把
Mahjong分割成了不重不漏的集合 , 这是因为 \(d\rightarrow 个数\) 的变换是一个可逆矩乘 . 并且当一个麻将个数大于等于3一定会从后往前被用到 , 用完之后又会出现小于3的尾 , 所以%3也一一对应 .然后通过精细实现可以算出复杂度在 \(O(3^6n+3^{12})\)
2025-5-17
-
一道简单的计算几何 , 但是提醒我要去准备计算几何板子了 .
首先知道球面坐标怎么求 , 然后就可以通过将 p 投影到 ost 平面 , 分类讨论计算了 .
-
本来我是负责数学的 , 队友先做了
这道题就是一个根号分治 , 和不经过棋盘内某些点的容斥动态规划 .
2025-5-18
-
闵可夫斯基和模版题
2025-5-24
-
设 \((x,y)=1\), \(\frac{x}{y}\) 是有限小数当且仅当 \(y=2^s5^t.\)
不妨设 \(b=w2^x5^y,\) \((w,2\times 5)=1\)
那么一定有 \(d=w2^{x'}5^{5'},(c,d)=1\) . 否则 不妨设 \(d=z2^{x'}5^{5'}\)
\[\frac{a}{b}+\frac{c}{d}=\frac{az2^{x'}5^{y'}+cw2^x5^y}{wz2^{x+x'}5^{y+y'}} \]得到
\[az2^{x'}5^{y'}+cw2^x5^y=kwz \]根据不定方程有解的条件 , 令 \(a,k\) 为未知数
\[(z,wz)|cw\Rightarrow z|w \]令 \(c,z\) 为未知数
\[(kw,w)|az\Rightarrow w|z \]有这个引理之后 就可以将原式写作
\[\frac{a2^{x'}5^{y'}+c2^x5^y}{w2^{x+x'}5^{y+y'}}\Rightarrow c=-a2^{x'}5^{y'}(2^x5^y)^{-1}\pmod w \] -
关键点在于小于 \(\sqrt {3000}\) 的质数数量只有 \(16\) 个, 如果所有的数 , 所有质因子都是这 \(16\) 之一 , 就可以在 \(O(n2^{|S|})\) 的时间复杂度内做完 .
如果有大于 \(\sqrt{3000}\) 的质因子 , 由于每个数只会有至多一个 \(\ge \sqrt {3000}\) 的质因子 , 按照其有的质因子分成多个集合 , 对每个集合进行上述状压 Dp .
最后直接用
Fwt合并 , 时间复杂度是 \(O(\pi(n)\times 16 \times 2^{16})\)
2025-5-25
-
最困难的点在于怎么将 \(S,T\) 匹配的过程融入转移中 .
惯常的思路是 , 令
dp[i][j][t]为i,j成功匹配为1,i左边有t个1被消去的方案数 , 好吧 , 其实这是我一开始非常 nc 的思路 , 并且给他写了个 找前一个1的垃圾转移方程 .实际上 , 将状态设为
dp[i][j]为前i-1,j-1成功匹配的方案数 , 就可以直接考虑向后转移 , 不需要再枚举之前的状态 .如果可以 \(S=0,T=0\) , \((i,j)\rightarrow (i+1,j+1)\)
如果可以 \(S=1,T=1\) , \((i,j)\rightarrow (i+1,j+1)\)
如果可以 \(S=1,T=000\) , \((i,j)\rightarrow (i+1,j+3)\)
边界条件是
dp[1][1-k]=1, 答案是dp[n+1][n+k+1]这是因为这两个位置的关系都是某一边有k次位移发生 .
2025-5-27
-
这道交互题的关键在于随机树的平均直径是 \(\Theta(\sqrt n),\) 所以对于一个点 , 离他最远的点是 \(\sqrt n\) 级别的 , 每次找最长的链 , 将一棵树分成 链上的节点个数 个子问题处理 .
一直开根号的理论操作次数是 \(\Theta(nloglogn)\) 级别的 , 通过利用上一级计算的结果可以节省一半操作次数 .
-
这是一道分类讨论题目 , 关键点在于 (什么时候有解,如何凑出最大值,如何让最大值唯一) .
思考分治法求最大子段和的过程 , 发现如果 \([1,l-1]\) 的一段后缀非负或者 \([r+1,n]\) 的一段前缀非负 , 这个区间都不可能是最大子段 . 否则可以通过将
l,r操作成无穷大使这个区间变成最大子段 .首先 , 发现这个 最大子段和 可能是 原来的最大子段和 \(M\).
引理 1 , 不存在任何一个子段满足 \(L<l\le R,\) 并且子段和为 \(M\) . 否则和最大子段和为 \(M\) 矛盾 .
对于 r ,也类似 .
所以任意一个和为 \(M\) 的子段只会在 \([l,r]\) 内 . 假设 \([l,r]\) 内有多个 \(M\)
\[\{l\}M \cdots M \cdots M\{r\} \]可以发现 \(\cdots\) 的位置都是 \(\le -M\) 的 否则就和最大子段和矛盾 .
将每一段都操作成正好 \(=-M,\) 前后两端修成 \(0\), 最后正好就是 \(M.\)
现在考虑唯一的问题 ,
-
如果 \([l,r]\) 内确实有 \(M\)
如果 \(l,r\) 都不属于这些段内 , \(l,r\) 位置都要加一 , 答案加二
如果其中一个在 , 不在的位置 , 答案只用加一 .
如果两个都在 , 看 \([l+1,r-1]\) 是否还有这些段 , 如果有 , 两端都要加一 , 否则 , 将中间的 \(-M\) 改为 \(-M+1\) 这样必须两段合在一起才是最大, 答案只用加一
-
如果外部有 \(M\) , 答案只用加一
-
特殊情况 , 如果 \(M\) 是 \(0\) , 需要让 \(M\) 变成 \(1\) , 如果 \(l\not= r,\) 还需要让 \(M\) 变成 \(2\) , 这是因为这会使 \(l,r\) 中某一个变成 \(0\) .
-

浙公网安备 33010602011771号