![](https://img-blog.csdnimg.cn/20201014180756925.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
自学
文章平均质量分 55
r11111se
这个作者很懒,什么都没留下…
展开
-
Continuous Intervals(单调栈+线段树)
单调栈+线段树的好题原创 2022-11-15 20:22:00 · 128 阅读 · 1 评论 -
最长公共子串(SA和SAM求法)
后缀结构求最长公共子串原创 2022-09-26 21:44:31 · 1187 阅读 · 0 评论 -
Get The Treasury(HDU--3642) 线段树+扫描线问题
这道题唯一的一个难点应该就是如何去处理三维情况下的扫描线 这里其实我们可以这样想:先以Z轴为扫描线,然后我们单独考虑在此情况下的那个平面的样子,然后我们就可以将这个问题处理成了二维的面积相交问题。 但其实还是挺不好写的(主要还是我太菜了) 我们可以慢慢的理一下思路 首先我们可以想到这个线段树的pushdown操作其实是不需要的,因为每次查询的时候我们只需要知道根节点(整棵树)的情况即可,所以pushdown可以不用写了。 然后我们可以考虑一下题中给的数据范围,x和y的范围均为[-1e6,1e6],但是我们可原创 2022-04-27 17:27:59 · 112 阅读 · 0 评论 -
POJ - 3045(贪心)
这道题真是给我弄yue了。 本来是在一个二分比赛中看到了这道题,然后一直在想二分,想了好久也没能想出来该咋做,看了大佬的题解才知道了贪心去做更加地好 首先就是要按照w+s从大到小进行一个排序 先验证一下正确性 设 牛一 w1 s1 牛二 w2 s2 ,假设牛一上面所有牛的体重为sum,最优状态下牛一在牛二上面,可以得到 牛一的危险性a=sum-s1,牛二的危险性b=sum+w1-s2. 交换两牛位置后 牛一的危险性a’=sum+w2-s1,牛二的危险性b’=sum-s2. 可以得到sum(a,b)&l原创 2021-11-18 21:29:05 · 154 阅读 · 0 评论 -
动态规划————背包问题
用了两天的时间把讲解背包问题的视频看了一遍,加深了自己对dp的理解和认识。dp问题可以从两个方面入手,状态表示 状态计算 而背包问题的状态表示一般都是两维 dp[i][j]表示从前i个物品中选且总体积不超过j的最大值,而背包问题的状态计算也是大同小异。 01背包 01背包是最简单的背包问题,就是每件物品最多只能取一次,这样就可以得出01背包的状态转移方程 dp[i][j]=max(dp[i-1][j],dp[i-1][j-v[i]]+w[i]),这便是01背包最基础的解法 int slove1(){原创 2021-10-19 14:44:23 · 110 阅读 · 0 评论 -
kmp(匹配字符串)
学习了kmp算法,其实kmp算法最重要的就是对匹配值数组ne的理解, 其中ne[i],表示当前字符串以i结尾时,后最等于前缀的数量,举个例子。 设字符串s=abcdabc,字符串的下标从1开始, 当i=1时 字符串可以看成a,此时只有1个数,所以ne[1]=0; 当i=2时,字符串可以看成ab,此时前缀和后缀无相等的地方,所以ne[2]=0; 当i=3时,字符串可以看成abc,此时前缀和后缀无相等的地方,所以ne[3]=0; 当i=4时,字符串可以看成abcd,此时前缀和后缀无相等的地方,所以ne[4]原创 2021-07-17 10:01:44 · 59 阅读 · 0 评论 -
字典树(trie)
今天学习了字典树,现在发现经过慢慢的学习,理解算法的能力逐渐的加强,现在已经比之前理解算法更快了。 首先,字典树的作用就是提供一个类似前缀的东西,然后更利于之后查找某一个数 字典数的应用可以分为一下几个方面: 统计和排序大量的字符串【注意有比较多的公共前缀的这些字符串】, 求最大异或对 求最大异或和 文本词频统计 前缀匹配 字符串检索 如何建树 const int N = 2e5+5; int idx,cn原创 2021-07-15 21:21:41 · 180 阅读 · 0 评论 -
manacher(马拉车算法)
今天学长讲了讲马拉车算法,开始听的一脸懵,然后等结束了自己拿着草纸画了画,又看了看代码,开始逐渐明白马拉车算法的奥义 首先是将该字符串增加n+1个#,这样无论原字符串中元素个数是奇还是偶,最后的字符串中的元素都是奇数个 int n=strlen(a); int T=2; manacher[0]='$';//初始化边界防止越界 manacher[1]='#'; for(int i=0;i<n;i++){ manacher[T++]='#'; manacher[T++]=a原创 2021-07-14 21:06:10 · 192 阅读 · 0 评论 -
Codeforces Round #731 (Div. 3)(位运算)
传送门 初看这道题的时候没有什么思路,看了别人的题解后,才发现时增加的位运算关系不太懂 题目大意:给定你n个数(a1,a2…an),让你求出n个数(b1,b2…bn),使得序列(a1 ^ b1,a2 ^ b2…an ^ bn)符合题目要求的共同增长序列 在写这道题之前很有必要复习(学习)一下位运算 借鉴博客 &(按位与) 参加运算的两个二进制数,同时为1,才为1,否则为0。举例 3&5=1。 |(按位或) 参加运算的两个二进制数,一个为1就为1,否则为0。2 | 4=6 ^(按位异或)原创 2021-07-13 09:39:02 · 54 阅读 · 0 评论 -
差分及例题
今天看了acwing的一道题,用到了差分,而且本来自己就不怎么会差分,所以今天学习了一下 差分公式:s[i]=a[i]-a[i-1] (i从1开始); 差分复原公式: s[i]=s[i]+s[i-1]; 证明如下:原创 2021-07-12 19:26:56 · 484 阅读 · 0 评论 -
位运算与二进制
今天遇到了一道题,要将一个二进制的字符串转化为十进制的数,再转化呈二进制。 首先二进制转化为十进制的方法(比较笨的方方) for(int i=31;i>=0;i--){ if(a[i]=='1'){ sum+=pow(2,31-i); } }//数据最多为2的31次方 接着为二进制转化为十进制,这里用到了位运算的方法,比如将n转化为二进制 for(int i=31;i>=0;i--){ if(n>>i&1){ cout<<原创 2021-06-15 19:28:00 · 109 阅读 · 0 评论