返回顶部

随笔分类 -  algorithm

摘要:splay #include <bits/stdc++.h> using namespace std; const int N = 5e6 + 10; int val[N], cnt[N], fa[N], ch[N][2], siz[N]; int tot, root; void maintain( 阅读全文
posted @ 2023-05-06 17:26 _Kolibri 阅读(24) 评论(0) 推荐(0)
摘要:有旋Treap模板 //pointer version #include <bits/stdc++.h> using namespace std; struct Node { Node *ch[2]; int val, rank; int rep_cnt; int siz; Node(int val 阅读全文
posted @ 2023-05-05 14:21 _Kolibri 阅读(32) 评论(0) 推荐(0)
摘要:题意:给你两个长度分别$n$和$m$的序列$a$和$b$,构造一个$n$x$m$的矩阵,每个单位的权值$w_{i,j}=a_i+b_j$,现在要选一个长宽至少为$x$x$y$的子矩阵,求所选矩阵的最大平均值. 题解:这题不难转化为在$a$中找长度最小为$x$的区间最大平均值和在$b$中找长度最小为$ 阅读全文
posted @ 2021-07-30 12:24 _Kolibri 阅读(58) 评论(0) 推荐(0)
摘要:题意:有一个$n$x$n$的矩阵,有$m$个单位有权值,其他单位均为空,给你两个数组$a$和$b$,$a[i]$表示第$i$行的最大元素,$b[i]$表示第$i$列的最大元素,你需要在这$m$个单位中填值,在满足$a$和$b$数组的条件下求矩阵最小$sum$. 题解:将最大值为$k$的$a[i]$和 阅读全文
posted @ 2021-07-27 17:11 _Kolibri 阅读(85) 评论(0) 推荐(0)
摘要:数列分块入门1-9 1. #6277. 数列分块入门 1 分析:分块基本操作,对于整块直接打上标记,询问的时候加上对应块的标记值即可. 代码: #include <bits/stdc++.h> #define ll long long #define fi first #define se seco 阅读全文
posted @ 2021-05-31 20:21 _Kolibri 阅读(80) 评论(0) 推荐(0)
摘要:题意:给你一组数,求LDS和最少需要多少块LDS 题解:第一问LDS随便写,关键是要怎么求出最少有多少个LDS,这里介绍一个dilworth定理:***对于任意有限偏序集,其最大反链中元素的数目必等于最小链划分中链的数目.***对偶一下,我们要求最小LDS的划分数目,那么也就是求LIS的元素数目. 阅读全文
posted @ 2021-04-08 23:53 _Kolibri 阅读(93) 评论(0) 推荐(0)
摘要:每次向下搜点,$dfn[i]$表示搜到第$i$点时的编号,$low[i]$表示第$i$个点能到达的最小的点的编号,我们在搜的时候可以把路径上的点存入到栈中,当$dfn[i]=low[i]$时,说明我们已经找完一个强连通子图了,此时就可以把栈中的元素出栈得到一个强连通子图. 代码: #include 阅读全文
posted @ 2021-03-31 11:20 _Kolibri 阅读(51) 评论(0) 推荐(0)
摘要:形如$ax\equiv c\ (mod\ b)$的方程叫为线性同余方程. 对于$ax\equiv c\ (mod\ b)$,我们可以得出$ax+by=c$,又根据裴蜀定理,$x,y$有整数解的充要条件为$gcd(a,b)|c$,即$c$一定是$gcd(a,b)$的倍数,我们可以根据$ax+by=gc 阅读全文
posted @ 2020-12-20 14:53 _Kolibri 阅读(601) 评论(5) 推荐(1)
摘要:在基础线段树的模板上做了优化,具体看eval函数和push_down. #include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pb push_back #define me m 阅读全文
posted @ 2020-12-07 16:00 _Kolibri 阅读(91) 评论(0) 推荐(0)
摘要:#include <bits/stdc++.h> #define ll long long #define fi first #define se second #define pb push_back #define me memset #define rep(a,b,c) for(int a=b 阅读全文
posted @ 2020-12-07 13:40 _Kolibri 阅读(95) 评论(0) 推荐(0)
摘要:题意:区间更新,区间询问. 题解;对于区间更新,我们还是用差分数组$b_i$来更新,区间询问时,我们的答案是:\(\sum_{i=l}^{r}\sum_{j=1}^{i}b_j\), 所以,我们搞两个树状数组维护$b_i$和$i*b_i$即可. 代码: #define int long long i 阅读全文
posted @ 2020-11-16 21:59 _Kolibri 阅读(99) 评论(0) 推荐(0)
摘要:题意:在二维坐标轴上给你一些点,求出所有由三个点构成的v和∧图案的个数. 题解:因为给出的点是按横坐标的顺序给出的,所以我们可以先遍历然后求出某个点左边比它高和低的点的个数(这个过程简直和用树状数组求逆序对的操作一模一样好不好!),用$grt[i]$记录第$i$个点左边比它大的数,$low[i]$表 阅读全文
posted @ 2020-11-16 21:45 _Kolibri 阅读(88) 评论(0) 推荐(0)
摘要:题意:有$n$个点和$m$条无向边,现在让你给你这$m$条边赋方向,但是要满足任意一条边的路径都不能大于$1$,问是否有满足条件的构造方向,如果有,输出一个二进制串,表示所给的边的方向. 题解:我们先单独拿出$3$个点来看,选择一个点,那么与它相连的另外两个点到自己的方向一定是相同的,同理,我们可以 阅读全文
posted @ 2020-11-13 09:41 _Kolibri 阅读(120) 评论(0) 推荐(0)
摘要:题意:你和朋友玩游戏,有个一$01$序列,你每次给出一个区间,朋友会回答这个区间中的$1$的个数是奇数还是偶数,但是你亲爱的朋友可能在撒谎,问在哪个询问你能确定你的朋友在撒谎,输出回合数. 题解:假如区间$[l,r]$所含的奇数个数为偶数的话,那么其前缀和$s_$和$s_r$所含的$1$的个数一定同 阅读全文
posted @ 2020-11-13 01:03 _Kolibri 阅读(116) 评论(0) 推荐(0)
摘要:题意:有$n$列,有$T$条指令,若指令格式为$M$,则将第$i$号的所有战舰移到第$j$号所在列的后面,若指令格式为$C$,询问$i$和$j$是否在同一列,如果在,问他们之间隔了多少战舰. 题解:带权并查集的模板题,$d$数组表示某个节点到祖先的距离,$s$数组表示集合的子节点个数,当进行合并时, 阅读全文
posted @ 2020-11-13 00:36 _Kolibri 阅读(86) 评论(0) 推荐(0)
摘要:之前求逆序对一直用的都是归并排序的方法,后来发现大家都是用树状数组来求解的,因为树状数组不仅写起来简单,还可以动态维护一些东西. 对于一个序列,我们正向遍历他的所有元素,然后每次把当前元素插入到树状数组中,即$c[a[i]]=1$,然后看区间$c[a[i]],max(a[i])]$中有多少个已经被插 阅读全文
posted @ 2020-11-06 09:52 _Kolibri 阅读(160) 评论(0) 推荐(0)
摘要:题意:有一个长度为$n$的数组,进行$m$次操作,每次读入一个值$t$,如果$t=1$,则将区间$[l,r]$的数字反转,若$t=2$,则查询下标为$i$的值. 题解:树状数组的板子题,但是考察到了位运算的知识,我们对区间进行反转的时候,只需要对树状数组$c[l]$ ^ 1,\(c[r+1]\) ^ 阅读全文
posted @ 2020-10-21 19:32 _Kolibri 阅读(124) 评论(0) 推荐(0)
摘要:题意:给你一组数,询问$q$次,问所给区间内的最大值和最小值的差. 题解:经典RMQ问题,用st表维护两个数组分别记录最大值和最小值然后直接查询输出就好了 代码: int n,q; int a[N]; int dp1[N][30],dp2[N][30]; int lg[N]; void lg_Ini 阅读全文
posted @ 2020-10-21 19:20 _Kolibri 阅读(104) 评论(0) 推荐(0)
摘要:题意:有$n$个点对,找到它们之间的最短距离. 题解:我们先对所有点对以$x$的大小进行排序,然后分治,每次左右二等分递归下去,当$l+1=r$的时候,我们计算一下距离直接返回给上一层,若$l==r$说明只有一个点,不能构成线段,返回$INF$,于是当前区间的左右两边的最短距离我们找到了,之后还有一 阅读全文
posted @ 2020-10-14 12:47 _Kolibri 阅读(185) 评论(0) 推荐(0)
摘要:在字符串的头部插入'$',在每个字符之间插入'#'. 用p数组记录以某点为中心的最长回文半径,会发现,最长回文子串长度$maxlenth=p[i]-1$. 那么如何去求p数组呢?我们遍历每个字符,记录回文串能延伸到的最右端的位置$mx$,之后我们再去判断. (1) mx>i: 1:i的右边界小于mx 阅读全文
posted @ 2020-07-31 13:57 _Kolibri 阅读(112) 评论(0) 推荐(0)