09 2021 档案
摘要:好吧这题正解其实是高斯消元,但是dfs剪枝也能过。 题目链接:洛谷P1072虫食算 题目要素:dfs剪枝 题目分析: 很显然要枚举每一个字母代表的数是什么,注意一个字母可以代表0。 然后考虑如何剪枝:直接判断每一种情况在当前是否可以判断它不成立,以达到剪枝的效果。 我们考虑如何判断当前情况不成立:
阅读全文
摘要:算法要素:hash+贪心 题目分析: 题目要尽量分出更多的回文子串,因此把一个大的回文串分成多个回文串一定会使答案更优。 因此从字符串的两端向中间查找回文串,同时尽量使每一个回文串尽量的少。 当一个串不能被分成回文串时,作为单独的一个串加入答案。 判断是否是回文串只需要判断串是否相等,这个过程用ha
阅读全文
摘要:复盘: 保留字这东西是真的坑啊.... T1(ybtoj写博客):签到题,m遍求nxt数组+kmp,1h直接切掉 T2:维护并查集,其实可以用链表写,预计60,挂到30,写+debug用了2h 此时估分:100+60=160 T3:暴力不怎么会写,用了40min T4:暴力都写不出来,固输2,其实固
阅读全文
摘要:策略有一些奇怪的问题。 ✡复盘: 开始先看所有题,发现T1显然数学推导,T2并查集可拿部分分,T3同余+组合数学能拿部分分,优化不会,T4数据结构。 然后开始先推第一道,最开始的思路还好,后面越来越偏+心态炸裂+觉得纯 暴力可能完全没分,然后就弃了做其他题。 T4最开始想写差分的树状数组区间修改区间
阅读全文
摘要:题面: 题目分析: 考虑每一条边对于答案的贡献,根据树的性质,每一条边一定将整棵树分成了两个子树,而该边的贡献=子树1中叶节点数子树2中节点总数+子树2中叶节点数子树1中节点总数。 由于树有一个重要性质: 树的任意一个点都可以作为树的根 然后?没了。 哦不是,还有一个重要的点: 要注意乘法算式过程中
阅读全文
摘要:博弈论的分情况讨论: (1)奇数 (2)偶数 (3)质数 (4)2的n次方 (5)2 (6)其他根据规则而具有特殊性质的数
阅读全文
摘要:题目算法要素:Floyd 题目分析: 最开始我想当作差分约束处理,但是没调过,只有20tps。 这个题的正解思路很有意思,很容易发现点数最多只有100,边数最多只有10000,因此可以用floyd维护f[a][b]表示a是否大于b。 若f[a][b]=true,则a>b。 若f[b][a]=true
阅读全文
摘要:题面:洛谷传送门 题目算法要素:tarjan+树形dp 题目分析: 一、总体概括 可以发现一个环中的点必须同时被选择,因此很容易能想到要tarjan缩点。 缩点后形成一张DAG,由于题目的条件,d[i]=0表示一个软件没有另一个软件为前提,因此有一个超级源点0。可以考虑从0点开始,跑一遍树形dp(树
阅读全文
摘要:题面:洛谷传送门 ####题目的算法要素:线段树&返回值为结构体的线段树 ####题目分析: 线段树的单点赋值+区间查询(查询区间内和最大的一段序列)。 因为某一段区间内和最大的一段序列是从它的小区间中合并出来的,需要不断与其他区间比较,且小区间内的最大序列不一定是大区间内的最大序列的一部分。 因此
阅读全文
摘要:#全篇重点(奇怪的bug): ####tarjan缩点+topo排序求最长链的常见问题: (1)建新图的时候没有用缩点后生成的新点,而是用原来的点建图 (2)建新图的时候注意不要建重复的边,最好用并查集维护两个新点是否被连接过 ✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧✧
阅读全文
摘要:一道水题(鬼知道为什么入门级的题会划到绿题里) 不过还算有点意思,所以就诞生了这篇题解。 有意思的点是分子中的min被约分后变成了分母中的max,这一点真的很有意思。 ###题目算法要素:数论&期望问题 ###题面:洛谷的传送门 ###题目分析: 依次考虑每一道题的期望得分。 对于题目i,它的期望得
阅读全文
摘要:#####题目算法要素:组合数学&线性求逆元&线性求阶乘的逆元&Lucas定理 ###题面: ###Lucas定理内容:不会的走传送门去oiwiki ###分析: 由于这题n、m较大,因此直接硬算肯定会炸(阶乘都算不完)。 故使用Lucas定理加速。 为了减少计算量,先预处理出模mod下的阶乘、和阶
阅读全文
摘要:之前的板子太恶心了,数论题做多了就觉得非常难受,因此换了一个无论是代码难度还是理解难度都更低的写法。 ###线性同余方程: (1)形式:形如ax≡c(mod b)的方程. (2)解法:将原始转化为ax+by=c的二元一次不定方程,然后用exgcd求解 (3)解的存在情况: 《1》当gcd(a,b)|
阅读全文
摘要:一道特别水的线段树基础题。 不过发生了一些有意思的事情: 我最开始没算复杂度,就直接去想怎么对区间取模操作写懒标记和pushdown。 其实因为取模不会进行太多次,而且在中间可以特判结束向下递归,因此直接单点修改即可。 #include<bits/stdc++.h> using namespace
阅读全文
摘要:###题面 ###题目分析: 选择一个当前可选的数最小的位置,依次填入各个可能填入的数。 考虑怎么实现: 为了快速地得到每个位置可以选择的位置,可以将当前树所在的行、列、九宫格的填入状态压入一个二进制中储存。 ###Code #include<bits/stdc++.h> using namespa
阅读全文
摘要:###无聊的小笔记本 ###会持续更新~,有意思的小东西都会放在这里~ ###其实就是一些很小又怕自己忘记的小知识,以及一些奇怪的东西 ✡二进制的三种码 正数的补码原码和反码都一样。 在八位二进制数下,第一位0表示正,1表示负。 0有正0和负0之分。 原码:就是二进制正常表示一个数,不足八位在前面补
阅读全文
摘要:copy了一下大佬的高精博客,主要是为了能用着方便 大佬Last-Order的原博客 ##模板 高精度算法(High Accuracy Algorithm)是处理大数字的数学计算方法。 这里使用了压位高精。(既然写了高精就要让他做到最好!) 经极其不完全统计,压位高精取1e7进制时较快。 ###总模
阅读全文
摘要:###题面 ###题目分析 这题最大的特点就是细节很多,注意审题。 (1)如果被占用,则必须过600s(包括当前这一秒)才能恢复空的状态。 而如果这期间内存被查询了,则需要再过600s才能被再次使用。 (2)如果一个内存没有被占用,则查询不会将它变为占用的状态。 (3)发出占用一个内存的请求时,优先
阅读全文
摘要:一个很水的大根堆+贪心。 考虑将所有作业先按照截至日期升序排序,依次加入tot中,同时插入堆中,堆是在a意义下的大根堆。 若tot大于当前作业的截止日期,则取出之前以加入的作业中a最大的作业,进行加速,直到tot=当前作业的截止日期。 正确性很显然:如果不让截止日期小的作业尽量早地完成,则消耗很可能
阅读全文
摘要:T1:没怎么看懂题,最开始还以为是签到题,结果发现题看错了浪费了30min。 后来写了一个暴力+贪心,全挂了,也在意料之中,毕竟最后半个点临时写的。 T2:前20分直接dfs暴力生成所有序列,然后暴力查询逆序对数量。 前40分是O(n^2)的dp,转移式写对了但是dp[0][0]设成了0(应该设成1
阅读全文
摘要:七月思考过的问题,突然想起来了,就写出来 (才不是因为现在才发现自己写的树状数组里忘记说这个问题了呢!)(大雾)(好怪啊) (与其说是证明不如说是一个比较严谨且易懂的感性理解) (大概..还算是严谨吧?) 不会树状数组模板的走传送门:树状数组模板整理 前置设定:a[i]为原数列,c[i]为维护树状数
阅读全文
摘要:题目分析: 这道题的关键是找出隐含条件 很容易看出,原图是一颗以节点1为根的有根树。求得的祖孙关系会是一条包括所有点的树。于是就可以猜到使用最小生成树解决问题。 由于答案是输出每一个生物的直系祖先,而根据题意,点a的直系祖先一定是所有点中距离点a最近的点。(可以反证法证明) 而这个prim的过程就是
阅读全文
摘要:数据太大,因此肯定要离散化。 考虑把e1的判断先全部放在前面,然后再考虑e0的部分。这么做的正确性是显然的,假设问题成立,则顺序无影响,假设问题不成立,矛盾也不会因为顺序改变而消失。 其实也可以按照原顺序考虑。只不过需要加入一个vis数组,标记每一个值是否被加入过判断条件。 写法如下 for(int
阅读全文
摘要:#状压dp 将状态表示为一个或多个n进制数,通过数位的运算判断情况之间是否合法,从而完成状态的转移。 ###矩阵内状压dp一般模板 伪代码 将每一行的状态用一个二进制数表示 a{i}.s存储第i中合法情况的二进制数 f{i}{j}表示第i行状态为第j种状态时的答案(最大值or方案数) for(int
阅读全文
摘要:####题面 ###分析: (1)先考虑暴力:直接每次在数组上暴力修改,复杂度O(n^2)级,估计也就30分 (2)这题属于区间修改和区间查询,可以考虑线段树,初始值全赋成1,修改操作就是将{l,r}之间的数-1,每次查询{1,n}的区间和就是剩余的黑色点数。不过线段树复杂度不够优秀,而且常数巨大,
阅读全文
摘要:libreoj传送门 ###算法分析 仿照kruskal的过程,将生成树中的边按边权升序排序,将边两端点所属的点集合合并,将两个点集合中所有点向另一个点集合中连边,由于要维持最小生成树在完全图中的唯一性,则连边的边权需为e[i].w+1, 则产生的贡献为tot+=(e[i].w+1)*(cnt[e[
阅读全文
摘要:把查询离线会让复杂度变得非常优秀,因为每一条边只被查询一次。 #include<bits/stdc++.h> using namespace std; const int maxn=2e4+50,maxm=1e5+40; int fa[maxn]; long long cnt[maxn]; int
阅读全文
摘要:洛谷题面传送门 ###题目分析: 题面给出每一步可以走2^k步,k为任意正整数。这很明显是倍增。 而简单的最短路无法解决这个问题,因此考虑图上倍增dp。 设f[i][j][q](bool)表示是否存在一条从i到j长度为2^q的路径。 g[i][j]存储从i到j的最小步数和 考虑初始化, 对于每一个输
阅读全文
摘要:使用算法:kruskal构造最大生成树(森林)+倍增LCA 前置知识: kruskal模板 倍增求LCA 洛谷传送门 题意概述 一张n个点m条边的无向图,每条边边权为w,给出q个查询,查询x,y之间有无路径联通,若无路径,则输出-1,若有路径,则输出两点之间所有路径中,路径上边权最小值的最大值。 算
阅读全文
摘要:用到的各个数组的意义 anc[i][j]表示从点i向根节点走(2^j)步到达的点的编号 dep[i]表示点i的深度 dis[i]表示点i到根节点之间的距离(i到根节点的简单路径上边的权值之和) ###算法分析: (1)题目给出了一颗无根树,因此我们建双向边,并任意选一个点作为根节点(我选择1) (2
阅读全文
摘要:####一、 算法思路:和一维st表完全一致,都是倍增+dp ####二、与一维st表的区别: 维度不同,用矩阵合并 ####三、图像演示 ###预处理 大矩形由四种子矩阵合并而来 横向分割大矩阵 纵向分割大矩阵 ###查询 #总之就是由小矩阵合并到到大矩阵。 #include<bits/stdc+
阅读全文
摘要:算法基础:倍增+dp ##算法流程 (1)合并(预处理):把每一个大的区间分成两部分,求其最大值 (2)查询,求log(len),由一个从区间首端开始和一个由区间尾端开始的长度均为2^log(len)的两个区间中的最大值相互比较,求得最大值。 tips:f[i][j]代表以i为起点,长度为2^j的区
阅读全文
摘要:之前一直不想写的手写堆。 是大根堆模板,小根堆直接换一下转移的符号就行。 pile[maxn]是存储堆的数组,len是堆中元素的数量。 写法非常简单。 Code void put(int k) { pile[++len]=k; int pla=len; while(pla>1) { int fa=p
阅读全文
摘要:score=60+0+30+0=90 我是真没想到第二题会挂60分,最后一道剪枝把正解剪掉了,挂了20。 别人剪枝暴力过60,我剪枝直接剪正解。 只能说数据还是出得挺好的,没想到剪枝+打表都会挂。 T1 前60分直接O(n^2)暴力 #include<bits/stdc++.h> using nam
阅读全文
摘要:一、定义: ####独立集:在一个图中,找到一个集合包含的所有点相互之间都不存在连边 ####最大独立集:在所有独立集中包含元素个数最多的独立集 #二、处理问题的第一步:问题转化: 需要用最大团来求最大点独立集,因此先引入最大团的概念 最大团问题 、 tips:最大团和强连通分量有区别,最大团U要求
阅读全文
摘要:part1:比赛过程&结果回顾 一、比赛过程: 先读题,觉得第一题基本可做,也许能切,先放着不管。第二题不是很难,估计有一些奇怪的性质,至少能写个暴力,先过。第三题,在k维上求最大点权独立集,emmm估计是树形dp或者贪心,仔细一看,题面过于复杂,好多隐藏条件根本看不出来,没想出来怎么在多个图之间建
阅读全文
摘要:基础的差分约束 #拓展 #Code #include<bits/stdc++.h> using namespace std; const int maxn=5e3+5; int n,m,a,b,c,head[maxn],dis[maxn],ecnt=-1,cnt[maxn]; bool jud=1;
阅读全文
摘要:第一次写缩点是用vector存边,因此现在用链前存边再写一遍 传送门:P3387 【模板】缩点 题意分析 (1)很容易发现,由于每一个点可以被经过多次,那么同一个强连通分量中的每一个点都可以互相到达,因此可以看作一个点。 (2)缩点后,整张图一定变成了一个DAG 证明:反证即可,假设不是DAG,则有
阅读全文
摘要:一个n年前学的东西,发现还没写博客,就来上一篇 定义: 对一个有向无环图(Directed Acyclic Graph简称DAG)G进行拓扑排序,是将G中所有顶点排成一个线性序列,使得图中任意一对顶点u和v,若边<u,v>∈E(G),则u在线性序列中出现在v之前。通常,这样的线性序列称为满足拓扑次序
阅读全文

浙公网安备 33010602011771号