- 博客(11)
- 收藏
- 关注
原创 Codeforces Round #790 div4补题(F,H)
F题感觉自己想的很麻烦,双指针+dp,结果最后还是多亏了wls;H一开始没看出来其实就是求逆序对= =,既然是逆序对方法就多了,注意这里的逆序对可以是一组相同的数i=a[j];这里我用了树状数组,分治(归并排序)也可以...
2022-06-30 19:28:25 117 1
原创 线段树的简单实现(引入lazy_tag)
线段树是一种基于分治思想的二叉树,每一个结点都对应一个区间,叶子节点的区间L=R,非叶子结点,左孩子区间为**[L,(L+R)/2],右孩子区间为[(L+R)/2+1,R].所以和树状数组相比,线段树能更好的维护一个区间= =这也是其优势所在那么对于每一个结点,我们可以维护什么信息呢?区间的最值,区间和等等,具体根据题目的要求来确定;以下代码和示例均维护区间最值(最大值);以下是一些常用的操作,代码块里均有实现方式图源@bilibili 算法训练营看到这可能就有疑问了,线段树的最大作用不是
2022-06-29 11:22:02 155
原创 树状数组简单实现
树状数组作用:优点:查询区间和以及前缀和时间复杂度为O(logn),点更新O(nlogn)缺点:不适合区间更新= =当然区间更新肯定要我们的线段树啦;下面图源@bilibili_算法训练营ok这里重点提一下如何确定区间长度不妨转化下思路,找k个0不妨找二进制表示下第一个1的位置;对每个i(i>=1),因为我们知道对于任意的i,其补码为-i,所以区间长度len=(-i)&i比如i=8,二进制为1000,其补码为1000,进行与操作得到1000,即十进制...
2022-06-24 23:07:50 198 1
原创 洛谷P3853 路标设置
第一次在洛谷上AC省选难度的题,不过虽然难度是省选,但难度真不算大,与上一题跳石头及其类似,难点主要还是在check函数。利用二分,不断缩小最大空旷指数。回到正题,check函数怎么构造呢?不难发现,如果此时目标空旷指数为mid,假设此时有两个相邻路标,离起点的距离分别为dis[i],dis[i-1],若dis[i]-dis[i-1]>mid,说明此时我们一定要在这两点间插入路标,这里用一个while循环统计路标个数即可;如果最后新增路标个数大于预估个数,返回false,否则返回true;#inc
2022-04-20 10:58:42 307
原创 紫书刷题记录 UVa1572 自组合
这道题真的卡了我好久,一直想错方向了,想用并查集判断连通,像欧拉回路那样= =也想到了拓扑排序,但一直不知道怎么建边。收集了一下dalao们的想法,终于有思路了:比如一个正方形是A+A-B+B-;那么从A+开始,有三种方式A-B+B-;如果走到A-,那么下个出口一定是A+,此时就进入另一个正方形内部了,重复执行即可,所以只需要标记一下该点是否走过即可判环;这里看喜好建图,邻接矩阵/表均可;tips:如果是邻接表千万别开内存池,会RE下面上代码:#include<bits/stdc++.h>
2022-03-03 21:57:19 244 1
原创 紫书刷题记录 UVa297 四分树
感觉紫书上这一部分内容基本都需要递归,也算帮自己初步掌握递归思路了吧!第一次独立完成本章的习题!本题题意很好理解,但是如果只看书的话最后求总黑方块个数的时候会有疑问,最好还是去看看原题。原题是给定了一共有1024个方块,树的层数不超过5。这里给出解题思路:按顺序依次建立两颗四叉树->合并树->根据层数求黑色方块总数量,代码很容易实现,就是递归的时候自己多走两遍会比较清晰。下面放出代码(均有注释):#include<bits/stdc++.h>using namespace s
2022-02-16 22:04:44 470
原创 紫书刷题记录 UVa12100 打印队列
看了很多题解用了优先队列,那我这里就用容器+队列。这道题的难点就在于位置的判断,因为优先级是会重复的,队列的位置是不如容器那样好索引的,所以很自然的想到建立一个打印任务的结构体,储存优先级和位置;但问题来了,我们知道队列是不支持随机访问元素的,只能访问头部,那么确定最高的优先级呢?很简单,用一个vector,入队的时候储存优先级,这个vector不需要和队列的位置对应,入队完成后按降序排列,此时vector的第一个元素就是优先级最高的。剩下的就很容易了,依次判断队首的优先级和最高优先级,如果队首优先级小
2022-01-29 00:07:28 963
原创 紫书刷题记录UVa10935 卡片游戏
蛮简单的模拟题,一开始想用递归,但看了下感觉不太好确定方程,再次读题发现就队列就能很好的模拟了,思路也很清晰:第一张卡片出队后第二张卡片插入到队尾;重复这个操作即可。这题PE了两三次,输入有点小坑,如果只有一张牌也要输出Discarded cards: 而且貌似每一行的最后一个输出后面不带空格= = 上代码:#include<iostream>#include<queue>#include<algorithm>using namespace std;int ma
2022-01-27 10:18:37 2606
原创 紫书刷题记录 UVa1593 代码对齐
不太喜欢这种题,可能是有点怕字符串吧!这题的难点主要在思路的转变,题目要求左对齐且尽量靠左,所以确定每一列的间隔就很重要了。可以把每一列的单词长度最大的那个挑出来作为间隔 比如第一列单词长度最大的abcde那么就以6作为分隔(为什么不是5?因为单词之前至少要空一格)所以该列就以6作为分隔符,其他的以此类推,直接上代码:#include<iostream>#include<string>#include<sstream>#include<map>#i
2022-01-26 20:37:23 528
原创 紫书刷题记录:UVa1594,Ducci序列;
本题难度不大,思路也很清晰:元组大小不确定,设置为vector;建立一个集合,集合里每一个元素就是一个元组,每次计算完元组后先判断LOOPor ZERO,如果成立直接退出,否则插入新元组#include<iostream>#include<vector>#include<cmath>#include<algorithm>#include<set>using namespace std;int main(){ int t;
2022-01-26 20:22:27 607
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人