随笔分类 - 数据结构
1
摘要:可持久化线段树小记 首先你需要完成这两个模板:P3919 【模板】可持久化线段树 1(可持久化数组) P3834 【模板】可持久化线段树 2 T1 P1383 高级打字机 题意: 个询问, 种操作: 1.T x:在文章末尾打下一个小写字母 。 2.U x:撤销最后的
阅读全文
摘要:题目:I Hate It 一个基础的线段树模板,单点修改+区间查询 代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #define ls(x) x<<1 #define rs(x) x<
阅读全文
摘要:题目:[NOI2010] 超级钢琴 前求出美妙值的前缀和,然后倍增处理一下前缀和的最大值,然后对于一个左端点s,他能取到右端点的只有s+l到s+r,而他的最大贡献就是s+l 到s+r的最大子段和,因此可以直接维护,然后用个堆维护总和最大值,这道题就做完了。 代码: #include <cstdio>
阅读全文
摘要:题目[USACO17JAN]Promotion Counting P 从根节点dfs一遍,树状数组维护进入和出去时这个节点的贡献,一减就是答案 代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorith
阅读全文
摘要:题目:[USACO14FEB]Auto-complete S 字典树套路题,字典树优化剪枝,加个cnt标记即可 代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <ios
阅读全文
摘要:题目:[JLOI2013]删除物品 直接做显然比较复杂,这个题是说对顶栈,但是可以把两个栈拼在一起,记录一下栈顶的下标,然后这样这题就可以转化为线性上的操作查询了,用树状数组简单维护一下就ok了(某个数是否存在,单点修改+区间查询) 代码: #include <cstdio> #include <c
阅读全文
摘要:题目:[NOI Online #1 提高组] 冒泡排序 看到范围这么大,求逆序对,有修改,估计也只能树状数组了,考查冒泡排序性质,排第i次冒泡排序,总逆序对个数会减少i的逆序对个数,然后交换两个数,他们相对整个序列没有改变,也就是说,交换两个数,只可能是其中一个数逆序对个数+1或者-1,抓住这两点这
阅读全文
摘要:题目:lowbit求和 (没有找到哪个公开题库有这个题) 题意:求数组中任意一对数的异或和的lowbit的总和。 对于异或,二进制位中两个数相等则为0,反之为1,而且此题是要求lowbit,那我们利用这个,对于一个数字,他第i位二进制位k,则显然跟这个数字二进制前缀相同的数与这个数异或起来都是0,但
阅读全文
摘要:题目:[USACO 6.1.3] Cow XOR 没找到这题具体网址,这个题就是求最大异或区间(总长度尽量小,右端点尽量大) 嗯很显然一个[l,r]的异或和=s[r]s[l-1],那么现在有了优秀的n2做法 不难(很难)联想trie树,枚举1到n每次把1...i的异或和加入trie树中,然后跑一遍找
阅读全文
摘要:题目:[USACO12DEC]First! G 不太记得当时怎么想的了,但是显然,当一个字符串的前缀存在则他一定不是first,然后做法:对于每个字符串,把每个字符结尾跟他有相同前缀的单词的同元素建边,保证这个元素严格大于其他元素,然后判环,有环的话说明不能是first,反之则是。 代码: #inc
阅读全文
摘要:题目:[JSOI2009]电子字典 读完题后,暴力?确实,计算一下时间复杂度最坏情况下,20263*10000=1.5e8,卡一下常可以直接卡到7e7,最严格来说应该卡的过去,但是此题数据可以直接卡过。 代码: #include <cstdio> #include <cstdlib> #includ
阅读全文
摘要:题目:Mishka and Interesting sum 这题稍微分析就能发现实际这个题就是求区间异或和异或上区间不同数的异或和,因此直接转化为HH的项链。 代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <
阅读全文
摘要:题目:无聊的数列 区间增加等差序列,似乎不好维护,等差等差,那就差分呗,单点查询,更加肯定,直接差分,每次加了一个等差序列容易发现只需要对应的差分数组a[l]+=k,a[l+1]...a[r]+=d,a[r+1]-=(r-l)*d+k 查询输出a[1]+a[2]...a[p],然后用线段树维护一下,
阅读全文
摘要:题目:[SCOI2007]降雨量 这题比较坑,分几种情况,但是可以总起来说,分开写,两个月份都没出现,maybe,否则如果两个月份都大于[l+1,r-1]的最大值,如果两个月份差值=r-l输出,true,否则maybe,否则false 代码: #include <cstdio> #include <
阅读全文
摘要:题目:Secret Message 老师说的trie树入门题 对于每个密码,存入trie树,每个字符对应编号i,则sum[i],最后结尾的编号为j,cnt[j] 查询,每个字符对应编号为i,不存在直接返回ret,否则,ret+=cnt[i](某个密码是此查询的前缀),最后返回答案ret+sum[j]
阅读全文
摘要:题目:[JSOI2007]字符加密 很常见的做法,破环为链,然后以2n为总长再后缀排序,然后对于SA[i] < n 的,说明第i小后缀的编号是小于n的,也就是说,以i开头的编号是合法的,那么输出s[SA[i]+n-1]即可。 代码: #include <cstdio> #include <cstdl
阅读全文
摘要:题目:不同子串个数 这题需要利用后缀数组求出的height的性质,我们发现对于每个后缀,他的height后的所有子串就是算在答案里,因此答案只需要求出n-height[i]-sa[i]+1的和就可以了。 代码: #include <cstdio> #include <cstdlib> #includ
阅读全文
摘要:题目:Balanced lineup 题目说的很清楚了,没有修改,直接RMQ,模板题。 代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <cmath> const in
阅读全文
摘要:题目:字符串归类 发现字符串长度总数不大,因此把每个字符串有的字母分离,存放到桶中,再枚举合并即可,时间复杂度O(len) 赛时代码: #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> const
阅读全文
摘要:题目:后缀排序 什么是后缀数组?他主要包含两个数组:sa和rk。 其中sa[i]表示将字符串后缀排序后第i小的编号,rk[i]表示后缀i的排名。 显然sa[rk[i]]=i,rk[sa[i]]=i。 例如字符串aba,他的后缀aba,ba,a,排序后a,aab,ab,此时 | i | 1 | 2 |
阅读全文
1