自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(180)
  • 收藏
  • 关注

原创 【数据结构作业】堆排

写了个简短的堆排函数,不知道什么时候用的上,先放着。

2022-11-17 17:30:11 463 1

原创 【模板】单调栈

这里把单调栈封装成了struct,用起来比较方便。注意,根据不同的单调栈,init代码需要修改。

2022-11-03 19:47:28 225

原创 Educational Codeforces Round 95 (Rated for Div. 2) G. Three Occurrences(永久化懒标线段树 / hash)

永久化懒标线段树 / hash

2022-10-27 21:50:00 230

原创 CF1131D Gourmet choice(拓扑排序dp+并查集缩点)

1.dfs的dp只能处理树形dp,对于稍复杂的图,比如有环的,是必须用拓扑排序的。2.有等于号的时候咋办?并查集缩点!

2022-10-13 21:43:26 320

原创 CF452F Permutation(线段树维护字符串哈希hash值)

考虑在遍历序列中每个数的同时,动态维护一个数组a,a[x]=0表示当前x没出现过,a[x]=1表示当前x已经出现过了,每次修改后还要检查以x位置为中心,延伸到最长位置,这段a的子序列是否为回文串。比如,n=6,考虑当前加入4,令a[4]=1,并且检查a[2~6]是否为回文,

2022-10-11 21:15:32 177

原创 AtCoder Beginner Contest 257 G - Prefix Concatenation(KMP)

考虑dp,设f[i]表示至少要用f[i]个s前缀拼出t的前i个字符,容易发现dp值是单调不减的,所以有一种最优的策略:考虑拼出t的前i个字符时,最优的策略就是让本次选的前缀最长。

2022-10-11 15:20:10 220

原创 ABC141 E - Who Says a Pun? (三种解法,dp/SA/SAM)

三种解法,dp/SA/SAM

2022-10-10 12:49:25 243

原创 SA(后缀数组)板子

SA(后缀数组)板子

2022-10-09 20:13:54 311

原创 Splay平衡树板子

Splay平衡树板子

2022-10-08 17:50:40 124

原创 P2605 [ZJOI2010]基站选址(线段树优化dp经典题)

思路总结:线段树优化dp的基本套路是,把当前要计算的dp信息放在f数组中,把上一轮计算完的dp信息放在线段树里,通过线段树快速的区间加,区间查询操作推算出当前的dp值。

2022-09-30 23:53:44 754

原创 《数据结构与算法分析C++描述》课后习题3.28、3.30

是两个手写数据结构的题,所以想着记录一下,说不定以后哪天就用上了(可能不会)另外3.30的第三问怎么证明啊,有无会的大佬教一下,呜呜。

2022-09-25 08:42:30 162

原创 UVA11022 String Factoring(kmp+字符串周期+区间dp)

用f[i][j]用来表示[ i, j ]区间中合并之后的最小长度,那么显然f[1][n]就是答案。dp有两种转移方式:1.两个区间的答案合并:2.考虑[ i, j ]这个区间内部合并(可能是两个合并,也可能是3个、4个....相同的循环节合并)这部分稍微难一些,我们回想一下kmp里学过的,如果len%(len-ne[r])==0,那么len-ne[r]就是最小的循环节长度!

2022-09-20 14:58:50 187

原创 ac自动机上dp

dp数组一般都是f[i][j]的形式,表示递推到文本串的前i个字符,目前在自动机的j号点上转移形式是枚举当前遍历到前i个字符,当前在u号结点上,然后a~z的26种转移。

2022-09-19 17:54:57 254

原创 cdq分治处理二维数点问题板子

1.cdq分治的好处:不需要离散化2.二维数点可以封装成两个函数,add_point和add_query。其中addP是二维上的单点修改,addQ是二维上一个矩形区域的询问。

2022-09-18 21:24:08 291

原创 LIS的三种O(nlogn)解法

LIS的三种O(nlogn)解法

2022-09-17 22:16:54 262

原创 动态开点线段树板子

【代码】动态开点线段树板子。

2022-08-29 18:18:58 172

原创 fail树(失配树)

fail树是由KMP算法引申出来的概念,在解释fail树之前,首先要讲一个概念:Border。

2022-08-11 22:48:42 1399

原创 矩阵小专题(矩阵快速幂+矩阵加速)

矩阵小专题(矩阵快速幂+矩阵加速)

2022-08-09 17:47:38 306

原创 CF Lomsat gelral(启发式合并 dsu on tree)

这里要用到启发式合并,我对启发式合并的理解如下:本题要求“所有子树的信息”。 我们由树形dp的思想知道,一个结点的子树的信息是其所有儿子的子树信息+自己本身的信息。但是这里我们遇到一个问题,就是无法O(1)地把信息合并,假设每合并两个信息是O(n)的,它有m个儿子,那么完成该结点的信息合并就已经需要O(nm)了,这就不行。那么我们就考虑这样:让该结点继承它一个儿子的子树信息,然后暴力统计其他信息(包括自己的信息和其他儿子的子树信息),发现这样更快。那么我们选择哪个儿子进行继承呢?重儿子,因为重儿子暴

2022-07-23 18:59:02 241

原创 CF. Bits And Pieces(子集状压dp + 剪枝)

贪心地从高位到低位考虑,对于任意的i,如果a[i]的第x位是1,那就不用考虑;如果第x位是0,那就希望能找到a[j]和a[k]满足i

2022-07-21 23:10:38 93

原创 线段树合并板子

线段树合并常用于树上的问题,假如每个点有一个权值线段树存储信息,那么如果我们想知道一棵子树的总信息,就需要把子树中所有点的线段树都合并到子树根结点的那个线段树那里。怎么合成呢?假如是对于两个满的线段树,直接从底层开始(假设底层信息分别记录在a1[N]和a2[N]中)让a1[i] += a2[i],然后重新生成一棵树。这是最暴力的方法,复杂度是不ok的。但是实际上线段树往往是不满的,所以我们只要对线段树动态开点,就能实现更优的合并。最终复杂度是O(nlogn),证明略。...

2022-07-20 23:31:38 120

原创 树链剖分板子

树链剖分是什么?以我浅薄的理解,树是一种树型结构;而链式一种线型结构。对于线型结构,我们有一个大杀器:线段树。而显然,线段树没法直接用在树型结构上。于是我们就想到,能不能把树切成多条链,然后拼到一起,变成一个线型结构呢?我们把一棵树切若干刀,变成多条“重链”,再拼在一起,重新编号,塞进线段树。这就是树链剖分。...

2022-07-17 17:38:56 156

原创 可撤销并查集板子

可撤销并查集是支持“撤销连接”操作的并查集,但是这个撤销必须按栈的顺序。由于需要实现撤销,需要用栈记录所有已经完成过的连接操作。并且不能路径压缩。

2022-07-17 12:49:22 572

原创 主席树(可持续化线段树)板子

主席树是什么一般来说,主席树是n个权值线段树组合成的一棵杂树。其中n是数组大小,举个例子:数组 [2,3,1,4],由它构成的主席树就是[], [2], [2,3], [2,3,1], [2,3,1,4]对应的五棵权值线段树一起建出来的一棵杂树。下面讲几个重点问题:如何理解权值线段树:我的理解是,给一个桶建树,就是权值线段树。不过要注意这个”桶“常常需要离散化。 主席树如何实现省空间和省时间:主席树中,只有空数组对应的0号树是完整的,后面的树都是在前面树的基础上加一条链组成树,重复利用了之前的

2022-05-10 23:21:54 323

原创 Deltix Round, Summer 2021 E. Equilibrium

洛谷链接:Equilibrium - 洛谷解法:设一个新数组c满足c[i] = a[i]-b[i],再对c数组求前缀和,那么c[i]就是sum[i]的差分,那么我们的目标就是让[l, r]区间内所有c[i]都变成0,即sum[l-1] = sum[l] = .... = sum[r-1] = sum[r],根据题目要求,我们是让c[i]++, c[j]--,其中i<j,那么造成的效果就是sum[i] ~ sum[j-1]都+1,其他不变。容易发现,这种操作只能让sum增加,而不能减少,并且su

2022-04-20 23:44:15 109

原创 Deltix Round, Summer 2021 D. Take a Guess(二进制计算常用性质汇总)

洛谷链接:Take a Guess - 洛谷题意看洛谷翻译解法:需要用到一些二进制计算的性质,这些需要作为结论记住。a+b = (a|b) + (a&b) a+b = (a^b) + 2(a&b) a^b = (a|b) ^ (a&b)本题可以用第1,2个性质解,依次询问a[1]和任意的a[i]相或和相与的值,得到和,最后再询问a[2]和a[3]两次,得到他们的和,就可以知道所有数字的值。#include <bits/stdc++.h>#defi

2022-04-20 23:33:13 113

原创 2018-2019 ICPC Northwestern European Regional Programming Contest (NWERC 2018)记录

A. Access Points待更B. Brexit Negotiations待更C. Circuit Board Design题意:构造题,给定一棵所有边长度都是1的树。要求在一个二维平面把这棵树所有点坐标打印出来,使得所有点之间距离相差不超过1e-4,且所有边的距离不超过1e-6(可理解为边不相交)。解法:让一个点的所有儿子之间相差一个很小的角度,分层地构造即可。(用文字不好说明,还是看代码吧)#include <bits/stdc++.h>#define

2022-04-17 18:44:46 997

原创 Daimayuan Online Judge 三回文序列(巧妙的贪心)

题目链接:三回文序列 - 题目 - Daimayuan Online Judge视频题解:【算法camp】【每日一题】Namomo Spring Camp Div2 第44天题解(枚举,前缀和)dls讲题!!_哔哩哔哩_bilibili思路很巧妙的一题,考虑把数组分为三部分:左边,右边和中间。使得左边和右边部分的当前枚举数字个数相同,然后取中间其他数字的最大数量,但是要主要特判左右指针重合的情况。详见题解。#include <bits/stdc++.h>#define int l..

2022-04-14 10:10:35 206

原创 CF #737 (Div. 2) D. Ezzat and Grid(线段树加速dp)

做法:按照row编号从小到大进行dp,计算出当前行覆盖区域的最大连接数,以及连接的上一个row编号。由于是区间覆盖问题,可以用线段树来加速这一过程,注意用pair<int,int> mx[N<<3]来记录{连接数,上一row编号}。#include <bits/stdc++.h>#define debug cout<<"!!!"<<endl;#define FOR(i, a, b) for (int i = (a); i <= (b

2022-04-13 20:38:12 413

原创 离散化板子

一、用vector进行离散化,把a数组内的数离散之后重新存储。int a[] = {0,34,5,28,20,30,33,76,12};vector<int> v;int main(){ for(int i=1; i<=7; i++) v.push_back(a[i]); sort(v.begin(), v.end()); for(int i=1; i<=7; i++) a[i]=lower_bound(v.begin(), v.end(),a[i.

2022-04-13 12:47:31 303

原创 H. Treasure Hunt (最大费用可行流)

费用流问题,要用到最小费用可行流算法,求最大费用可行流。第一次学费用流,说下可行流和最大流的区别。在网络流中,随便一种流都叫做可行流,而总流量最大的流叫做最大流。不管是最大流还是可行流,都有可能有多种,他们对应的总费用可能不同。最小费用可行流就是随便一个流,求最小总费用;最小费用最大流,就是所有最大流中取最小总费用。而实际上,前者只需要在后者板子上改一行就可以了,所以板子几乎通用。回到本题,每到达一个点都能获得对应金币,那么我们可以把这个金币看成费用,指向该点的所有边的费用就是这个金币数(这里转

2022-04-12 09:15:11 421

原创 School of Software Engineering, SCUT, 2021 记录

题目链接:Dashboard - SCUT_SE 21-22下半学年第七周训练div.2 - Codeforces题解链接:文叔叔 - 传文件,找文叔叔(永不限速)C. Simple AniPop 类似洛谷【能量项链】那题,但是加了最后剩下的那个数字,所以稍微改改就可以。#include <bits/stdc++.h>using namespace std;#define FOR(i, a, b) for (int i = (a); i <= (b); i++)#.

2022-04-11 11:24:55 994

原创 SAM后缀自动机学习笔记(附板子)

struct SAM{ int size, last; //最大点编号,上一个点编号 vector<int> len, link; //maxlen,后缀链接 vector<vector<int>> to; //trans数组,记录加一个字符后的转移 // 字符串长度,字符集大小(一般是26或52) SAM(int strLen, int chSize) : size(1), last(1) { len.re.

2022-04-07 18:21:49 1073 1

原创 2019 ICPC Asia Taipei-Hsinchu Regional E.The League of Sequence Designers

题目链接:Dashboard - 2019-2020 ICPC Asia Taipei-Hsinchu Regional Contest - Codeforces思路:构造成0,0,0....0,0,-y,x这样的数列。这样做可以找出最短的数列。此时,WA = x, AC = (x-y)*len,其中WA和AC分别是错误答案,正确答案,len是数组长度。那么就有AC = WA+k,那么就有:,看右边那个,枚举所有满足x+k整除len的x,寻找对应的y(还要注意在范围内),代码如下:#in.

2022-04-03 20:04:27 453

原创 Codeforces Round #717 (Div. 2) D.Cut(倍增思想)

题目链接:Problem - D - Codeforces

2022-04-02 22:53:43 248

原创 Codeforces Round #735 (Div. 2) B. Cobb(巧妙的暴力优化)

题目链接:Problem - B - Codeforces思路:这题很容易把思路引到或运算的性质,但是正解和这没有太大关系。注意到k非常小!所以复杂度很可能和k有关。再看结果的计算式:根据 ,可以知道:,这就是本题解题关键!考虑i=n-1,j=n的时候,可以知道最终答案必定大于即所以,如果,即使取到并且的最优情况,答案也不会大于上述这个“可能的解”。所以i从n-2k开始遍历即可。这样就能直接暴力过,复杂度O(K^2)。#include <bits/stdc++.h>

2022-03-26 10:39:35 561

原创 Educational Codeforces Round 116 (Rated for Div. 2) C. Banknotes

题目链接:Problem - C - Codeforces思路:考虑贪心,面值从小到大遍历即可。(其中第1~n-1种面值的最大表示金额会受限制。而第n种不受限制,单独考虑)#include<bits/stdc++.h>using namespace std;#define int long long#define debug cout<<"!!!"<<endl;#define pii pair<int,int>#define FOR(i..

2022-03-24 21:10:16 163

原创 Codeforces Round #751(div2) D. Frog Traveler

题目链接:Problem - D - Codeforces思路参考:Codeforces Round #751 (Div. 2) - 知乎把青蛙的行为看成先下滑,再往上条,这样会更好处理。还有一些小细节没懂,先放着。#include<bits/stdc++.h>using namespace std;#define debug cout<<"!!!"<<endl;#define pii pair<int,int>#define ...

2022-03-24 16:09:57 392

原创 School of Software Engineering, SCUT, 2021记录(2020 ICPC)

cf链接:Dashboard - The 2020 ICPC Asia Taipei-Hsinchu Site Programming Contest - CodeforcesB. Make Numbers思路:考虑把连接也看成一种运算,那么就有+、-、*、连接 这四种运算,优先级是: 【连接】 > 【*】 > 【+、-】注意数字的顺序会影响运算结果,所以考虑用全排列+dfs,其...

2022-03-20 20:20:37 577

原创 Codeforces Round #770(div2)D. Binary Spiders(01trie,dp)

题目链接:Problem - D - Codeforces思路:挺难的一道题,是队友教了才会的。首先要知道一个很重要的结论:一个长度为n从小到大排列的子序列中,两两最小的异或值一定在n-1个相邻对中出现(证明略)。然后就不难想到O(N^2)的暴力dp,但是过不了,需要用01trie加速。思路如下图:代码:#include<bits/stdc++.h>using namespace std;#define debug cout<<"!!!"<&l..

2022-03-19 09:03:32 193

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除