avatar
文章
170
标签
111
分类
5

首页
分类
友链
说说
Doraemon's Blog
搜索
首页
分类
友链
说说

Doraemon's Blog

Philosopher‘s Walk(大模拟+爆搜)
发表于2021-04-15|题目|DFS
ICPC训练赛-Philosopher‘s Walk题意 如图所示,给定这样的一个n阶图形,每次从左下角开始走,问走了m步后的位置坐标? 这个图是有规律可循的,定义f(i)是i阶图的样子,那么f(i+1)就是四个f(i)拼成的,上面两个和f(i)一样,左下角是f(i)顺时针旋转90度得到,右下角是f(i)逆时针旋转90度得到,因此可以定一个dfs函数返回的是坐标,不管这个图形是否旋转,我们只求这个图形没有旋转,也就是正着放时走m步的坐标,即使它旋转了,这个坐标也只不过是换了一个角度而已,我们是知道图形的尺寸的,那就可以根据这个尺寸来推出这个点的坐标 CODE123456789101112131415161718192021222324252627282930313233343536#include<bits/stdc++.h>using namespace std;typedef long long ll;typedef pair<int,int> pii;const int N=100010;int n,m; pii dfs(int x){ if( ...
主席树
发表于2021-04-10|算法|主席树
主席树(可持续化权值线段树) 可持续化系列的一种数据结构,可以保存修改的版本,本质上是一种可持续化权值线段树 区间第k小倘若不是区间,而是每次求所有值的第k小,一个权值线段树就搞定了,将所有数离散化一下,将数值作为插入位置建树,之后查询第k小时,如果左子树插入点数量大于k就在右子树上,否则就在左子树上,这样就能第k小的数在排好序的数组中排第几个了,每次修改花费logn时间,查询也花费logn时间 而如果现在变成了区间第k小,单纯的线段树就维护不了了,因为无法保存过去的信息,如果可以保存过去没有修改过的信息就好了,(每次修改都建一颗新树,空间炸不炸呀),其实容易想到修改一个点后,变动的点只是这个点的所有祖宗节点(包括父亲节点),只有logn个(n个点的树深度最多是logn),所以可以拉出来一条链来保存修改过的信息 如图,红色的链就是修改过的信息 主席树因为要保存版本信息,无法用2*id表示左孩子那种方式建树,要用朴素的lson和rson数组表示左右孩子 个人理解主席树本质就是前缀权值线段树,权值线段树保存的是每一个区间的值的个数,而主席树就是对每一个前缀都建了一棵树,只不过是优化了 ...
最大回文子串
发表于2021-04-09|算法|Manacher
马拉车算法(Manacher):::success 解决的问题: 以O(n)时间求出一个字符串的最长回文子串长度 ::: 算法流程如果求最大回文子串,暴力做法是从一个点开始,每次向左和右同时延伸一个单位,比较是否相同,但是这种方式比较难受的是如果字符串长度是偶数,那么可能对称中心不在字符上,而在两个字符之间,如果还想使用上面的方法就必须让指针在字符之间停留一下,所以考虑在每一个字符之间以及开头结尾(开头结尾添加是要让添加字符后的答案和未添加时的答案有一个对应关系)都添加相同的未出现的字符,这里用”#”表示,这样一来aba就变成了#a#b#a#,这样一来无论原串的长度为奇或偶转化后的字符串长度永远是奇数(2*l+1),这时会发现添加后的字符串找出来的最长回文子串长度永远等于原串的最长回文子串长度+1(无论原串长度为奇数或偶数),所以对改变后的字符串求解的答案-1就是答案。 引入Len数组表示一个字符向左或向右可延伸的最长回文长度,比如aba,那么Len[1]=2(ab) 当求Len[i]时Len[i_mirror]是已知的,又因为黑色区域都是回文的,所以Len[i]=min(Len[i ...
扩展KMP
发表于2021-04-07|算法|字符串
扩展KMP 解决的问题: 求解母串以i位置开始的后缀子串与模式串的最大公共前缀 时复: O(母串长度+模式串长度) 引入两个概念,extend[]数组表示以母串i位置开始的后缀子串与模式串的最大公共前缀,next[]数组表示模式串以i位置开始的后缀子串与模式串的最大公共前缀,一个是模式串与母串,一个是模式串与模式串 与KMP类似,都采用了利用之前已经得到的信息来优化当前的时间 大致过程记一个po表示起始位置,求解extend数组需要先求出next数组,而求解next数组的过程和求extend过程一致,只不过是把模式串当作母串 (1) 第一步,我们先对原串S1和模式串S2进行逐一匹配,直到发生不配对的情况。我们可以看到,S1[0]=S2[0],S1[1]=S2[1],S1[2]=S2[2],S1[3] ≠S2[3],此时匹配失败,第一步结束,我们得到S1[0,2]=S2[0,2],即extend[0]=3; (2) Extend[0]的计算如第一步所示,那么extend[1]的计算是否也要从原串S1的1位置,模式串的0位置开始进行逐一匹配呢?扩展KMP优化的便是这个过程。从exten ...
无题
发表于2021-04-04|算法|树链剖分
树链剖分 求解问题:在树上进行区间修改区间查询问题,求lca问题,维护路径信息 主要思想:将树上的点分割成一条一条的链,每一条链的第一个点是链头(父亲),利用dfs序按照链优先的思想加上序号,这样每一条链上面的序号都是连续的,就把树上的点映射到了一条数轴上 时复:找到父亲,重子节点,子树大小(dfs1)O(N),进行一次dfs序(dfs2 O(N)),每一条路径都能被分割成最多log2n条链,因此链头数量不超过log2n,每次求lca时复logn 重链剖分 dfn数组: 每一个点映射到链上的标号 rnk数组: 每一个标号对应点的编号 (rnk[dfn[x]]=x) dep数组: 每一个节点的深度 fa数组: 节点父亲 siz数组: 子树大小 son数组: 重孩子 top数组: 节点在链上链头的编号 以上7个数组是树链剖分的几个必要数组,根据题目不同会使用上面的某几个数组 定义: 重子节点是子树节点最多的那棵树的根节点,如果有多个随意取出一个即可 剩下的非重子节点的点都是轻子节点 从当前节点到重子节点的边是重边 从当前节点到轻子节点的边是轻边 若干条首尾相连的重边称为重链,所有落单 ...
P1131拯救大兵瑞恩
发表于2021-03-20|题目|图论
题目 题意从(1,1)出发走到(n,m),途中有墙有门有钥匙,问最短几步走到右下角。 思路利用状态压缩,用二进制位表示第几种钥匙是否持有,利用BFS爆搜,再开一个数组储存状态来记忆化剪枝 实现方法有很多种,可以利用邻接表建边,可以直接利用Next数组表示下一个位置,邻接表利用空间换取了时间,表示墙和门时如果不用邻接表,则需要用map
P175电路维修
发表于2021-03-19|题目|双端队列+BFS
题目 题意如图所示,旋转最少的电线使得左面的电源和发光器相连、 思路考虑把所有电线已经相连的点设为边权为0,没有连接的,比如电线是主对角线,副对角线上的两个点就应该设为边权为1,最后跑一个从左上角到右下角的最短路径,将每一个点映射到一维数组中。 dijstla当然可以做,但是双端队列更高,因为这个图中只有边权为0和1的点,可以把优先队列的log(n)省掉,当遇到边权为0的点时就把点直接添加到队头,遇到边权为1的点放到队尾,并且判断能否更新当前点离起点的距离。 CODE123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113#include <bits/stdc++.h>#de ...
P341最优贸易
发表于2021-03-18|题目|图论
题目 题意n个城市,从1到n点,有有向边,也有无向边,每个城市都有宝石价格,从一个点买一个宝石,再在后面走的点卖出,问最多赚多少钱? 思路对每一个路径求一个前缀最小值和后缀最大值,对每一个点后缀减去前缀取最大值即是答案,细节就是,求后缀可以反建图,开一个rhead数组 CODE1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162#include <bits/stdc++.h>#define ios ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);using namespace std;const int MAXN=500000;const int INF=0x3f3f3f3f;struct node{ int to,next;}e[MAXN];queue<int> q;int head[MAXN],val[MAXN], ...
P342道路与航线
发表于2021-03-18|题目|图论
题目 题意给定t个点,r条道路,p条航线,和一个起点,道路可互相到达,航线只能单向到达,且航线的权值可能为负数,问从起点到各个点的最小距离是多少?若不可到达输出“NO PATH” 思路把所有道路相连的点组成联通块,给他们编上号,从起点所在的联通块往后跑一个拓扑排序,连通块内跑dijstla,松弛时发现松驰的点和当前点不在一个连通块内,则把更新的点所在的联通块入度-1,大致思路是这样,但是还是有许多细节问题 为什么一开始要加入入度为0的点? 因为要保证拓扑序列的进行。假设s所在块编号为a,a连向块c,块b连向块c,且块a块b不相连。此时,如果你不加入入度为0的点,那么b块就不会访问到,c的入度也就不会减到0,也就不会访问到。 判断无解为什么不写出==inf? 因为有坑1的存在。还是上面那个例子,再加2个条件: 块d->块b,块a与块d不相连。 d到b的路为负边权 此时显然应该块b、d里所有的点都是NOPATH,而且dis都为inf。但其实在用块d内的点更新块b时,会松弛成功,因为存在负边权。所以无解时不一定dis就为inf 对每一个连通块跑最短路时,不知道那个点作 ...
P340通信线路
发表于2021-03-18|题目|图论
340. 通信线路分层图做法建k+1层图,相邻两层图之间权值为0,代表免费升级,在一层图里面跑就去找最大值,最后的答案就是第k+1层的dis[n]也就是dis[(k+1)*n],注意的是这样的做法只有在边数大于k时成立,当全部边都可以免费升级时,会出现问题,还没有跑到最后一层图就到达终点了,这时就会往回跑,导致边权增加,就会出错,所以需要把层与层之间的终点连接起来,使它们可以免费互相到达 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071#include <bits/stdc++.h>#define debug freopen("in.txt","r",stdin); freopen("out.txt","w",stdout)#define ios ios::sync_with_st ...
1…91011…17
avatar
Doraemon
记录成长经历
文章
170
标签
111
分类
5
Follow Me
公告
纵岁月在笔尖洇开深浅,初心始终是砚台上那方不涸的墨。
最新文章
word 公式批量转换
word 公式批量转换2026-01-17
内网穿透到底是个什么东西?
内网穿透到底是个什么东西?2026-01-16
从“用户信息”到“向量表示”:一篇把用户特征转 成 Embedding 的完整实战指南
从“用户信息”到“向量表示”:一篇把用户特征转 成 Embedding 的完整实战指南2026-01-12
2025 年度总结
2025 年度总结2025-12-23
强化学习入门
强化学习入门2025-11-08
最新评论
正在加载中...
分类
  • 技术9
  • 生活5
  • 算法89
  • 记录24
  • 题目36
标签
中断处理程序 双端队列+BFS 树链剖分 BIO div3 数据结构 三分 树状数组 线段树+欧拉函数 DFS bitset优化 流控 动态代理 ACM冷知识 矩阵快速幂 python 01字典树 dfs 单调栈 背包 竞赛 Manacher 期望 全排列 离散化差分 动态规划 异或题 启发式算法 可持续化并查集 STL 文件读写 雪花算法 targan 类的加载过程 数学问题记录 操作系统 miniob hexo NIO 事务隔离
归档
  • 一月 20263
  • 十二月 20251
  • 十一月 20251
  • 十月 20252
  • 九月 20255
  • 三月 20252
  • 二月 20255
  • 一月 20251
网站资讯
文章数目 :
170
已运行时间 :
本站总字数 :
272.8k
本站访客数 :
本站总访问量 :
最后更新时间 :
©2020 - 2026 By Doraemon
框架 Hexo|主题 Butterfly
Hi, welcome to my blog!
搜索
数据库加载中