自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

辣鸡葫芦娃

在巨人的脚趾上往肩膀那边爬

  • 博客(25)
  • 收藏
  • 关注

原创 ACM模板(个人代码集整理)(博客停止更新,内附github链接,会在github继续更新)

为方便区域赛打印pdf模板,所有代码已经搬家到了github中。目录:SAM(*)SA(*)PAM(*)树链剖分(*)01Trie(*)ACAM(*)KMP(*)LCA(*)主席树(*)点分治(*)kd-Tree(*)斜率优化DP最大流Dicnic(*)最小费用最大流(SPFA)(*)线段树(*)dfs靠谱找环靠谱找凸包(*)...

2017-09-27 15:06:02 4720 2

原创 HDU 5917:Ramsey定理

题意:给出一个n个点的图(最多50),定义合法的顶点集合为:至少存在一个子集(size>=3)且这个子集是一个团或者独立集。求合法集合的个数。题解:现场赛怕是群脸懵逼吧。。。有一个Ramsey定理,说的是,世界上任选6个人,必然存在至少三个人相互认识或者相互不认识。也就是说给一个大于等于6个点的图,他的最大团或者最大独立集必然大于等于3那么问题很显然了,6以及6以上的直接统计345

2017-09-30 00:25:24 452

原创 Codeforces 864F Round#436 F :有向图倍增

题意:给出一个有向图,没有重边和自环,每次询问s,t,k,求出s到t的字典序最小的道路上的第k个点。如果字典序最小的道路是无限长的,则认为道路不存在。如果字典序最小的道路无限长或者s到t的道路不存在,则输出-1.题解:倍增思路还比较好想,但是实现起来细节比较多。比如求s到t的道路,那么先dfs出所有可以到达t的节点。如果s不在其中,输出-1.然后先用给定的边把st数组初始化一下(用

2017-09-26 23:40:03 1512

原创 Codeforces 864C Round#436 C :果然还是模拟最难

题意:有一个小车,在[ 0 , a ]范围内做周期运动。运动轨迹是 0->a->0->a->0->a……,走一趟定义为0->a或者a->0。中间有个加油站,在p的位置。然后小车的油箱容量是b,走一单位的距离就消耗一单位的油。小车路过加油站可以选择不加油,也可以选择把油加满。请问要走k趟,最少需要加几次油。题解:模拟吧 模拟吧。。。。不说了。。。心塞了。。。atleft记录小车现在是不是

2017-09-26 00:27:46 334

原创 Codeforces 864D Round#436D :全排列乱搞

题意:给出一个序列,其中每个数字都在[ 1 , n ]范围内,现在可以进行若干操作:每次操作就是 选择一个数字,然后把他赋值成一个新数字,使得这个序列成为一个n的排列。首先求出最小操作次数,然后求出在操作次数最小的前提下,字典序最小的那个排列是什么。题解:我们先看最小操作次数:首先统计出有多少种数字出现过,然后答案就是n-种数。因为出现过的数字我们只保留一个,然后剩下的所有数字依次都赋

2017-09-26 00:14:41 410

原创 Codeforces 864E Round#436E :记录转移的DP

题意:题目说的不清不楚,艰难读题…………意思是:房子着火了,有一堆古董要抢救。每个股东有三个值:t(抢救这个古董的耗时),d(古董抢救完成的时间必须严格小于d这个古董才算被抢救成功,也就是d以及d之后的时刻,这个古董就给给了),p(抢救成功这个古董带来的价值)。n题解:就是一个傻逼DP,附带上路径记录,比赛的时候被C把心态搞崩了。完全没看到这个题。果然模拟是最难的。这个DP

2017-09-26 00:06:47 285

原创 HDU 4641 至少出现K次本质不同子串数:后缀自动机

题意:先给出一个串,然后有若干操作。操作1:在结尾续上一个新字符。操作2:查询至少出现了K次的,本质不同的子串个数。题解:SAM裸题,插入一个新的字符之后,就暴力在parent上转移++,但是也不能那么暴力,我们知道parent链上的num是单调增的,当遇到一个num>=k的点就不需要再继续走了,因为前边的肯定统计到答案里边了。Code:#includeusing

2017-09-22 00:19:37 1102

原创 HDU 4622 本质不同的子串个数:后缀自动机

题意:给出一个串,每次求一个子串[ l , r ]。问这个串中,本质不同的子串个数,多组询问,数据小。题解:记住SAM是ON的。所以直接对每个[ l , r ]建SAM,然后建完就出答案。时间足够用。模板题为什么要写博客呢。。。。因为复用自动机的话。。要清空呀。。。。Code:#includeusing namespace std;const int maxn

2017-09-21 23:41:56 2936

原创 SPOJ 7258 字典序第K小的子串:后缀自动机

题意:给出一个串,求出所有子串,去重,然后求字典序第K小的串,总共Q组询问。题解:对串创建SAM,然后,拓扑一下,算出每个状态,如果继续往后边走,能够生成多少种不同的字符串。然后每次查询的时候,就按照字典顺序来看,比如到达某个点S,先看'a'儿子能造出多少个字符,如果很少,那么我们下一个字符肯定不走‘a’,那么我们继续看'b',看一下'a'和‘b’共能造出多少个字符,如果多了,那就选‘

2017-09-21 20:50:54 1567

原创 SPOJ 1812 多模式LCS

题意: 给出多个串,求所有串的LCS。题解:对第一个串创建SAM,其他串在上边跑,然后吧每个点更新出,模式串和匹配串在这一点向前最长匹配长度,那么所有船匹配完成之后,每个点取min,就得到了所有串在这一点的公共部分有多长,然后所有点取max得到答案。注意:要更新处parent链上所有的点。考虑样例:acbbcacbc自动机为:

2017-09-21 15:22:45 404

原创 POJ 1509 后缀自动机

题意:给出一个圆圈,圆圈上顺时针有一些字符,现在要从某个字符前边断开,得到一个以这个字符开头的字符串,使得得到的字符串字典序最小。如果多解,输出最小的断点。题解:把字符串copy一次,放到原串后边,使得长度*2,然后放到SAM中,从Root开始按照字典序走贪心len步(如果不能走就提前break) 搞定。Code:#include#includeusing na

2017-09-19 22:49:41 361

原创 BZOJ 4516 后缀自动机

题意:统计本质不同的子串数量。题解:模板题,后缀自动机。在每一个节点处,统计一下他能代表多少个 以他为终点的串。然后动态创建SAM,同时每加一次都输出一次就行了。唯一的不同是,这个题是int,而不是传统的字符串,那么把nxt数组换成map,复杂度多一个log(sizeof[nxt]),实际上非常小。Code:#includeusing namespace std;

2017-09-19 20:54:00 447

原创 POJ 3261 二分+后缀数组

题意:求一个串的最长的出现不少于K次的子串长度。题解:后缀自动机可以统计一个子串出现多少次。如果这个子串出现不少于K次。那么h数组必定有连续的k-1个不少于K。嗯。。。再来一个二分答案。。。就这么玩就行了Code:#include#include#include#includeusing namespace std;#define rank rkcons

2017-09-15 23:27:58 227

原创 HDU3948:后缀数组+马拉车(本质不同回文子串统计)

题意:给出一个字符串,求其 本质不同的 回文子串的个数。如果有小伙伴WA了无数次,请尝试模拟一下aabaa这个串,答案应该是5。(本菜鸡就WA了一晚上)题解:回文子串可以考虑先来个O(n)的马拉车预处理,这样每个回文子串长度必然是计数,那么我们可以统计本质不同的(正中间的字符+右半边串)回文子串个数。然后可以考虑用后缀自动机统计答案。这道题的关键的关键在于去重的处理。去重要

2017-09-15 04:08:49 2115 1

原创 POJ 1743:后缀数组求 不重叠最长重复子串

题意:给出一个数列,每个数字在[ 1 , 88 ]之间,每个数字对应钢琴的一个按键。定义相同的旋律为:[ i , i+len-1 ]区间 和 [ j , j+len-1 ]区间对应位置每个字符,差值恒定相等,且这两个区间不想交。就是说第一个区间每个数字加上一个delta,会变成第二个区间。求最长的旋律长度,如果小于5,输出0.否则输出最长的相同旋律的长度。题解:考虑查分数列。两段旋律相

2017-09-13 23:21:18 422

原创 HDU 6194 string string string :后缀数组+单调队列 | 后缀自动机

题意:给出一个字符串,求出出现了恰好k次的子串的个数。题解:恰好k次 = 至少k次 - 至少k+1次。答案转化为求至少出现k次的子串个数统计。构造好后缀数组以及很重要的Height数组之后。用一个k-1的窗子去滑动。窗子里边放着k-1个Height值(Height[ i+1 ],Height[ i+2 ],……,Height[ i+k ]),这样k-1个值就联系了k个后缀(SA[ i ],SA

2017-09-13 02:25:08 528

原创 比较快也比较漂亮的树链剖分模板(BZOJ 1036:树剖+线段树 BZOJ 1103:树剖+树状数组)

1036:#include#define N 100005#define inf 1000000000using namespace std;int n,q,a[4*N];struct Edge{ int u,v,next;}G[N];int tot=0,head[N];int size[100005],wson[100005],fa[100005],d[100005]

2017-09-08 23:47:22 1307 1

原创 Codeforces 853B Round #433 Div2D& Div1B Jury Meeting:差分前缀和+模拟

题意:有n(题解:每个人可以先处理出一个极大可行区间,就是说我在[ dl , dr ]这段时间可以在首都呆着(保证有飞机接送),就是区间∪。然后所有人的区间取∩就是大家都在首都的最大可行区间了。如果有解,这个区间长度必须大于k。当获得了这个区间的时候,也就知道了所有的可行方案。假如一个方案是在start以及之前到达,在start+k+1以及之后离开。那么每个人显然应该选择[1 , st

2017-09-07 20:27:52 415

原创 Codeforces 853A Round#433 Div2C & Div1A Planning:优先队列或堆或排序

题意:有n(题解:本题有一个很好的性质:所有飞机的延误时间为定值。证明的话……只考虑[1 , n]和[ k , k+n ]没有交集的情况(另外一种情况比较复杂),这个时候每个飞机必须延误,单个飞机延误时间=ti-i(ti是新的起飞时间),于是总的延误时间是∑(ti-i)=∑ti-∑i=(k+ k+1 + k+2 +……+k+n)-(1+2+3+……+n) = kn。那么既然总延误时间为

2017-09-07 20:14:01 524

原创 codeforces 848B :计数

题意:给出一个坐标平面[ 0..w , 0..h ]在坐标平面的x轴和y轴,分布有一些点,其中x轴上的点运动方向是向上,初始横坐标范围是[1 .. w],y轴同理。同时每个点会有一个延迟t,前t单位的时间这个点是固定不动的,在t时刻启动,每个点的速率都是 1/单位时间。比如说某个点(p,0)延迟为t,[0 .. t ]时刻他的坐标都是(p,0),在K(>t)时刻坐标是(p,K-t)。当两个点在某时

2017-09-06 15:09:53 386

原创 codeforces 850B Round #432 Div2D & Div1B:数论+计数

题意:给出n(题解:又是一个计数的问题。显然,我们希望得到GCD!=1,那么我们只需要枚举每个质数,让他作为GCD算最小花费,然后取最优即可。一个显然的思路是,在1e6范围内进行素数筛,枚举素数,然后枚举每个数字,有两种方案:删掉(花费是x)、把他续了(花费是((ai+GCD-1)/GCD*GCD-ai)*y)。但是估计一下复杂度发现,复杂度是 素数个数*n的。但是1e6范围内有好

2017-09-05 17:59:58 636 2

原创 POJ 1741:点分治详解

题意:给出一个n(点分治:顾名思义,点分治就是对点进行分治,一般用于路经统计问题。对每个点而言,一条路径要么经过他,要么不经过他,这就是分,即分成路径经过此点和不经过此点。基本思想是:当经过某点的路径可以比较方便快速统计的情况下,通过对点进行分治,把树的规模不断变小。考虑这样做的好处:把树看作无根树,除了叶子结点外,去掉任意一个点,都可以把一棵树分裂成若干规模更小的树。然后

2017-09-04 13:33:03 1018

原创 POJ 3764:01字典树

题意:给出一棵树,每条边有一个权,求出树上一个路径,使得这个路径上所有边的抑或和最大。题解:以1为根,把每个点到根的抑或和算出来,全插到01字典树,然后再拿着每个点的值去查就行了。复杂度n*32*2。别忘了把根=0插进去。注意:POJ不给开O2,自己代码里开也没用,STL(vector)会被卡Code:#include#include#includeusing

2017-09-03 13:41:23 251

原创 HDU 6191 2017广西邀请赛Query on A Tree:可持久化01字典树(区间抑或最大值查询)

题意:给出一棵n(题解:基本上是个板子题吧。直接讲方法了。。直接上DFS序+可持久化01字典树就行了。可持久化01字典树可以用32步查得一个区间内某个数字和val抑或得到的最大答案,那么DFS序一下就可以把子树搞成区间。然后完美解决。可持久化01字典树:可以理解成在字典树的每个节点上弄了个前缀和一样的东西吧,重点在空间复用。每个字典树节点增加sum域,记录前边数字中有多少个数字走到

2017-09-02 23:48:25 1961

原创 HZAU 1206:01字典树求 抑或最大和

题意:给出n个数字(n题解:枚举区间右端点 r ,那么左端点 l 一定比 r 小,同时[ l , r ]的抑或和可以表示成 [ 1, r ]xor[ 1 , l-1 ],那么我们枚举一个 r,求出[ 1, r]的和,然后就是查询[1, 1 ][ 1, 2 ] [1 , 3 ]……[1, r-1]中和[1,r]抑或最大的那个值。这个可以通过01字典树完成,然后还要求字典序最小,字典树终点处记一个

2017-09-01 15:04:42 291

空空如也

空空如也

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

TA关注的人

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