点分治. 考虑经过当前分治中心\(u\)的点对数量. 这种数点对数的问题,有一个套路.我们可以依次考虑\(u\)的每个儿子,看用当前的儿子,能和之前已经考虑过的所有儿子,组成多少点对.这样所有合法的点对都会被恰好计算一次. 现在搜索\(u\)的一个儿子\(v\)的子树.对子树里的每个点,考虑它到\(u\)的有向路径形成的串.在搜索的过程中,我们每次要在当前串的"开头"处添加一个字符(即把整个串整体右移一位),没有什么好的数据结构可以维护,于是想到哈希.现在我们要判断,当前的串,是否是&…
ref不是太懂 #include <iostream> #include <cstring> #include <cstdio> using namespace std; typedef unsigned long long ull; int T, n, m, hea[1000005], cnt, uu, vv, rnd[1000005], rot, siz[1000005]; int tot, sf[1000005], sg[1000005], ff[1000005]…
题解 按秩合并怎么清数组对我来说真是世纪性难题 我们很熟练地想到点分,如果我们认为某个点到重心是正着读的,由于它的深度固定,它的串也是固定的,我们只要预处理出所有长度正着重复的串,反着重复的串,和它们的哈希值,遍历树的时候只需要记录一下路径字符串的哈希值,比对一下看是否合法就行 为了快一点可以按深度合并每棵子树 代码 #include <bits/stdc++.h> #define enter putchar('\n') #define space putchar(' ') #define p…
「SDOI2016」征途 先浅浅复制一个方差 显然dp,可以搞一个 \(dp[i][j]\)为前i段路程j天到达的最小方差 开始暴力转移 \(dp[i][j]=min(dp[k][j-1]+?)(j-1\leq k\leq i-1)\)这咋写?还是需要转换一下 开始了,but题目的方差还需要m^2,很好 以下x为m天行走的平均值,s[i]为1~i段路的总路程 那么x可以算对吧:\(x=\frac{s[n]}{m}\) \[m\times \sum^m_{i=1}(x_i-x)^2\\ =m\ti…
#2033. 「SDOI2016」生成魔咒     题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1 11.2 22 拼凑起来形成一个魔咒串 [1,2] [1, 2][1,2]. 一个魔咒串 S SS 的非空子串被称为魔咒串 S SS 的生成魔咒. 例如 S=[1,2,1] S = [1, 2, 1]S=[1,2,1] 时,它的生成魔咒有 [1] [1][1].[2] [2][2].[1,2] [1, 2][1,2].[2,1] [2, 1][2,1].[1,2…
[LOJ 2070] 「SDOI2016」平凡的骰子 [题目链接] 链接 [题解] 原题求的是球面面积 可以理解为首先求多面体重心,然后算球面多边形的面积 求重心需要将多面体进行四面体剖分,从而计算出每一个四面体的重心和体积,加权平均即为整个多面体的重心 四面体体积可以用一个点引出的三条向量的积乘 \(\frac 1 6\) 四面体重心坐标是四个顶点坐标平均数 根据题目提示,球面多边形面积为三个二面角之和减去 \(\pi\),那么我们需要求二面角 先求出法向量,然后点积求向量二面角 [代码] /…
[题解]「P6832」[Cnoi2020]子弦第一次写月赛题解( 首先第一眼看到这题,怎么感觉要用 \(\texttt{SAM}\) 什么高科技的?结果一仔细读题,简单模拟即可. 我们不难想出,出现最多次的子串的长度必然是 \(1\),不管怎样,长度 \(\geqslant 2\) 的子串的出现次数都必然 \(\leqslant\) 长度为 \(1\) 的子串的出现次数. 这样我们就可以将题目描述变变: 给定字符串 \(\texttt{S}\),求 \(\texttt{S}\) 出现次数最多的字…
「SDOI2016」数字配对 题目大意 传送门 题解 \(a_i\) 是 \(a_j\) 的倍数,且 \(\frac{a_i}{a_j}\) 是一个质数,则将 \(a_i,a_j\) 质因数分解后,其质因子的次数和相差为 \(1\). 由此我们可以想到根据质因子次数和的奇偶性对 \(a_i\) 进行分组,不难发现会被分成两组.这让我们联想到了二分图. 我们考虑采用费用流求解. 首先我们可以将源点 \(s\) 向其中一组点连容量为 \(b_i\),费用为 \(0\) 的边,然后从另外一组点的每个点…
「SDOI2016」储能表(数位dp) 神仙数位 \(dp\) 系列 可能我做题做得少 \(QAQ\) \(f[i][0/1][0/1][0/1]\) 表示第 \(i\) 位 \(n\) 是否到达上界 \(m\) 是否到达上界 \(k\) 是否到达下界.我用一个 \(pair\) 存,\(first\) 记录方案数,\(second\) 记录所有的和. \(ans=(P.S-k*P.F)\%mod\) 那么我们每次枚举该位为 \(0/1\) 就可以转移了,逐位计算贡献. \(Code\ Belo…
更改了一下程序的错误. Translation 找出凸包,然后逆时针输出每个点,测试数据中没有相邻的边是共线的.多测. Solution 首先推销一下作者的笔记 由此进入>>> ( 明显是一道二维凸包模板. 在这里,我们简单讲一下二维凸包. 「 在平面上能包含所有给定点的最小凸多边形叫做凸包. 其定义为:对于给定集合 \(X\) ,所有包含 \(X\) 的凸集的交集 \(S\) 被称为 \(X\) 的 凸包 . \(\qquad\qquad\) -- OI-Wiki 」 其实我们可以把凸…