题目大意 给你一棵树, 每个点有一个点权. 有两种操作: link / cut 修改某个点的点权 每次操作后, 你要输出以下答案: 在整棵树中任意选两个点, 这两个点的LCA的期望权值. Solution 我们考虑每个点作为LCA的概率: \[ P(u为LCA) = \frac{sz[u]^2 - \sum_{v为u的子节点} sz[v]^2}{n^2} \] 所以我们的答案为 \[ \begin{aligned} E &= \frac{\sum_{每个节点u} (sz[u]^2 - \sum_…
Solution 首先审清题意, 这里要求的是子串而不是子序列... 我们考虑用1表示p, -1表示j. 用sum[i]表示字符串前\(i\)的前缀和. 则我们考虑一个字符串\([L, R]\)有什么要求: \(\forall x \in [L, R]\)满足\(sum[x] \ge sum[L - 1]\). 我们分别从前往后和从后往前求出以每个位置为开头的最长合法子串, 然后扔进树状数组里面查询即可. 至于怎么求以每个位置为开头最长合法子串, 我们考虑用一个单调栈来维护: 从前往后扫每个位置…
Solution 这道题有两个关键点: 如何找到以原串某一个位置为结尾的某个子序列的最晚出现位置 如何找到原串中某个位置之前的所有数字的最晚出现位置中的最大值 第一个关键点: 我们注意到每个数字在\(M\)和\(L\)中最多只会出现一次. 以\(M\)为例, 我们从前往后逐位在原串中匹配, 数组f[i]表示\(M\)的前\(i\)位在原串中当前位置之前的最晚出现位置. 假设当前数字\(x\)在\(M\)中出现位置为\(p\), 则 \[ f[p] = \begin{cases} f[p] = i…
Solution 场上的想法(显然是错的)是这样的: 我们假设棋子是一个一个地放置的, 考虑在放置棋子的过程中可能出现哪些状态. 我们令有序整数对\((i, j)\)表示总共控制了\(i\)行\(j\)列的情况, 我naive地认为一个状态要么不出现, 要么只出现一次. 于是用\(f[i][j]\)来表示出现的概率, 直接进行DP. 然后我用随机函数对拍, 发现是WA的... 考虑问题出现在了哪里: 一个状态实际上是可以出现多次的. 比如说我们考虑分别控制了两行两列的状态: 两行两列产生4个交点…
题目大意 你们自己感受一下原题的画风... 我怀疑出题人当年就是语文爆零的 下面复述一下出题人的意思: 操作1: 给你一个点集, 要你在trie上找到所有这样的点, 满足点集中存在某个点所表示的字符串是这个点所表示字符串的后缀. 把这些点的权值加一: 操作2: 给你一个点集, 要你在trie上找到所有这样的点, 满足这个点所表示的字符串是点集中某个点的后缀; 求所有这些点的权值之和. 做法很显然, 我们先建立出后缀树, 在后缀树上树剖, 剖出的序列用线段树维护即可. 注意树剖得到的序列中, 一个…
Solution 考虑给定一个\(n\), 如何求\(1\)到\(n\)的正整数中有多少在队列中. 不难注意到我们只需要处理质数次方的情况即可, 因为合数次方会被其因数处理到. 同时我们考虑到可能存在两个正整数\(a\)和\(b\)使得\(a^2 = b^3\), 因此我们要将这种情况减去, 也就是相当于要减去可以被表示为\(x^6\)的数的个数. 这样一来, 按照莫比乌斯函数容斥即可. 然后考虑如何求序列的第\(n\)项: 一种方法是二分; 同时我们也考虑到由于不在队列中的正整数十分稀疏, 因…
Solution 智障暴力题, 每个点维护一下子树信息, 树剖就好了. 我居然还傻了写了一发毛毛虫... #include <cstdio> #include <cctype> #include <vector> #include <algorithm> #include <cstring> #define vector std::vector #define max std::max #define min std::min #define s…
题面 Description 给定一个字符串 ss .现在问你有多少个本质不同的 ss 的子串 t=t1t2⋯tm(m>0)t=t1t2⋯tm(m>0) 使得将 tt 循环左移一位后变成的 t′=t2⋯tmt1t′=t2⋯tmt1 也是 ss 的一个子串. Input 输入仅有一行,一个字符串 s(1≤lens≤300000)s(1≤lens≤300000) .字符串 ss 仅包含小写字母. Output 输出一个整数表示答案. Sample Input (样例输入1) abaac (样例输入…
Solution 傻X题 我的方法是建立后缀后缀树, 然后在DFS序列上直接二分即可. 关键在于如何得到后缀树上每个字符对应的字节点: 我们要在后缀自动机上记录每个点在后缀树上对应的字母. 考虑如何实现, 我们在后缀自动机上的每个状态上, 记录其所对应的在字符串中的位置, 减去其父亲节点的长度即可得到每个节点对应的后缀树上的字符. #include <cstdio> #include <cstring> #include <algorithm> using namesp…
Solution 这到题目有意思. 首先题目描述给我们提供了一种非常管用的模型. 按照题目的方法, 我们可以轻松用暴力解决20+的问题; 关键在于如何构造更大的情况: 我们发现 \[ [(n + n) / n] \times [(n + n) / n] \times [(n + n + n) / n] + (n - n) \times (n + n + n + ... + n) = 24 \] 因此只要有\(n \ge 15\), 就一定有解, 并且可以按照上述方法凑出来. 至于\(n \le…