自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 [索引]AOAPC I: Beginning Algorithm Contests (Rujia Liu)

AOAPC I: Beginning Algorithm Contests (Rujia Liu)

2014-08-14 08:38:14 1128

原创 (2015)北京区域赛总结+回忆录

从去年7月跟着学长们入坑,到今年11月去北京比赛,一年多的时间就这样转眼度过,现在坐在电脑面前码字时大脑却一片空白,不知道从何说起。想起去年暑假的时候,每天都是8点多到实验室晚上10点回宿舍,顿顿和学长们还有队友们吃外卖都快吃吐了,每天为了题目抓狂心塞(╯°Д°)╯ ┻━┻ ,但是真的感觉很充实很开心(表示真的不是抖m ╮(╯▽╰)╭),围观学长们打网络赛打区域赛,为GG学长他们西安赛区最后三

2015-11-20 00:37:22 1640 2

原创 lightoj 1285(凸包)

题意:有n个点,要求每个点都要是凸多边形的一个顶点,且边不交叉,每个点只有两条边和他相连,要求顺序输出凸多边形的形状也就是各个顶点的编号,不存在就输出Impossible。 题解:首先容易想到Impossible的情况只有n点共线时会出现,用凸包函数求出凸包后,如果少于3个点就是Impossible。特判后,再用一次凸包,这次求凸包要包括共线点,下凸包的点是答案数组的前半部分。然后把所有点(不是只

2015-11-07 20:38:55 768

原创 lightoj 1203(凸包)

题意:有n个点,问从哪个点用最小的角度可以看到其他所有的点,输出最小角度。 题解:把n个点求凸包,凸包内部的点角度都是360,所以结果就是凸包的最小内角。#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <cmath>using namespace std;const dou

2015-11-07 20:29:26 700

原创 poj 3335(半平面交)

题意:顺时针给出n个点的凸多边形,问凸多边形的内核。 题解:半平面交模板题,有点坑,用大白上的模板时,判断点是否在有向直线的左边,线上的也算。。#include <cstdio>#include <cstring>#include <cmath>#include <vector>#include <algorithm>using namespace std;const double e

2015-11-07 00:41:12 507

原创 hdu 5130(圆和凸多边形相交面积)

题意:有一个简单的多边形,也就是凸多边形,现在有两个点A和B,问凸多边形上的点P,P到B的距离不超过P到A的距离的K倍,满足条件的P的区域的面积是多少。 题解:可以想到式子PA * K >= PB,这道题关键点在于这个式子可以化简成圆的一般式,因为K < 1,那结果就是圆和凸多边形的相交面积。。。 圆的一般式:x^2 + y^2 + Dx + Ey + F = 0 圆的标准方程:(x - a)

2015-11-06 18:19:25 1080

原创 hdu 5536(trie + 贪心)

题意:有n个数字,选择三个下标不同的数字,其中两个求和,然后和第三个数字异或得到的最后结果是A,问A最大是多少。 题解:长春赛区的一题,据说可以三层for过掉,还是用字典树好好写一遍,首先枚举把n个数字按二进制码插入字典树,维护val[u]节点u是多少个数字的前缀,id[u]是节点u是数字id[u]的最后一个节点,然后枚举两个求和的点,把这两个点在字典树上用flag[u]标记起来,然后把sum =

2015-11-04 18:56:23 487

原创 hdu 4825(trie)

题意:给出n个数字,然后m次询问,每次询问给出一个数字k,问n个数字中哪个数字s和k异或得到的数字最大,输出数字s。 题解:n个数字建立字典树,从最高位开始贪心,如果s当前位是0,就往1走,反之亦然,走到最后输出对应值。#include <cstdio>#include <cstring>#include <algorithm>#define ll long longusing names

2015-11-04 14:14:51 436

原创 lightoj 1269(trie)

题意:给出长度为n的序列,问选出任意区间的所有数字的异或值,最大最小各是多少。 题解:字典树经典问题,把前i个串的异或值都插入到字典树里,然后如果要找最大值,就把所有前缀去贪心出最大值,每次找和自己不一样的节点走,如果要找最小值,也是把所有前缀拿去贪心出最小值,每次找和自己当前位一样的节点,找最后一个分叉点,但要刨除自己。#include <cstdio>#include <cstring>#

2015-11-04 11:40:16 590

原创 lightoj 1224(trie)

题意:有n个字符串,要求输出一个最大的值是公共前缀×其长度。 题解:把字符串都拿去建字典树,val[i]存节点i是多少个串的前缀,这个最大的值就是节点深度depth[u]×val[u]的最大值。这题好坑,数组开小了给的是wa。。。#include <cstdio>#include <cstring>#include <algorithm>#include <map>using namesp

2015-11-03 19:47:59 786

原创 lightoj 1114(trie)

题意:给出n个单词,其中首尾字母相同,中间字母任意排列的单词是同一个码,然后给出m个句子,每个句子含有若干个单词,问多少个不同的句子和这个句子有相同的编码。 题解:把每个单词除去首尾的部分按字典序排序,然后插入字典树,val[u]存节点出现次数,在每个单词的最后一个节点数量累加,然后把输入的句子中每个统计到的单词数量乘起来。#include <cstdio>#include <cstring>

2015-11-03 17:08:15 639

原创 lightoj 1258(manacher)

题意:给出一个字符串,现在可以在这个字符串的右边任意添加字符串使字符串成为回文串,问回文串最短长度。 题解:因为只能在右边添加字符,添加的越少越好,所以要找一个最靠近右端点的回文串,在manacher算法中,如果出现 i + f[i] >= len说明出现了这样的串(最坏情况就是最后一个字母,回文长度是1),计算这个串的回文长度temp,结果就是2 * len - temp。#include <c

2015-11-01 23:02:55 593

原创 lightoj 1428(后缀数组)

题意:给出字符串A和字符串B,问A的多少个不同子串内不含B。题解:这个是看题解的,多加了一个rmax数组,rmax[i]表示A串的第i个位置(从0开始)最多向后延伸多少个字符的子串可以不包含B,相当于给出A的每个后缀的右范围,rmax数组的确定可以先把A和B串用一个很大的字符间隔并连接,然后得到height[i],sa[i],rank[i],在按字典序排好的后缀串中,从rank[lenA+1] +

2015-11-01 10:44:09 364

原创 lightoj 1314(后缀数组)

题意:给出一个串,问长度为l到r的不同子串的个数。 题解:如果没有给出子串长度范围,个数就是len - sa[i] - height[i]的累加和,给出了左右范围其实也就是多了两个判断,判断len - sa[i]和r的较小值,height[i]和l - 1的较大值,来缩小范围。#include <cstdio>#include <cstring>#include <algorithm>#de

2015-11-01 10:32:28 455

原创 CodeForces 591C

题意:给出一个长度为n的01序列,然后这个序列的变换方式是首尾的数字不动,其他位置的数字,根据原序列的左右和自身位置的三个数字的中位数确定,这样一直变换下去,如果不能成为一个不变的序列输出-1,否则输出到不变序列的步数和最终不变的序列。 题解:思维题,想一想会发现不会出现-1的情况。那么只有一个序列中左右两边和自己不一样的位置上的数字会发生变化,那么分四种情况:1 0 1 0 1最终会变成1 1

2015-11-01 00:57:06 636

原创 hdu 3333(树状数组)

题意:给出长度为n的数字序列,然后有q次询问,每次给出l r问区间[l, r]不同数字的和。 题解:因为询问次数有100000,可以离线处理,把所有询问存起来按右边界从小到大排序,这样再处理每个询问,最开始从位置1开始,从当前位置到他的右区间内,如果当前数字未被访问过,就把这个数字加入,如果已经访问过,就把之前位置加过的数字减掉,从当前位置再加入,这样就能保证询问区间内每个数字只被加一次。#inc

2015-11-01 00:48:11 733

原创 hdu 4027(区间更新)

题意:有n个数字,q次询问,两种操作0 x y 把区间[x,y]全部开根号,1 x y 询问区间[x,y]数字和。 题解:q的范围到100000,题目中说数字最大2^63,所以一个数字最多开7次根就是1不再变化了,所以用一个线段树维护每个数字还能开多少次根号,区间维护最大值,如果某个区间的最大次数已经是0,就不用更新了。一直wa,然后发现有可能x > y,吐血。。。#include <cstdio

2015-10-30 20:30:52 417

原创 hdu 3954(区间更新)

题意:有n个人,每个人初始等级是1,初始经验值是0,一共有K个等级,给出到达每个等级需要的经验值,然后有q个操作,W l r e把第l个人到第r个人的经验值都加上其对应的等级×e,Q l r询问l到r人中经验值的最大值。 题解:刚开始用单点修改把每个人经验值改掉,毫无疑问的超时了,然后就想怎么把每个人获得不同的经验值在区间表示,苦逼的想不出来,然后看了题解。。。因为要维护区间最大经验值,所以就维护

2015-10-30 16:12:42 444

原创 hdu 5120(几何+容斥)

题意:给出两个相同的环的小半径r和大半径R,然后给出两个环的圆心坐标,问两个环的重叠面积。 题解:按圆心距与半径的关系分四种情况,容斥+求两圆重叠面积模板。#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <cmath>using namespace std;const do

2015-10-28 16:50:14 396

原创 SPOJ REPEATS(后缀数组)

题意:给出一个字符串,问重复次数最多的子串的重复次数。 题解:和之前做过的poj3693很像http://blog.csdn.net/hyczms/article/details/49294095,不过这道题直接输出次数。#include <cstdio>#include <cstring>#include <algorithm>#define F(x) ((x) / 3 + ((x) %

2015-10-26 21:32:38 413

原创 poj 3080(后缀数组)

题意:给出n个字符串,输出一个字典序最小的最长公共子串。 题解:把n个串连接起来,先求的后缀数组中height数组,然后二分长度x,根据height[i]判断是否存在一个长度为x的串出现在n个串。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 800;int

2015-10-26 19:22:38 767

原创 SPOJ DISUBSTR(后缀数组)

题意:给出了一个串s,问不相同的子串的个数。 题解:用求后缀数组的函数得到sa[i],height[i],按后缀字典序排好序,相邻的两个串可以得到的不同子串个数是len - sa[i] - height[i],这样把所有的相邻后缀串累加就得到所有不同子串个数。#include <cstdio>#include <cstring>#include <algorithm>#define F(x)

2015-10-26 19:19:16 405

原创 poj 3693(后缀数组)

题意:一个由小写字母组成的字符串,问这个字符串内重复次数最多的连续子串,多组解输出字典序最小的。 题解:这里算法合集之《后缀数组——处理字符串的有力工具》例8讲的很明白,先枚举重复子串的长度为L,以s[0],s[L],s[2 * L]…为起点,有两个相邻的长度为L的串重复出现,那么就可以用height求两个后缀的lcp,lcp / L + 1是次数,但不一定是最大次数,还要从首字符向前匹配到不能匹

2015-10-21 01:47:19 700

原创 poj 2406(后缀数组)

题意:给出一个串,是由它的一个子串重复k次得到的,问k最大是多少。 题解:从小到大枚举长度i,如果长度i的子串刚好是重复了len/i次,应该满足len % i == 0和rank[0] - rank[i] == 1 和height[rank[0]] == len-i这些条件的,直接判断就可以了,第一次用da倍增超时了(1000000的数据忘了。。。),换成dc3过了。#include <cstdi

2015-10-20 19:25:49 3066 4

原创 poj 2758(后缀数组)

题意:给出一个长度为n的字母组成的序列,然后有两种操作,Q a b 询问以第a个字符为开头的后缀字符串和以第b个字符为开头的后缀字符串的lcp(最长公共前缀)的长度,I a b 表示在第b个字符之前插入字符a。 注意询问时的位置a和b是对应初始串,而比对的后缀串是当前串。 题解:思路想到了,但实现不出来 %>_<%,如果不考虑I操作,先用后缀数组处理出sa和rank,然后得到height相邻名次

2015-10-18 21:34:14 1118

原创 poj 3294(后缀数组)

题意:给出n个字符串,求出现次数超过n/2次及以上的最长子串,如果有多组按字典序输出,没有输出?。 题解:多个字符串的处理方式是把所有串连接起来,用没有出现在串中且字典序最大的字符分割,然后二分出一个长度x去判断是否有长度不小于x的公共前缀出现了n/2次以上。需要注意为了判断两个公共前缀不在一个串中,要把每个串的起始位置记录到sum数组,然后连续的height[i]>=x情况下,如果sa[i]所在

2015-10-18 00:57:06 590

原创 poj 3261(后缀数组)

题意:给出一个长度为n的数字序列,问可重叠的最长重复子串出现至少K次的长度。 题解:二分出长度x,判断连续height[i] >= x的情况如果出现K-1次就可以判断这个长度是成立的。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 20005;int wa[N

2015-10-17 19:40:25 398

原创 poj 1743(后缀数组)

题意:给出一个数字序列,然后问这个序列的变化幅度的不重叠的最长重复子串。 题解:先把这个序列前后相差值计算出来,得到真正要找的最长重复子串的序列。方法是先用DA得到sa数组,然后算出height[i]:名次相邻的两个后缀串的最长公共前缀。用二分枚举最长重复子串的长度x,判断就是只要连续的heighti出现了大于等于x(重复长度)且相差超过x(不重叠),那么这个x就是有效的,二分出满足条件的最大值就

2015-10-17 16:46:03 471

原创 poj 2774(后缀数组)

题意:每次给出两个串,问两个串的最长公共子串的长度。 题解:后缀数组算法合集之《后缀数组——处理字符串的有力工具》这里讲解的很好,把两个串连接起来,然后求这个串的后缀数组,和对应的height[i]的最大值,但主要要满足sa[i]和sa[i-1]在不同的串中。#include <cstdio>#include <cstring>#include <algorithm>using namesp

2015-10-17 13:49:26 500

原创 hysbz 2243(树链剖分+区间合并)

题意:有一棵树,n个节点,n-1条边,每个点都有一个权值,现在有两种操作,Q a b,询问a到b路径上所有点组成的序列一共有几段,比如11223就是三段,C a b c把节点a到b路径上所有经过的点权值设为c。 题解:线段树的区间合并问题,用线段树维护每个区间的左端点值和右端点值还有区间内有几段。#include <cstdio>#include <cstring>#include <algo

2015-10-16 12:13:51 442

原创 poj 3237(树链剖分)

题意:有一棵树,n个点,n-1条边每条边有一个权值,有三种操作,query a b,询问a到b所有路径的最大权值,negate a b,把a到b所有路径权值设置为对应权值的相反数,change a b,把第a条边权值设为b。 题解:线段树维护最大值和最小值,negate a b的时候把对应区间最大最小值交换并取反,注意要用一个标记每个区间取反的次数,因为偶数次取反相当于不变。#include <c

2015-10-15 22:40:11 359

原创 HYSBZ 1036(树链剖分)

题意:有一棵树,有n个点,n - 1条边,给出每个节点的权值,有三种操作,qmax a b询问a到b所有点的最大权值,qsum a b询问a到b所有点权值和,change a b把节点a权值设为b。 题解:两颗线段树,维护最大值和区间和。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;co

2015-10-15 22:26:51 385

原创 SPOJ QTREE(树链剖分)

题意:有一棵树,n个点,n - 1条边,边有权值,两种操作,query a b,询问a到b所有路径中的最大值,change i a,把第i条边权值设置a。 题解:线段树维护最大值。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 10005;const int

2015-10-15 22:23:56 555

原创 poj 2763(树链剖分)

题意:有一个人在一棵树的某个节点s,然后给出了树的每条边都有一个权值,有两种操作,0 a 是问从节点s到a的路径权值和,然后a就成了s,1 a b把第a条边权值变为b。 题解:边权转点权的模板题。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 100005;s

2015-10-15 22:20:16 923

原创 fzu 2082(树链剖分)

题意:有一棵树,有n个节点,然后给出n-1条边的权值,然后有两种操作,1 a b 是要求把节点a到节点b路径上所有点的权值和输出,2 a b要求把边a的权值置为b。 题解:边权化点权,把每条边的权值都化为深度更大的点的点权,然后查询操作,当u和v的top成为一个点,再次查询是son[u]到v的权值和,因为u到v会多加一条边的权值。#include <cstdio>#include <cstrin

2015-10-13 23:07:40 496

原创 LightOj 1348(树链剖分)

题意:一棵树,有n个点,每个点都有一个权值,有两种操作,0 a b ,问从节点a到节点b路径上所有点权值和,1 a b,把节点a权值改为b。 题解:树链剖分水题。#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int N = 30005;struct Edge { i

2015-10-13 12:37:22 676

原创 hdu 3966(树链剖分)

题意:有一棵树,上面n个节点,每个节点都有一个权值,有三种操作,I a b c,把从节点a到节点b路径上所有点(包括a和b)权值都加c,D a b c,把从节点a到节点b路径上所有点权值都减c,Q a,问节点a的权值。 题解:树链剖分模板题,线段树维护区间和,用到单点查询,区间更新。#include <cstdio>#include <cstring>#include <algorithm>

2015-10-13 12:33:31 437

原创 zoj 3494(ac自动机+数位dp)

题意:从0到9都用4位的二进制数表示,叫做BCD码,给出n个模式串,是不能出现的串,给出整数A和整数B,A <= B,问从A到B所有数字化为化成BCD码,问多少个数字的BCD码中没有任何模式串。 题解:0 <= A <= B <= 2^200,位数有200位,可以用数位dp来处理,先用自动机把所有模式串都存到trie图中,然后预处理出bcd[i][j]表示节点i添加的数字是j将会跳到的节点,在数位

2015-10-11 22:16:57 562

原创 hdu 5489(最长上升子序列)

题意:给出长度为n的序列,删除连续长度为L的子序列后,问最长上升子序列的长度。 题解:因为串被分成了两段,用数组fe[i]表示以第i个数为起点的最长上升子序列的长度,fs[i]表示删除了i - L到i - 1的序列后,以第i个数为终点的最长上升子序列的长度,那么很明显res = max(res, fe[i] + fs[i] - 1)。#include <cstdio>#include <cstr

2015-10-10 15:20:17 584

原创 hdu 3247(ac自动机+状态压缩dp+最短路)

题意:有n个源文件也就是n个字符串(n<=10 长度<=1000),m种病毒也同样是m个字符串(m<=1000,总长度50000),现在要问最短的串包含所有源文件但不存在一个子串是病毒的长度,源文件的串可以重叠存在,所有字符串由01组成。 题解:好题,思路来自这里http://m.blog.csdn.net/blog/woshi250hua/8021283 问题可以转化为找出一个最短的串,包含所

2015-10-10 13:33:57 506

空空如也

空空如也

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

TA关注的人

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