算法学习
文章平均质量分 59
twyc
这个作者很懒,什么都没留下…
展开
-
KMP学习笔记
原理失配的时候直接移动模式串到失配的位置(即已经匹配的长度)来加快速度,但是可能会漏掉已经匹配的这部分里前后缀相同的情况,所以需要计算部分匹配值pmPM=maxlen(前缀=后缀) 前缀不包括最后一个字符 后缀不包括第一个字符由上可知如果当前位置失配 移动的位数为已经匹配的位数-当前这一位的pm设当前位置为j 则位数即move=(j-1)-pm[j-1]令pm右移一位 得到next数组 ...原创 2021-09-05 16:13:35 · 233 阅读 · 0 评论 -
cpp和Java hash map的底层数据结构
做力扣lru的时候发现各种题目和题解都强调get和put的方法需要在O(1)时间复杂度下完成,这道题需要用map维护key到地址的映射是非常显然的事情说到map很容易想到红黑树,它查找的时间复杂度是logn,不是O(1)于是觉得是牛客上的题目描述有问题,转向官网官方题解,最后对时间复杂度的分析竟然还是1,很不能理解。看到其使用的是unordered_map,然后搜一下发现这玩意底层用的是哈希表,没有顺序,但是查询非常快。常用的map底层用的是红黑树,维护了有序性,但是建树、增删查改都更费时。于是很疑原创 2021-06-27 17:53:46 · 271 阅读 · 0 评论 -
翻转链表问题集合
基本思路是将头插法组织的链表重新进行一次头插 对尾插法组织的链表重新进行一次尾插为没有头结点的链表添加头结点以维护需要返回的位置是非常常用的技巧206 反转链表class Solution {public: ListNode *headSolve(ListNode *head) { ListNode *tHead = new ListNode(0); while (head) { ListNode *p = head->next;原创 2021-06-20 23:39:15 · 126 阅读 · 1 评论 -
数据结构复习-排序
内部排序排序期间,元素全部存放在内存中的排序。并非所有内部排序都要基于比较操作,基数排序不基于比较。关注时间复杂度、空间复杂度、稳定性插入排序直接插入排序 折半插入排序 希尔排序(缩小增量排序)取一个递减数组 从中取步长 将需要排序的数组按步长分为子数组 进行插入排序 达到基本有序的状态 某些步长数组的平均时间复杂度可以达到1.3次方交换排序冒泡排序 快速排序选择排序简单选择排序 堆排序注意建堆的两种方法,一个个插入的nlogn、满足完全二叉树后从根到底的perdo原创 2021-05-04 13:27:00 · 96 阅读 · 0 评论 -
单调队列
常用二元组<val,id>表示始终保持队首是区间内的最值 查询复杂度O1 入队复杂度均摊O1滑动窗口模板题线性dp中的典型应用在从队首取之前确保队首的id是在范围中的在窗口滑动的过程中确保id越合适 值越大/小的元素能适时让back的元素出队...原创 2020-04-07 00:52:47 · 137 阅读 · 0 评论 -
luogu P5018 对称二叉树
带权的二叉树里找一棵节点数最多的子树使得权值和结构都对称1e6这题最主要的点还是计算时间复杂度 刚看到的时候总是觉得每个点都要再往下找 那么这个复杂度显然是n方的 但是实际上是n+n/2+n/2+n/4+n/4+...+1 复杂度是严格的nlogn另外就是对树的递归的处理 我总是想在一个递归里做完所有的事情bool dfs(int x,int y){ if(x...原创 2020-03-06 12:14:56 · 110 阅读 · 0 评论 -
LeetCode 837 概率dp
昨天pdd的笔试题 最后不想做了想清楚了自己的代码只满足了只走一步的情况就没做了 今天补一下题意:输入m a r 该开始在0 每次随机走1~r步 如果当前小于a就继续走 求最后位置小于等于m的概率/** 昨天的代码1 没有考虑到到了a之后就不能再往后走了*/#include <bits/stdc++.h>using namespace std;const i...原创 2020-01-05 09:27:44 · 297 阅读 · 0 评论 -
PAT 常考题 cpp kit
考前最后一波看题仔细参数的含义不要弄错一定时间内找不到错误并且确定算法没有问题可以考虑重写优先队列//升序队列priority_queue <int,vector<int>,greater<int> > q;//降序队列priority_queue <int,vector<int>,less<int> >q;...原创 2019-09-07 20:34:48 · 163 阅读 · 0 评论 -
PAT 1129 Recommendation System STL的使用
题意:逐步观察 输出当前出现次数最多的k个数字 按出现次数大小排序 次数相同 序号小的大1. 码力倒退的太严重了 没有想明白用Node怎么建立索引 搜题解才知道不用建立结构体数组 直接把一个值作为索引 另外一个值放在数组外面然后放到容器中查询即可2. 刚开始总想着用数组 但是sort自然不可能 手写插入排序在顺序表中也不方便维护 写链表更是石乐志 后来想用优先队列 但是优先队列取出元素的操...原创 2019-09-05 14:30:05 · 160 阅读 · 0 评论 -
PAT 1145 Hashing - Average Search Time (25 分)
首先要认识Quadratic这个单词其次要知道下面这张ppt 但是这张ppt里面的q的范围是有条件的 要满足4k+3的形式 第二个测试点的n为2 就会卡掉一分这题搜了题解还调了100+min真难#include <bits/stdc++.h>using namespace std;const int N=1e5;bool isPrime(int x){ ...原创 2019-08-16 20:15:28 · 138 阅读 · 0 评论 -
Asia Yokohama Regional Contest 2018 ABCG
第三周多校一题三小时滚蛋去吃KFC太惨了 起手我看的第一个就是这场区域赛过的最少的H四色定理 然后右下角看了将近10min 倒是想到了拓扑排序 不过右下角的度一定小于等于4的性质没看出来 也根本不会写拓扑排序然后第二个看的就是F计算几何 倒是可以一眼看出最长的线就是旋转卡壳的思想 但是最短的线看完题解还是觉得有点神奇。。现场一小时才出A还wa了一发 回来自己再做又在一个小地方考虑不完善...原创 2019-03-26 22:49:45 · 836 阅读 · 1 评论 -
hdu6325 Problem G. Interstellar Travel
题意:定义一个平面 很多点 两点之间的权值为原点为起点的向量做叉积的值 可以为负 求权值最小的从起点到终点的路线 看到题目就日了狗了 这题明显能做的 但是训练的时候看到没什么人做 最后也只有87个人过所以之后也没补。。 Andrew扫个上凸包 注意一下判重的细节即可(数组开小了g++返回tle找了1个小时又是另外一个日了狗的故事了)#include <algorit...原创 2018-10-08 13:45:24 · 273 阅读 · 0 评论 -
区间问题笔记
成段修改RMQ 成段修改RMQ注意update里面val和lazy都要加 因为val一定会变 然后我们在这里没有pushdown所以儿子们还没有处理#include <cstdio>#include <algorithm>#include <climits>using namespace std;const int N=1e5+20;in...原创 2018-10-07 20:26:15 · 308 阅读 · 0 评论 -
线段树加乘操作 求区间和和平方和
搞了整整一晚上加一下午 应该是懂了加乘区间和别人的题解清晰易懂:这里 平方和题目链接 在线段树中除了标记和区间和的值我们再保存一个区间平方和的值 然后推得对平方和进行修改的表达式 注意:1.复制上一行粘贴到下一行的时候一定要注意是不是所有东西都改了 lson和rson的长度不一样 找了很久2.传参的时候要清楚要传的到底是什么pushdown(1,l,r)找了...原创 2018-10-07 17:05:36 · 1292 阅读 · 0 评论 -
csu2173 Use FFT
真的做出来了 还是有点伤心的#include <cstdio>#include <cstring>#include <algorithm>#define ll long longusing namespace std;const ll mode=1e9+7;const int N=1e6+10;ll a[N],b[N],sum[N];int...原创 2018-09-29 15:41:18 · 446 阅读 · 0 评论 -
csu 2165 时间旅行
大胆猜想不能大胆提交 明明可以考虑清楚所有情况不wa的再次 还好比赛的时候不是我做的#include <cstdio>using namespace std;int main(){ int h,c,ans; while(scanf("%d %d",&h,&c)!=EOF) { if(h<=c) ...原创 2018-09-29 14:26:31 · 290 阅读 · 0 评论 -
csu 2164 2018
还好比赛的时候不是我上知道规律了还wa了3发默认的初始化是真的不靠谱#include <bits/stdc++.h>#define ll long longusing namespace std;const int N=2010;const int mode=1e9+7;ll dp[N][N];int main(){ memset(dp,0,size...原创 2018-09-29 13:51:57 · 339 阅读 · 0 评论 -
ACM-ICPC 2018 沈阳赛区网络预赛 E The cake is a lie
知乎上有这个问题 比赛的时候实现了算法 调了整场啊... 知乎链接 按照这位大佬的代码 取大于的所有区间终于过了 这里然而我的把角度全部映射到-pi~pi的算法怎样也过不了 Node的排序方法也是玄学 不要优先+1反而ac 优先+1反而wa总之就是把下面代码的注释全部去了差不多就是我的错误代码了。。求好心的大佬帮忙看一下。。附上这个被改成长得跟别人差不多的ac代码。。。...原创 2018-09-10 09:32:19 · 215 阅读 · 0 评论 -
poj2528 Mayor's posters 线段树 离散化
题意:铺瓷砖 后面的覆盖前面的 求最后从上往下看到几种瓷砖discuss里的数据是符合题意的 但是数据有问题 离散化加点就错 不加才对离散化的时候是用map存hash值还是用二分去找是需要根据数据范围来考虑的#include <vector>#include <cstdio>#include <algorithm>#include <i...原创 2018-09-07 12:57:02 · 133 阅读 · 0 评论 -
zoj1610 Count the Colors 线段树 区间修改
注释很详细了代码基本上都是对着kuangbin的抄的#include <iostream>#include <cstring>///给出每一段的颜色 后面加入的覆盖前面的 求每种颜色有几个线段///区间更新每一段的值 那么线段树中储存的是每一段的值using namespace std;const int N=8010;inline int lson(...原创 2018-09-05 17:21:18 · 110 阅读 · 0 评论 -
poj 1984 Navigation Nightmare 并查集
题意 每次给两点之间的方向和距离 求每次询问的曼哈顿距离太久没做 想了很久觉得权值只能有正负两个值储存两个方向 其实用两个权值储存就好有两个权值 所以在合并的时候一定要记得两个权值都要处理#include <iostream>#include <algorithm>using namespace std;///一个权值不能确定哪边 所以存两个const...原创 2018-08-30 16:32:18 · 128 阅读 · 0 评论 -
hdu4370 Werewolf 并查集+dfs
题意:狼人可能说假话 村民一定说真话 求金水和铁狼的个数 因为狼人可能说假话 所以没有谁一定是村民枚举两个人之间的关系可知当a->b是狼 b->a是人时 b一定是狼由此 如果一个环上只有一条狼人边 其他都是村民边 则被指的狼一定是狼 并且环外还有人指狼是村民则也是狼 将村民边用并查集维护 将狼人边单独储存 然后每次判断狼人边的两端是否在一棵树内 如果在则可以确定...原创 2018-08-30 10:34:57 · 141 阅读 · 0 评论 -
圆的反演学习总结
引入反演定义反演中心为点P 任意值为反演半径R(有时需要考虑精度问题选取适当值)反演后的图形为反形则对平面上任意一点A都有反演点A' PA*PA'=R*R 对于点的反演hdu6097题目题意 圆内两点到圆心的距离相等 求圆上一点到这两个点的距离最小值直接求中垂线和圆的交点是不对的 以圆心作为反演中心 圆的半径作为反演半径 将两点进行反演 根据反演后图形的相似关系 将问题...原创 2018-08-24 10:25:14 · 2033 阅读 · 0 评论 -
bzoj3170 松鼠的聚会
求切比雪夫距离之和的最小值切比雪夫距离(i,j)=max(|xi-xj|,|yi-yj|)曼哈顿距离(i,j)=|xi-xj|+|yi-yj|把上面的x和y进行变元就变成了下面的形式显然曼哈顿距离有横纵坐标相互不影响的性质问题转换为分别对横纵坐标进行一次求距离和怎么求呢 掏出队友的解释 那么 由上面的解释结合其他题解可以发现其实用一个前缀维护扫两遍和前后缀...原创 2018-08-22 20:44:32 · 139 阅读 · 0 评论 -
2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it
题目 题意:n*m的格子 给q个圆 圆覆盖到的整点是黑的 其他点是白的 求白点个数数据范围是1 ≤ N, M ≤ 2 x 104; 1 ≤ q ≤ 200 所以暴力跑每个圆对每行的影响是可行的(瞄了眼题解真的觉得暴力出奇迹= =) 一直调不出样例 又去瞄了别人的代码= = 注意:1.输入的圆心其实是(y,x) 所以当我们枚举每一行的时候要用到横纵坐标的时候需要想...原创 2018-08-09 18:24:59 · 176 阅读 · 0 评论 -
ZOJ 3209 Treasure Map 跳舞链 精确覆盖
把大矩形的每个小格子都看成我们想要使其有1的一列 每块碎片都看作一行01串 之前在这里卡了很久 然后没理由的看到了kuangbin博客里的这句“把每个格子当成一个列,要覆盖所有格子。” 突然就懂了 套模板的时候还是要注意一下细节比如UDLR代表的是每一个元素的上下左右 那么最多有多少元素呢?之前一直觉得是n*m个 其实还是对算法不熟悉 看到罗老师的代码之后就突然想起来了n*m是列 t是...原创 2018-08-02 20:19:57 · 145 阅读 · 0 评论 -
hihoCoder #1317 : 搜索四·跳舞链 (精确覆盖)
题意就是题目描述了小Ho最近遇到一个难题,他需要破解一个棋局。棋局分成了n行,m列,每行有若干个棋子。小Ho需要从中选择若干行使得每一列有且恰好只有一个棋子。 跳舞链的入门题了 看的是这篇和这篇用的也基本上是别人的代码 别人的注释也很详细 但是代码的很多小细节都想了很久1.我们构造的是一个首位相接的十字链表 所以不用纠结col和H[row]到底是首元素还是尾元素2.不用...原创 2018-08-02 16:46:02 · 223 阅读 · 0 评论 -
poj1151 扫描线 矩形面积并
题意:n个矩形求面积并 扫描线算法很容易理解 画一下图就理解了 离散化也不难 一一映射就好 但是把线段放进线段树里维护就很难受了 今天又看了整整一天 并没有理解updata里面几个条件的意思= = 把kuangbin的从左到右扫改成了从下到上 假装自己已经会了= = #include <cstdio>#include <algorithm...原创 2018-07-31 19:14:47 · 273 阅读 · 0 评论 -
HDU 3465 Life is a Line 直线相交 逆序数
给个区间和n条不相同的直线 求区间里交点的个数 n<=50000 和区间左边交点的顺序映射到右边去就变成了求逆序数的个数 注意垂直情况以及排序的第二关键字 每次都忘记维护 然后就wa...#include <cstdio>#include <algorithm>#include <cmath>#include <cstri...原创 2018-07-26 17:45:40 · 244 阅读 · 0 评论 -
poj2074 Line of Sight 直线交点 区间合并
题意:求路上的最长连续能看到房子的长度 真的蠢 半天没想到下面这两张图 看了一眼题解被自己蠢哭 面向discuss编程漏算了起始区间 末尾区间 以及初始化问题 嗯 分别wa了一次 int main(){// freopen("in.txt","r",stdin); Line house,road; double x1,x2,y; ...原创 2018-07-25 10:25:09 · 262 阅读 · 0 评论 -
BZOJ 4260: Codechef REBXOR 字典树
题目 字典树可以用来找集合中两个数的异或值的最大值本题题意可以转换为求max(l[i]+r[i+1])///l[i]=a[l]^a[l+1]^...^a[r] 1<=l<=r<=i///r[i]=a[l]^a[l+1]^...^a[r] i<=l<=r<=N再设一个前缀异或和 利用异或的定义求出l[i] 后缀同理x[i]=a[...原创 2018-07-24 15:18:57 · 151 阅读 · 0 评论 -
luogu P1197 [JSOI2008]星球大战 并查集 逆向思维 邻接表
题目刚开始做的时候每一次摧毁都初始化一次 毫无悬念的tle 复杂度O(k*(n+m))后来瞄了一眼题解 把正向的摧毁改成反向的建立 结果还是tle 复杂度O(k*m)再仔细看题解才发现不能用father[i]==i来判读联通块的数量 应该要用邻接表把所有的边都存起来 然后再建立星球的时候先加答案 然后再扫一遍所有的边 看能不能把两个不同联通块连在一起 ...原创 2017-12-12 16:43:38 · 308 阅读 · 0 评论 -
对放苹果和数字划分的理解
这两个题是经典题 半年前弄懂了 最近又碰到又发现自己忘了公式了 f(m,n) = f(m,n-1)+f(m-n,n);m是苹果个数 n是盘子个数 f(m,n-1)的意思是至少空着一个盘子 那么就只要把m个苹果放进n-1个盘子里就可以了 当年的我还不理解为什么至少有一个盘子为空只要f(m,n-1)就可以了 总觉得要f(m,n-x) x从1到n-1 但是首先我们可以发现把根据上面的递归公式原创 2017-07-17 15:21:43 · 446 阅读 · 0 评论 -
OpenJudge - 8469:特殊密码锁
点击打开链接这道题困扰了我几天虽然并不懂贪心 但是早就想明白了如果第i个不一样就按第i+1个但是这样就会卡在011010110101010111111011111000010111000000001101001110这组数据上debug发现如果按我的上述算法那么最后一个数总是不能正常的(我还手工确认了。。)but百度此题发现大家除了说按法之外还都说了第一原创 2017-02-01 20:51:59 · 686 阅读 · 0 评论 -
对指针的理解
在看《啊哈算法》觉得自己好像懂了指针 本来想发到如何理解指针那个知乎问题上去的 但是看到珠玉在前 还是自high比较好。。指针有类型 所以有int *p double *p等等 *在这儿的作用是申明一个指针指针指向地址 所以有p=&aa是一个与前面申明的*p相同类型的东西 &是取地址符 就是把a的地址储存到p里 链表由一个个节点组成用结构体来描原创 2017-01-17 12:15:31 · 363 阅读 · 0 评论