自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

glq007的acm的奋斗

l just wanna go to final.

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

原创 2014-2015 ACM-ICPC, NEERC K Kebab House(dp)

题意:有n个时间块,每个pi时间块要煎至少xi次披萨,其余时间可以做梦,要求是每2次做梦间隔要大于等于(t+1),问合法情况总数。做法:我们可以发觉,每个块对于后面的块影响只有最后一个做梦的时间离最后的距离,所以我们用pre[i]表示最后一个做梦的时间离最后距离为i的情况总数。每个块可以单独算,令dp[i][j]为第i个位置做梦,且总做梦数为j次的情况总数,可以发觉dp[i][1]是由前一个块

2015-11-22 19:09:05 1007

原创 hdu 5330 Route Statistics(状压dp)

题意:给出n个长度做法:挺难想的一个状压dp。只要把跟每个串的距离为x的有多少个算出来就可以求出最后的答案了。考虑一下子问题,我们只考虑与后几位的距离为x的有多少个,但是这样没法递推,因为前面的不知道,所以我们可以把前面的补全,故就有了dp[s1][s2][k]代表一些串的前缀就是s1,与s1+s2这个串的距离差为k的个数。我们可以发觉|s1|+|s2| = m,所以我们可以把前2维变成1维。

2015-10-08 13:19:47 1572

原创 UVAlive 1808 Best Position(FFT)

题意:给出n×m的01矩阵,以及5次查询,给出h×w的矩阵,要求找出匹配原矩阵相同最多的位置,如果多个,上方的优先,还有多个左边的优先。做法:一开始是用bitset瞎搞,得优化一些地方才能卡过。事实上正解是FFT。对于原始矩阵设定第一个多项式的i*m+j的系数为s[i][j],第二个多项式的系数我们要反着设定,这样才能把对应匹配的每个位置可以乘到同一个次数,i*m+j的系数为c[h-i-1

2015-10-07 00:02:00 742

原创 BZOJ 1483 [HNOI2009]梦幻布丁(启发式合并)

题意中文。做法:由于是同种颜色的改变颜色,所以只会有合并,不会有拆分,我们可以利用启发式合并,要合并2堆,就把小的那堆暴力合并给大的那堆,可以发觉,一个布丁最多只会被合并logn次,因为每次暴力合并后大小都会至少乘2。我写法比较暴力,用了vector保存不同颜色的布丁,用map保存某种颜色对应哪个vector。AC代码:#pragma comment(linker, "/STACK

2015-10-04 12:09:41 691

原创 hdu 5456 Matches Puzzle Game(dp)

题意:给出n个火柴,要求拼出形如x-y=z的等式,x,y,z都为正数。问情况总数。做法:用一个数组a[i]代表用了i根火柴拼成数字情况总数,数组b[i]代表用了i根火柴拼成2个数字(相差1)的情况总数。然后dp[i][0]代表用了i根火柴不借位的情况数,dp[i][1]则代表借位,然后枚举前面放的新的数字是几然后分类讨论即可。做法比较搓,细节问题多思考量比较大。AC代码:#pr

2015-09-20 23:48:26 1138

原创 hdu 4784 Dinner Coming Soon(dp)

做法:由于时间不可逆,所以无后效性,直接4维状态,时间,第几个宇宙,第几维,有多少物品,的最大钱数。转移很显然。AC代码:#pragma comment(linker, "/STACK:102400000,102400000")#include#include#include#include#include#include#include#include#include

2015-09-17 22:42:55 559

原创 UVA 12929 - Aerial Tramway(dp)

题意:给出一些点(x,y)保证x递增,且相邻的y不相等。2个点相连的条件是有相等的y,且2点间别的点的y值都严格小于这2个点的y。给你m条边连,每个点之上连边的条数不超过k,求连边的长度最大值。做法:省赛第一题。当时陷入了k的深坑中并没有看这题。。。我们首先发觉每个可以连的区间都是不相交的,只有相邻和包含关系,所以是o(n)个(其实最多只有n/2个)。然后这段区间跟相邻的是没有关系的。跟这

2015-09-03 23:04:26 602

原创 CodeForces 573D Bear and Cavalry(线段树优化dp)

题意:给出n个战士和他们各自的n批马,我们可以把马换给别的战士,但是都得换(即战士不能拥有原来的马),我们要每个战士乘以给他换的那个马的和最大。q次询问,每次把2个战士的马交换,输出和最大的答案。做法:把战士根据值排序,我们可以证明每个战士一定不会给他分配排名与他相差超过2的马(可以枚举证明)。首先根据贪心我们可以发觉大的战士分配大的马一定是最好的,但是可能那个战士的排名与马的排名一样导致不能

2015-09-03 21:41:09 1347

原创 hdu 5367 digger(线段树)

题意:连续大小一样的数被称为山,必须在它的左边和右边都有比它矮的山时,它被称为高山,给出q个操作,操作是把区间都加上一个数,输出全部高山的总长度。做法:线段树,维护下这个区间是否是同一个值(same),是的话同一个大小是多少(val),如果不是同一个值,最左边值大小为多少(zv),右边值大小(yv),以及最左边为sv的连续长度(zsz),右边(ysz),以及最左边的值是不是“半个”山峰(右边值

2015-08-26 13:49:10 779

原创 CodeForces 571B Minimization(dp)

题意:给n,k,以及一个长度为n的序列,你可以打乱他们使得最小。做法:首先肯定按照大小顺序来排,连续的一段在一起肯定是更优的,我们可以发觉总共有k个互相之间无关的序列,我们需要把这个排完序后的序列划分成k个,k个中长度有的为x+1,有的为x,前者的个数为n-(n-1)/k*k,后者的个数为k-前者的个数。长度x为(n-1)/k。我们用dp[i][j]代表长度为x+1的已经分了i个,长度为x

2015-08-26 00:23:24 1088

原创 hdu 5420 Victor and Proposition(强连通+线段树建图)

题意:给出一棵树,每个点都给一个x,d,代表它和x这个点以及以下深度差小于d的点都有一条有向边,求互相可达的u,v对数。做法:可以很容易发觉如果我们把点连好然后直接找强连通分量,然后答案就是每个强连通分量大小x*(x-1)/2之和。但是因为点有10000个,边极限可以出到n^2个的。所以我们得简化边的个数。先处理出dfs序,保存一下每个点子树的dfs序范围,可以发现,x以及它之下深度小于d

2015-08-25 03:13:43 1241

原创 HOJ 13415 Website Tour(强连通缩点+多重背包dp)

题意:每个网站有个广告,看这个广告要花t的时间,能得p的分,最多只能看s次,然后给一些网站以及它所能到达的网站,从一个网站到另一个是不花时间的,但是不能停在同一个网站连续不停的看。现在有T的时间,起点任意,问最大得分。做法:由于都是有向边,所以我们可以把强连通分量缩点了,这其中的点都可以互相到达,再把这些缩后的点给拓扑排序,就是个DAG了,我们就可以dp了,在这个连通分量的点里面就是多重背包了

2015-08-24 19:44:23 549

原创 hdu 4742 Pinball Game 3D(cdq分治+树状数组)

题意:三维的LIS,顺序跟初始的没关系。跟之前多校那场二维LIS但是顺序是给定的几乎是一个题。只不过这题要算一个情况数。在按照一维排序后就可以直接利用cdq分治了,合并时用排序加树状数组去维护省下2维即可。AC代码:#pragma comment(linker, "/STACK:102400000,102400000")#include#include#include#in

2015-08-23 13:45:31 569

原创 hdu 3693 Math teacher's homework(数位dp)

题意:给出n个数,每个数字代表0到这个数字的范围,每个里面要选一个,求异或和为K的情况总数。做法:挺难想的一个dp,我们把这些数换成2进制组成一个表格,首先可以明确一点,只要有一位可以随便放的二进制数的位(因为前面有的位已经使得比原数小了)不随便放,那么其他数这个位的0或1随便放,都可以达到想要的答案。而每一个位只需要一个这样的位就可以达到效果了,所以我们就规定第一个能随便放的地方不随便放,这

2015-08-12 01:36:32 1526

原创 hdu 5267 pog loves szh IV(点分治+线段树)

好久之前写的题了。现在要重新开始写题解了。就从这题开始吧。题意:一棵树,两点之间的权值为路径上的值异或得到,求任意两点之间的权值和,有修改操作,每次都要输出任意两点间的权值和。做法:当时写这题写了好久。就说下一些关键的思路,因为细节部分真的是太多。首先不同的位独立考虑,然后任意两点我们肯定会想到点分治,点分治时会dfs求出子树里每个点到根节点的权值,然后进行配对求经过根节点的权值和。那

2015-08-07 01:40:27 694

原创 hdu 5238 Calculator(线段树+CRT)

题意:有加,乘,次方3种运算,初始值为x,给定运算式,2种操作,第一种:告诉你x的值,求答案模29393。第二种:更改某个位置的运算。做法:乍一看就像线段树,但是那个操作并不能简单的合并,所以我们得另寻他法。可以发觉29393并不是质数,29393 = 7×13×17×19.我们对其中因子做线段树,线段树只需要简单的算出对于每个小于质因子的数经过这个区间答案是几即可,最后利用中国剩余定理对

2015-06-11 17:40:22 882

原创 hdu 5266 pog loves szh III(LCA)

题意:求编号l-r的lca。做法:第一种方法是维护一个类似rmq的东西,因为abcd的lca,可以由ab的lca和cd的lca的lca得到,然后重叠也没有关系,就比如刚才的例子,abcd的lca也可以由abc的lca和bcd的lca的lca得到,所以我们用类似rmq的查询的就可以了。查询2个点的lca写的是树上倍增。第二种方法比较容易想到,就是先dfs一遍找出欧拉序列,然后再rmq预处理一

2015-06-09 12:11:38 715

原创 CSU 1608 Particle Collider(二分+后缀数组)

题意:一个子串和他的反串在所有串中的出现次数大于一半,则输出该子串,如果有多个,按字典序排序。做法:把所有串和他的反串拼起来构造后缀数组。用一个标记数组,把正着的串的每个位置标上这个串的编号。二分长度,按照rank值大小找height>=h的最长区间,可以利用位运算来代表在正串中出现了几次,如果在正串中没出现过那么就不用加入map里了,如果出现过,我们还要把串反过来看看map里有没有,如果有说

2015-06-02 20:33:59 599

原创 hdu 5226 Tom and matrix(Lucas定理)

题意:矩阵第i行第j列代表c(i,j),给出行和列范围,求那个矩形中的和。做法:由c(i+1,j+1) = c(i,j)+c(i,j+1)可得,这行是上一行乘2加上上行的第一个前一个,再减去最后一个(写下来就懂)。然后由于要取模,我们必须用到Lucas定理,因为如果不用,直接计算,如果n和m过大,会出现分母分子同时模p都为0的情况,但是其实由于分母和分子可以约分,答案并不为0。Lucas定

2015-06-01 15:01:20 943

原创 CodeForces 538E Demiurges Play Again(博弈dp)

题意:给出一棵树,叶节点都有编号,从根节点开始,一人走一步,第一个人想要得到的叶节点最大,第二个人想最小,问怎么安排,使得第一个人得到的叶节点最大,最小。做法:先考虑得到叶节点最大的情况。我们设dp[i]是当前人以他的走法能得到符合他的第dp[i]大数。那么假设对于第一个人,假设他的下一步第二个人可以得到第2大,第3大,第4大(3个分叉),那第一个最大可以得到下面所有数的第2大。我们可以安排最

2015-06-01 00:55:57 1265

原创 CodeForces - 49E Common ancestor(dp)

题意:有n个替换规则,2个字母可以被替换成一个字母,给出2个串,问这2个串经过一系列的替换后形成的最短且相同的串长度是多少。做法:我们可以先用区间dp,d[i][j][k]代表i到j区间是否可以变成k这个字母。再利用vector去存一下起点为i,变成k这个字母的终点为哪些,然后就可以进行后来的dp了。设dp[i][j]为第一个串用了i个字母,第二个串用了j个字母经过替换变成相同的串的最短长度。

2015-05-28 12:38:00 581

原创 CodeForces - 548D Mike and Feet(单调栈)

题意:给出n个数,假设区间长度为k,给定一个起点求区间最小值,由于有很多起点,所以要求的是这些的最大值。然后k的范围是1-n。。(感觉好别扭)。所以要输出n个答案。做法:我们都知道单调栈可以处理出一个数为最小值的最长区间,那么先处理出这个东西。再把数字带着他的最长区间降序排个序。设指针p为1,我们可以发觉对于区间长度从小到大来说答案是不增的,所以如果当前数字最长区间为x,那么我们只需要更新p到

2015-05-27 23:52:06 880

原创 CodeForces - 548C Mike and Frog(扩展欧几里德)

题意:给出h1,变换成下一个是x1*h1+y1模m,目的要得到a1,h2同理,2个数字是同时变换的,问同时得到a1和a2的最近时间,得不到输出-1。做法:我们可以暴力找出a1第一次出现的位置l1,以及a2第一次出现的位置l2,因为m不超过10^6,所以循环节的长度不会超过10^6,然后再找出第二个a1出现的位置,以及第二个a2出现的位置,那么循环节的长度分别是w1,和w2。可能会出现w1和w2

2015-05-27 23:42:23 728

原创 zoj 3662 Math Magic(背包)

题意:k个数,和为n,lcm为m,求情况总数。用dp[i][j][k]表示放了i个数,和为j,lcm为k的情况总数,但是太大,所以要预处理出m的所有约数,以及lcm,还有映射关系。这样k就缩减到20左右。内存就开的下了。测了下1000 1000 100是差不多10^7次计算。AC代码:#pragma comment(linker, "/STACK:102400000,1024000

2015-05-20 17:09:56 663

原创 BZOJ 2565 最长双回文串(manacher)

题意:求一个最长的双回文串,双回文串定义是两个回文串是连续的但是不相交。做法:manacher预处理一下。然后用h1[i]代表以i为结尾的最长回文串,h2[i]代表以i为起点的最长回文串。我这里用了一个单调队列,因为对于一个点来说,作为结尾想要最长,那么自然希望最远的中点,所以维护一个位置单调递增,右边界也单调递增的单调队列即可。正过来做一次反过来做一次就可以了。后来发觉太沙茶了,其实完全

2015-05-20 14:55:08 553

原创 NOIP 2013 货车运输(树上倍增)

题意:n个点,m条边,要求从x到y点路上最小的边权最大的值。做法:求一次最大生成树,因为对于2个联通块,最大生成树的边一定是最大的,故其他边都可以删去。之后就是一棵树了。可以用树链剖分,不过这里由于只有查询没有修改,故学习了下代码量比较短的树上倍增。其实树上倍增就像区间问题上的RMQ,而树链剖分就像区间问题上的线段树(自认为比喻比较恰当)。我们用f[i][j]代表i这个点之上2^j个点(不

2015-05-20 10:45:53 1168

原创 BZOJ 1010 [HNOI2008]玩具装箱toy(斜率优化dp)

题意中文。做法:也是斜率优化的基础题。就是化简的时候注意不要写错了。AC代码:#pragma comment(linker, "/STACK:102400000,102400000")#include#include#include#include#include#include#include#include#include#include#include#i

2015-05-15 14:37:35 766

原创 hdu 3507 Print Article(斜率优化dp)

题意:把一堆数分成几堆,每堆的代价由这个式子:,算出。求总代价最小。做法:另dp[i]是分到第i个总代价最小,那么转移方程,dp[i] = dp[j]+(sum[i]-sum[j])^2+M。可以发现递推复杂度是o(n^2)。我们变形一下这个式子:dp[i]-M-sum[i]^2 = dp[j]+sum[j]^2-2sum[i]*sum[j],等式左边都是不变量,即要求等式右边的最小值对应

2015-05-15 14:35:37 489

原创 hdu 5221 Occupation(树链剖分)

题意:1棵树,3个操作,1.占据从x走到y的路。2。某个点被另一个占据,3.占据以某个点及以下的子树。每次操作都要输出占有权值的和。1操作就是类似查询的操作,走一遍更新。2操作先看那个点有没有被占据,有才需要更新成没有。3操作,由于树链剖分其实本质就是一个先走重链的dfs序,所以是连续的,就可以区间更新了。AC代码:#pragma comment(linker, "/STACK:102

2015-05-09 17:09:42 670

原创 hdu 5217 Brackets(线段树)

题意:给一串括号,有2个操作,1。翻转某个括号。2。查询某段区间内未匹配的括号(或者说跟他匹配的在区间外面),第k个未匹配的括号是第几个。做法:我们可以把一段区间的括号匹配情况总结为)(,即左边的右括号和右边的左括号,其余的自然都已经匹配了,这样就可以利用线段树去合并。对于操作1单点更新即可。操作2就麻烦很多了。我YY了一个做法,把这个区间有关的点(也就是线段树内区间查询的点)给拿出来,重新建

2015-05-08 11:06:25 771

原创 WHU 1583 Palindrome(回文树)

题意:把一个串分成2部分,求左半部份的本质不同回文串个数等于右半部份本质不同回文串个数的2倍的所有位置乘起来的答案。做法:学习了下回文树,总结几点。1.用编号去代表每个不同的回文串。比如编号为5的回文串为aba,那么next[5]['z']就是zabaz。next[i][j]保存的是这个在编号为i回文串的两端加字母j的回文串的编号。2.fail[i]代表编号为i的回文串的包含在内具有相

2015-04-29 19:11:26 779

原创 hdu 5213 Lucky(容斥+莫队)

题意:给2个区间,从2个区间内各取一个数字,求a_i+a_j = k的对数。做法:假设区间范围是[x1,y1]和[x2,y2],我们设f(a,b)为区间a,b中等于k的对数总数,那么答案就是f(x1,y2)-f(x1,x2-1)-f(y1+1,x2)+f(y1+1,x2-1)。那么该如何求f(a,b)?还记得小z的袜子么,我们只需要改变下思路对于a来说求k-a的个数即可。。PS:第一次离4

2015-04-27 23:54:17 694

原创 UVA 12170 Easy Climb(dp+单调队列优化)

题意:给出一个序列,首尾不可改变,要求你使序列满足相邻2个|x_i - x_(i-1)| 做法:通过枚举可以发觉每个数字只能变成a_i+k*d这种形式的数字,那么这样每个数的状态只有n^2个了,不过转移的话代价比较高,因为对于d(i,x)需要枚举d(i-1,y)| x - d AC代码://#pragma comment(linker, "/STACK:102400000,102400

2015-04-25 00:23:24 1748

原创 URAL 2041 Nanomatryoshkas(贪心)

题意:给出n个俄罗斯套娃,分别有内体积和外体积,要一个套住另外一个必须内体积要大于另一个的外体积,问你能不能找出一个排列使得每一个都不能套住前面一个。对于一个套娃,保证外体积大于等于内体积做法:我们先按照外体积降序排序,相同按照内体积降序排序,显然可以发觉对于外体积不同的来说,这个排列必定可以满足题目意思,因为内体积肯定小于等于自己的外体积的,自然也就小于比自己外体积大的前面一个套娃的外体积了

2015-04-24 02:35:41 1014

原创 poj 3415 Common Substrings(后缀数组+单调栈)

题意:给2个串,求2个串的后缀之间公共串长度>=k的对数。做法:单调栈维护3个东西,一个是height,一个是在之上到前一个元素(其实包括这个前一个元素)之间另一个串后缀的个数,还有个位置。用dp[i]代表rank为第i个串与之上所有另一个串后缀>=k的对数。那么在加入新串的时候,先出栈height大于当前的,同时统计这之间有多少另一个串后缀的个数x,然后一直出到小于当前height为止,设这

2015-04-24 02:22:06 624

原创 poj 1470 Closest Common Ancestors (离线LCA Tarjan)

题意:求每个点作为lca的次数。做法:裸的lca题,离线做法就是利用并查集,关键思想在于对于当前点的询问对应的另一个点已经被访问过了,那么那个点的祖先就是这个询问的lca。AC代码://#pragma comment(linker, "/STACK:102400000,102400000")#include#include#include#include#include#i

2015-04-21 00:16:42 666

原创 WHU 1568 Product(数位dp)

题意:给出一个数字,要求每位乘起来等于原数字的数字个数,每位的数字只能是2-9。做法:可以发现2-9数字中素数只有2 3 5 7,而5和7是不能进行拆分和合并的,所以我们只需要考虑2和3,用dp[i][j][k]代表2的个数为i个,3的个数为j个,组成数字有k位的数字个数。递推式也很简单,枚举最后一位为2,3,4,6,8,9转移即可。再算出这个后,枚举2和3组成的数字长度k,我们考虑放x个

2015-04-21 00:05:34 519

原创 WHU 1572 Cyy and Fzz(AC自动机+dp)

题意:给出n个模板串,随机一个串,求出现模板串个数的期望(相同算一个)。做法:比赛时误以为是求模板串出现了几次,用dp[i][j]代表在第i个节点还要走l步的期望,然后记忆化搜索。。不停的wa。。后来问了别人才知道是看错题目了。做法应该是先求概率,再求期望,用dp[i][j][k]表示走了i步,停在j节点,得到串集合为k的概率。最后答案就是sum(dp[i][j][k]*(k里串的个数

2015-04-20 23:47:10 682

原创 hdu 5208 Where is Bob(数位dp)

题意:Alice和Bob各有一个选择数的区间,2人各选一个异或是最后的值,Alice想让这个数大,Bob想让这个数小,2人都很聪明,Alice先选,问最后的数是多少?做法:可以知道如果要异或为1,那么必须一个为0,一个为1,因为Alice先选,所以若想那位为1,如果Alice这位选0,Bob的数必须这位都是1,才能使得这位为1。反之也一样,所以就从高位往低位走进行搜索,记得上下界是会随着选的数

2015-04-19 20:52:48 922

原创 HDU 2471 History of Languages(自动机BFS)

题意:给你2个DFA,问你是否等价,状态有n(1做法:由于那些不能到达终态的状态无论怎么样都是等价的,所以需要把到这些状态的转移设为-1,即不能到达。这个可以建立反向边然后BFS。用一个二元组(a,b)代表在第一个DFA中的a状态,在第二个DFA的b状态,如果已经走到这个二元的状态,如果一个是终态一个是非终态那么自然就不等价,下一个字母转移的地方如果一个是-1一个是可以转移的那么也自然不等价,

2015-04-18 00:17:37 669

空空如也

空空如也

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

TA关注的人

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