关键词提取顾名思义就是将一个文档中的内容用几个关键词描述出来,这样这几个关键词就可以提供这个文档的大部分信息,从而提高信息获取效率。 关键词提取方法同样分为有监督和无监督两类,有监督的方法比如构造一个关键词表,然后计算文档和每个次的匹配程度用类似打标签的方法来进行关键词提取。这种方法的精度比较高,但 Read More
背景与原理: BP神经网络通常指基于误差反向传播算法的多层神经网络,BP算法由信号的前向传播和反向传播两个过程组成,在前向传播的过程中,输入从输入层进入网络,经过隐含层逐层传递到达输出层输出,如果输出结果与预期不符那么转至误差反向传播过程,否则结束学习过程。在反向传播过程中,误差会基于梯度下降原理分 Read More
背景与原理: 朴素贝叶斯算法是机器学习领域最经典的算法之一,仍然是用来解决分类问题的。 那么对于分类问题,我们的模型始终是:用$m$组数据,每条数据形如$(x_{1},...,x_{n},y)$,表示数据共有$n$个特征维度,而$y$表示该数据所属的类别,不妨设有$k$个取值$C_{1},...,C Read More
背景与原理: 首先我们需要知道集成学习的概念,所谓集成学习,就是使用一系列学习器进行学习,并且通过某种规则把这些学习器的学习结果整合起来从而获得比单个学习器学习效果更好的机器学习方法。这样的方法可以用于解决单个学习器的过拟合、性能瓶颈等问题,常用的集成方式主要有Bagging(并行)和Boostin Read More
背景与原理: 决策树算法是在各种已知情况发生概率的基础上通过构成决策树来求某一事件发生概率的算法,由于这个过程画成图解之后很像一棵树形结构,因此我们把这个算法称为决策树。 而在机器学习中,决策树是一种预测模型,代表对象属性和对象值之间的一种映射,一棵决策树的每个内部节点会处理数据的某个维度对应的变量 Read More
背景与原理: 支持向量机是一种用来解决分类问题的算法,其原理大致可理解为:对于所有$n$维的数据点,我们希望能够找到一个$n$维的直线(平面,超平面),使得在这个超平面一侧的点属于同一类,另一侧的点属于另一类。而我们在寻找这个超平面的时候,我们只需要找到最接近划分超平面的点,而一个$n$维空间中的点 Read More
背景与原理: 聚类问题与分类问题有一定的区别,分类问题是对每个训练数据,我给定了类别的标签,现在想要训练一个模型使得对于测试数据能输出正确的类别标签,更多见于监督学习;而聚类问题则是我们给出了一组数据,我们并没有预先的标签,而是由机器考察这些数据之间的相似性,将相似的数据聚为一类,是无监督学习的一个 Read More
背景与原理: PCA(主成分分析)是将一个数据的特征数量减少的同时尽可能保留最多信息的方法。所谓降维,就是在说对于一个$n$维数据集,其可以看做一个$n$维空间中的点集(或者向量集),而我们要把这个向量集投影到一个$k<n$维空间中,这样当然会导致信息损失,但是如果这个$k$维空间的基底选取的足够好 Read More
背景与原理: KNN算法其实是逻辑最简单的分类算法——我们认为一个数据的类型是由与其最接近的数据决定的,而“接近”实际上就是我们度量两个数据点之间的距离,如果我们把一组数据看做一个向量$(x_{1},...,x_{n},y)$,其中$y$代表这个数据的类别,那么两组数据$X_{i},X_{j}$间的 Read More
背景与原理: 线性回归可以实现对连续结果的预测,但是现实生活中我们常见的另一种问题是分类问题,尤其是二分类问题,在这种情况下使用线性回归就不太合适了,我们实际上需要计算出的是一个在$[0,1]$之间的概率来告诉我们某样本属于某一类的概率,因此逻辑回归应运而生。 一般的逻辑回归就是在线性回归的基础上嵌 Read More
背景与原理: 线性回归是机器学习建模中最为简单的模型,也是计算起来最为直观的模型 所谓线性回归,我们要建立的是这样的模型:对一组数据,每组数据形如$(x_{1},...,x_{n},y)$,我们希望构造一个线性函数$h_{\theta}(X)=\sum_{i=0}^{n}\theta_{i}x_{i Read More
这类问题的基本模型是:你有$n$个小球,$m$个盒子,现在想把这$n$个小球放进$m$个盒子中,问有多少种放的方法 但是只给出这样的条件并不足够,我们必须加上一些限制,否则结果是不确定的 一般加的有三个限制,即小球是否有区别、盒子是否有区别、允不允许有空盒子,也因此可以组合出八种不同的问题 接下来我 Read More
好久没写oi系列的题解了 要不是为了大作业我才不会回来学这些奇怪的东西呢 本题对抗搜索就好啦 首先要分析一点,就是由于我们的黑棋每次走两步,白棋只走一步而且是白棋先走,所以除非白棋第一步吃掉黑棋,否则黑棋必胜 接下来就是计算黑棋如何取胜的问题了 首先简单介绍一下对抗搜索 我们知道,两个人下棋,两个人 Read More
裴蜀定理: 内容:若$gcd(a,b)=d$,则一定存在$m,n\in Z$,使$ma+nb=d$且$d$为$ma+nb$的最小正值(狭义) 证明: 令$d=gcd(a,b)$,则对任意$m,n\in Z$,有$d|am+bn$ 设$am+bn$的最小正值为$s$,则令$q=[\frac{a}{s} Read More
本来早就打算写退役记了,没想到苟到了今天,也是不易了 (可能游记会咕,还是写退役记吧qwq) 也是,作为一个菜的一批高二选手,NOI=退役 在这科竞赛里,我见识到了极限的智慧 我见过了初二玩转高数的神,见过了学了六年的魔,看到了南方一个省全是集训队的高手,而你我,都只是普通人罢了。 我看到了我看不懂 Read More
1.最小生成树: kruscal: 2.最短路: spfa(最好不要写,他死了)... dijisktra(这个比较好) 3.LCA 倍增版本: 树剖版本: 4.tarjan 有向图tarjan缩点+spfa最长路 无向图割边: 无向图割点: 5.网络流 最大流: 费用流: 有源汇上下界最大流 有源 Read More
LCT神题... 首先暴力的做法就是每次在一个区间上link,然后暴力查询,时间复杂度$O(爆炸)$ 但是我们可以发现的是,每棵树之间互不影响! 因此我们可以考虑离线之后分别统计每棵树 但是这样做其实并没有优化时空啊! 但是等等,我们在考虑一下:我们的操作都是区间操作,也就是说我们可以用一个类似差分 Read More
并查集水题 离散化之后直接并查集合并,在不等时判断两者是否在同一个集合內即可 注意排序 贴代码: Read More
线性基好题 首先,如果一条路径被经过了两次,那么这条路径上的权值等于没有(废话) 基于这一点,我们其实已经找到了解决问题的方法了! 首先,由于可以反复经过一条边,因此我们可以把一条合法的路径看成这样的结构: 从$1$到$n$有一条链,这条链上挂着一些环,答案是链的贡献异或环的贡献(因为从链到环的边一 Read More
有人说这题像游走... 关于游走的思想,他死了... 明明直接从期望dp的角度考虑更简单合理嘛 首先由于是异或运算不妨逐位考虑 对于每一位,设状态$f[i]$表示从第$i$个点到第$n$个点,这一位上是$1$的概率 那么我们按边权讨论转移: 若这条边边权为$1$:$f[i]+=\frac{1-f[t Read More
考虑转化问题:一个点相邻元素中有偶数个$1$等价于一个点与相邻元素异或和为$0$ 于是直接列出异或方程组求解即可 注意由于要求不允许出现全0矩阵,因此如果有自由元直接给成$1$ 贴代码: Read More
很好的一道题,对理解最小割有很大帮助 首先,不难发现本题与网络流24题中的某一道很类似,我们可以先跑一次dp求出每个节点的LIS,然后拆点,拆出的两点之间连流量为删除的代价的边,剩下的点之间按dp的转移连流量正无穷的边,最后跑最小割即为第一问答案 但是第二问有个问题:又引入了一个量要求最小割字典序最 Read More
这题并不是太难 首先题目我们将每个城市拆点,由源点向一端连容量为初始人数的边,由另一端向汇点连容量为最后人数的边,然后按照题目要求从一端向另一端连容量无穷大的边 这样跑出最大流之后我们只需比较这个流量与总人数是否相等就知道是否合法了 至于输出方案,一个点向另一个点的所有流量都会体现在反向边上,因此我 Read More
费用流好题 本题的建图很有意思 正常我们看到棋盘问题应该先对整个棋盘黑白染色构成一个二分图,然后再考虑建图的问题 但是本题题目中已经明确区分了不同的斜线,问题在于怎么保证一个"L"形 因此我们进一步分析:显然柱子应该放在有代价的位置,我们应该由这样的位置向上下左右连边,保证有两个就行 但是这样建图是 Read More
首先题意就是裸的最小割啦 然后考虑如何统计边数 这里有一个trick: 我们设定一个大于$m$的阈值,对于每条边的边权我们乘这个阈值+1后跑最小割,得到的答案除以阈值就是真正的最小割,取模阈值后就是最少割掉的边数 为什么? 我们考虑:设原来的最小割割掉的边权为$v_{1},v_{2}...v_{n} Read More
思想基本同bzoj 2594,但是多了一步 首先我们发现这时的边有两个属性了,因此我们考虑先去掉其中一者的限制 我们把所有边按$a$大小排序,然后从小到大加入维护的最小生成树 每次加边时都按照$b$的大小操作bzoj 2594,然后更新答案即可 如果始终不联通输出-1 Read More
很好的一道LCT题目 首先我们可以发现,题目要求的就是最小生成树上的一条树链的最长边的长度,因此我们实际只需动态维护最小生成树即可 然后我们考虑怎么动态维护最小生成树 不难发现,如果涉及在最小生成树上删边,那么这个操作将变得非常复杂,因为我们并不知道删边之后要把什么样的边补充回去才行 但是,如果我们 Read More
LCT好题 首先我们考虑实际询问的是什么: 从LCT的角度考虑,如果我们认为一开始树上每一条边都是虚边,把一次涂色看作一次access操作,那么询问的实际就是两个节点间的虚边数量+1和子树中的最大虚边数量! 这种问题显然树上容斥,如果设$dis_{i}$表示$i$到根节点需要经过多少虚边,那么答案显 Read More
LCT板子题... 看到题目中的操作很显然是从$i$向$i+k_{i}$连一条边,每次修改就是删除原来的边再加入一条新的边嘛 然后考虑查询:对于被弹飞的部分,我们统一新建一个节点$n+1$,把所有越过边界的部分指向这个节点即可 然后在查询的时候只需要拎出查询节点到$n+1$节点的树链,统计其大小即可 Read More
真·小清新... 其实本题正解是动态点分治,但是考虑到那个东西需要先大力推导一波再套上一个幻想乡战略游戏的搞法,所以还不如大力推导一波,然后无脑套上一个树剖+线段树写法... 首先我们考虑没有换根操作: 没有换根操作时,设每次修改的变化量为$\delta$,很显然每次修改时只会影响一条树链上的贡献, Read More
动态点分治好题 首先我们考虑一个暴力做法: 每次修改之后选一个点作为根搜索整棵树,然后换根dp即可 考虑每次换根时,移向的点的消耗会减少子树代价之和*边权,而其余部分代价会增加剩余代价*边权 这样每次换根都是$O(1)$的,总时间复杂度$O(nm)$,可以通过...20分! 贴代码: 然后我们考虑正 Read More
首先仍然是点对之间的问题,让我们考虑点分 由于带修改,所以考虑动态点分治 所谓动态点分治,就是在操作之前先模拟一遍点分治的过程构造出一棵新的树,我们称这棵树为点分树,由于这棵树树高是对数级别的,所以修改的时候可以在一条树链上暴力修改 然后考虑本题怎么维护: 首先我们考虑答案如何统计:在统计答案时,我 Read More
点分治好题 统计距离正常点分治统计即可,我们只需考虑何时达到最优 有两种情况: 第一:代价最大的询问两个端点在不同的两个子树中 因为这种情况下,无论根向那个子树移动都会等价地增加到达另一个端点的代价,因此此时总代价已经达到最小 第二:代价最大的询问有多组,且这些点不在同一棵子树中 同情况一,如果我们 Read More
太久没碰点分治的我看见这题已经失了智... 首先这种统计肯定要想一想点分,当然也有树形dp的做法,不过还是用点分吧... 我们每次找到一个根,然后统计以这个根为中心,模3为0,1,2的路径数量(这一点可以直接搜索),然后做个卷积统计一下即可 但是可能会出现重复的情况,重复来源于这种时候: 如图所示, Read More
首先我们考虑$n$的情况,显然以$n$为分界线可以将整个序列分成两部分,就像这样: 、 那么我们考虑:在这个东西前面才会有前缀最大的统计,在这个东西后面才会有后缀最大的统计 这样就剩下了$n-1$个元素,而我们需要把这$n-1$个元素分成$A+B-2$个集合,然后把每个集合的最大的一个放在一端,然后 Read More
题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}lcm(i,j)^{gcd(i,j)}$ 神仙题... 首先可能会想到一个转化,就是$lcm(i,j)=\frac{ij}{gcd(i,j)}$ 然后大力往下推式子,发现你推不下去了... 因为$d$在分母上!!! 然后我们考虑换一种 Read More
题意:求$\sum_{i=1}^{n}\sum_{j=1}^{n}d(ij)$ 首先推一发式子: $\sum_{i=1}^{n}\sum_{j=1}^{n}d(ij)$ 有一个结论:$d(nm)=\sum_{i|n}\sum_{j|m}[gcd(i,j)\equiv 1]$ 然后代入,得: $\su Read More
莫比乌斯反演 还是推式子: 设$f(n)=n^{k}$ 那就是上一道题了 推的过程如下: $\sum_{i=1}^{a}\sum_{j=1}^{b}f(gcd(i,j))$ $\sum_{i=1}^{a}\sum_{j=1}^{b}\sum_{d=1}^{min(a,b)}[gcd(i,j)\equ Read More
奇怪的莫比乌斯反演... 题意:定义$f(n)$表示将$n$质因数分解后质因子的最高幂次,求$\sum_{i=1}^{a}\sum_{j=1}^{b}f(gcd(i,j))$ 首先肯定是反演嘛... 推一发式子: $\sum_{i=1}^{a}\sum_{j=1}^{b}f(gcd(i,j))$ $ Read More
emmmm... 做这题之前强烈推荐先去写一下压位高精度加法,压十八位就行... 然后有一个东西叫序列自动机,其实就是一个指针,用$n*|字符集|$的时空找到每个字符的下一次出现位置 然后如果想找到两个字符串的所有公共子序列只需要在序列自动机上dfs即可 重点看代码: Read More