![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
studyproblem
文章平均质量分 72
johsnows
正在静下心来学算法的acmer
展开
-
codeforeces 344 E Read Time
题意:n个磁头去读取m个磁道,给出磁头和磁盘的初始位置(递增给出),问最少需要多少时间所有磁道均被读取。思路:二分答案还是很容易想到的,难点大概在于贪心。在确定时间t后考虑:由于有多个磁头,所有最左边的磁道肯定要由最左边的磁头去读取,但是如果没次都让磁头从左边开始读取,是不对的。最左边的磁道自然是要读取,但是贪心的思想下,我们应该让当前磁头在读取最左边的磁道的往右走的越原创 2017-05-24 17:54:17 · 315 阅读 · 0 评论 -
hdu 2222 Keywords Search(AC自动机)
AC自动机模板题。next数组开成char蜜汁mle。。hdu的tle和mle已经让我不敢相信了。代码:#include #define totNode 500005#define maxn 1000006using namespace std;struct acho{ struct st{ int next[26];原创 2017-06-06 21:35:42 · 267 阅读 · 0 评论 -
codeforces 617 E. XOR and Favorite Number(莫队)
题意:n个数,m个区间,问区间内有多少对(i,j)a[i]^a[i+1]^......a[j-1]^a[j]==k,k已给出。解题思路:离线的查询,用莫队最好了。第一次写莫队,所以理解还比较浅。莫队算法的原理是基于由已知[l,r]的答案推到[l,r-1],[l-1, r],[l, r+1], [l+1, r]的答案是o(1)的,所以我们可以先算出一个区间的答案,然后再逐原创 2017-06-02 21:48:29 · 441 阅读 · 0 评论 -
第七届山东省赛 Feed the monkey(dp)
题意:给出a,b,c三种物品,每种物品有A,B,C件,将所有的物品排成一列,每种物品不能连续出现aa,bb,cc次,问有多少种排列方式。解题思路:很明显的dp,但是转移不好想。首先我们需要思维i,j,k,l分别表示当前用了i件a,j件b,k件c,序列末尾是第l种物品,dp[i][j][k][l]就表示这个状态有多少种排列方式。l是不可少的,只用三维的话怎么也做不对。原创 2017-06-03 19:28:01 · 371 阅读 · 0 评论 -
hdu 2196 Computer(树dp)
题意:给出n个点, n-条边,每条边有权值,问从每个点出发能得到的最大值,不返回。解题思路:第一道树dp。树dp的话只不过是转移的关系是在当前节点和几个孩子节点上,也就是从孩子节点转移到当前节点,但由于是一棵树,当前节点的父节点其实也是自己的一个前驱,也可以从父亲节点转移到当前节点,树dp比较麻烦的就是这一步了。这道题,一个节点出发的最大值的路径无非就是过父亲节原创 2017-06-20 11:23:57 · 434 阅读 · 0 评论 -
codeforces 814 C. An impassioned circulation of affection(暴力)
题意:给出一个长度不超过1500的字符串(小写字母),询问不超过20000次,每次询问有一个数字x和字母y,x代表你可以改变字符串里x个字符为任意小写字母,y时询问你能得到的最大的连续为y的子串。解题思路:预处理出26个字母替换n次的答案,每种情况,去暴力枚举左端点,然后二分右端点,先预处理出一个每个字母在字符串中出现次数的前缀和,然后二分中的check直接利用这这个前缀和原创 2017-06-08 17:00:30 · 340 阅读 · 0 评论 -
ural 1003. Parity(并查集)
题意:有一个01序列,现在有n个声明,每个问题,每个问题包含两个数字l,r,已经一个字符串表示odd和even,问题的含义是让这个序列l到r之间的1的个数为even和odd,现在问你能构造出一个序列最多满足前多少个问题。解题思路:这道题的转换还是有点巧妙的。假装这里有一个01序列,要知道l,r内有多少个1的话,最好的办法就是先预处理一个前缀和,查询一下也就可以,因为是问是奇原创 2017-06-09 11:39:44 · 499 阅读 · 0 评论 -
srm 711 DerangementsDiv2(dp)
题意:1-n+m的数排列,要求前m个数p[i]!=i,问有多少种排列方式,对1e9+7取模解题思路:不会做,最后问的p神才会了。dp状态是dp[i][j],表示i个数排列要求前j个数 错排的方案数。转移dp[i][j]=(i-j)*d[i-1][j]+j*dp[i-1][j-1];分别表示最后一个数放在后n个位置还是前m个位置的两种方法。i=j的原创 2017-07-02 09:31:14 · 268 阅读 · 0 评论 -
bzoj 2049: [Sdoi2008]Cave 洞穴勘测 (时间分治+带撤销并查集)
可加边删边,询问两个点连通性的一个题。好像可以lct。但是跟着金桔学了时间分治+带撤销并查集的做法,第一次写时间分治。时间分治的话就是以操作序号为时间,对应对一颗线段树上去,然后在线段树上分治找到操作时间对应的节点,进行操作。对于一条边,它存活的时间就是【加边的时间,删边的时间】这样一个区间,然后我们这条边pushdown到线段树上去,分散的存在各个节点,注原创 2017-06-16 10:57:43 · 1021 阅读 · 0 评论 -
hiho #1306 : 股票价格(stl)
中文题。解题思路:用一个multiset维护价格,然后一个list::iterator> >记录时间和对应的价格信息及即可,见代码代码:#include #include #include #include using namespace std;multisetprice;list::iterator> >tim;int main(){原创 2017-06-12 13:50:12 · 410 阅读 · 0 评论 -
hdu 1166 敌兵布阵(cdq分治)
第一次写cdq分治。感觉这个题就是按时间递归分治,然后通过每次计算左区间内(时间早)操作对右区间(时间晚)中的查询结果的影响。代码:#include using namespace std;const int maxn=5e5+5;struct node{ int inde; int val; int type; ope原创 2017-06-26 11:21:37 · 365 阅读 · 0 评论 -
HackerRank - stone-division (sg函数)
题意:给出一堆石子,再给出一个集合,有m个数,每次你可以将石子等分成x堆,x取自集合,两人轮流操作,不能操作的输,问先后手谁赢。解题思路:简单的sg函数,因为一些原因石乐志的把sg函数给排除了,恩,比赛的时候应该去针对题目思考吧。然后最后主函数里直接判断了sg[n]输出答案错了好几发怀疑自己不会sg了,这题做的真的是窝心。。代码:#include原创 2017-06-18 11:02:01 · 362 阅读 · 0 评论 -
zoj 3795 Grouping(tarjin+dfs)
题意:n个人,m个年龄比较,si,ti代表si年龄小于ti。被直接比较过年龄或者间接比较过的不能分在一组,问最少需要分在几组中。解题思路:一开始想的是去找一条最长的路,也即树的直径,这里是单向边的话直接找一遍就行。但是会有成环的情况,成环的点是都不能分在同一个组的,所以直接找最长路的话不一定能全部取出成环的点,所以缩点,然后再去找点值最大的一条路径,点值即一个强连通分量中点的个原创 2017-06-16 22:32:11 · 333 阅读 · 0 评论 -
zoj 3602 Count the Trees (dfs+哈希)
题意:给出两棵树,问这两棵树有多少对子树,分别来自两棵树且结构相同。思路:一开始想着去给没课字符编号,然后map统计,但是没想出编号的办法。编号的话我们可以根据二叉树每个节点的两个儿子来编号,pairpair中两个值分别表示出了两个左右子树的结构,这棵树的结构也就表示出来了,这种做法倒是加深了对树的理解,已经如何构造编号也是深受启发。然后对两颗树分别dfs就可以了。原创 2017-05-05 15:05:35 · 450 阅读 · 0 评论 -
hdu 5544 Ba Gua Zhen(线性基+dfs)
题意:一个无向图,每条边有值,找出无向图中所有的环的异或和,问这些值能异或出来的最大值。解题思路:去年的做的比赛里的题,今年才补上。找环用dfs跑一遍图就可以找出来了,然后求最大的异或和,这是线性基的应用,用高消对求出来的异或和跑一下求出线性基,然后就是线性基求异或最大值的套路了。思路是蛮清晰但是还是很容易错,用来存环的异或和的数组和边数m开的一样大了结果超了,但是hd原创 2017-04-23 20:48:36 · 950 阅读 · 0 评论 -
codeforces 794 D Labelling Cities(脑洞)
题意:一个图有n个点,m条边,保证整个图连通,问能否构造出一种权值,使得两个点之间权值差小于等于1当且仅当两个点有边相连。解题思路:其实感觉想法应该都是有的,但是很难整合出来,在几个点之间不互相连接的前提下,一个点如果连接其中超过2个点,肯定就不能构造出这样的权值。然后比较难想的就是可以把相邻的点集合(包括自己)相同的点的权值都赋值为相同,但是知道了这个后是很容易想通的,因为他原创 2017-05-16 11:32:55 · 797 阅读 · 0 评论 -
zoj 3962 Seven Segment Display(数位dp)
题意:一个8位的十六进制的数字电子显示器,显示每个数字对应每秒要消耗多少点能量,数字每秒钟会加1,问初始数字为x,y秒后消耗多少能量。解题思路:赛场上去找规律做写炸了。赛后才知道可以数位dp搞,于是决定不看题解写一发。写了一发dp[pos][pre]这种状态的数位,示例也不过了,最后发现符合pos,pre状态的情况,他们pos位之前的能量加和是不一样的,所以答案是错的。最后还是原创 2017-04-25 17:02:12 · 736 阅读 · 0 评论 -
codeforces 347 D Lucky Common Subsequence(dp+kmp)
题意:给出a,b,c三个字符串,问ab两个字符串最长不包含c的公共子序列。解题思路:基本的思想还是求最长共子序列的dp。但是需要扩展一维,第三维k表示dp[i][j]最长公共子序列的后缀和c的前缀匹配到的位置的下一个位置,每次a[i]==b[j]的时候, 我们去找一下a[i],加上a[i]的子序列和c匹配到的位置,这里利用下kmp就可以,从k开始跑。然后用一个结构体记录原创 2017-05-27 11:49:46 · 562 阅读 · 1 评论 -
第八届山东省赛 C sdut 3895 fireworks(组合数+逆元)
题意:一个烟花(位置为x)每秒爆炸并往两边(x-1,x+1)分裂成两部分,不断循环。给你n个位置,每个位置上有c个烟花,问t秒后,w位置上有多少个烟花。解题思路:容易推出对于一个烟花来说,t秒后周围的烟花数量分部就是杨辉三角的t+1行,不过每两个数之间要多一个0.n的上限1e5,不能打出杨辉三角需要o(n^2)的时间显然是不行的。所以我们只能直接求组合数,求的时候除法取原创 2017-05-10 12:37:27 · 430 阅读 · 0 评论 -
山东省第八届省赛 sdut 3896(找规律+组合数取模)
题意:如图让你求从(1,1)到(A,B)有多少种方案。解题思路:设向左走l步,向下走r步,向下走c步,我们枚举c,当c确定的时候,l和r也同时确定了,然后求一下l,r,c的排列数(l+r+c)!/(l!*r!*c!)就好了。需要预处理阶乘的逆元。具体见代码:#include #define LL long long using n原创 2017-05-10 16:53:48 · 598 阅读 · 0 评论 -
codeforces 27 E. Number With The Given Amount Of Divisors(反素数)
题意:求最小的约数个数为n的数解题思路:反素数经典问题。这题要求的就是反素数,因为反素数的质因子一定是连续的,所以可以dfs枚举在连续几个质因子上的个数,即枚举种t1,t2,t3,每一个素因子的幂,来算出当前的数的因子个数,对于等于n的我们更新一下答案,使答案更小即可。更形象一点的还是看acdreamers的博客吧,看到搜索树的图就很好理解了。代码:原创 2017-06-05 11:39:50 · 313 阅读 · 0 评论 -
URAL 1748. The Most Complex Number(反素数)
题意:求n以内约数个数最多的数,有多个约数相等的就求最小的那一个。解题思路:就是说求反素数,其实可以直接打个表。。代码:#include #define LL long long using namespace std;const LL inf=1e18+1;LL ans;int p[16] = {2,3,5,7,11,13,17,19,23原创 2017-06-05 16:02:25 · 240 阅读 · 0 评论 -
hdu 4542 未知剩余系(反素数)
题意:求x内约数为k的最小的数,以及求x内约数是x-k的最小的数。解题思路:第一种数用dfs去搜索就行了,第二种的话,先打个表跑出来即可。代码:#include #define LL long long using namespace std;const unsigned long long inf=~0ULL;const long long INF =原创 2017-06-05 16:05:08 · 316 阅读 · 0 评论 -
codeforces 200 D Programming Language(stl)
题意:给出若干个函数声明,再给出若干变量定义,然后给出若干个函数调用,问每个调用有多少个声明的函数是符合这个调用的。解题思路:直接把非法字符变成空格然后用stringstream再读入一遍,这样处理字符串简直不能更方便,然后接下来的比较其实就很暴力了。代码:#include #define ps push_backusing namespace std;s原创 2017-07-06 11:36:17 · 293 阅读 · 0 评论 -
poj 2750 Potted Flower(线段树)
题意:给出一个环,让找到一段连续区间,使得和最大,不能不取,也不能全取。解题思路:不是一个环的话,就是连续子段和的线段树简单题,不会可以看前面的博客:http://blog.csdn.net/johsnows/article/details/70214095然后求环的话,我一开始很蠢的去特判了一下,反正最后对拍出来错误也很难调试。看了金q的博客后原创 2017-06-14 16:52:22 · 330 阅读 · 0 评论 -
hdu 6097 Mindis(几何)
因为PO = QO, 所以直接将PQ平移到平行于x轴的位置,这样比较好建立椭圆方程。为什么会联系到椭圆呢,因为椭圆上任意一点到两焦点的距离等于定值,所以建立以PQ为焦点的椭圆,再求椭圆与圆相交时,最小的a,就求出答案了。这里只知道c,需要二分一下b,b的范围就是r-h,h是圆心到PQ中点的距离。http://www.cnblogs.com/chen9510/p/7341215.html原创 2017-08-11 19:49:28 · 442 阅读 · 0 评论 -
bzoj 2212 [Poi2011]Tree Rotations(线段树合并)
题意:一棵二叉树有n个叶子节点,每个叶子节点有权值,可以交换左右子树,问先序遍历这棵树,得到的最小逆序对数。思路:应该算是线段树合并的入门题。暴力每个非叶子节点,用ans1记录不交换左右子树时,跨越左子树和右子树的答案,即左子树大于右子树的数的对数,ans2记录交换左右子树时的答案。查询左子树中大于右子树的对数可以对左右子树各建一棵权值线段树,在线段树合原创 2017-08-18 22:16:56 · 311 阅读 · 0 评论 -
hdu 6096 String(AC自动机)
转换还是比较巧妙的。因为要求前缀后缀都包含的个数,所以可以把字符串a转换成a#a这样一个字符串,比如abca就转换成abca#abca然后对于一组前缀a后缀b转换成b#a,比如ab ca,就是ca#ab,然后对前缀后缀的串建立AC自动机,让主串去匹配,如上述例子,ca#ab满足为abca#abca的一个子串,也就是abca满足这个前缀后缀,所以问题,就转换成了典型的ac自动机匹配问题。原创 2017-08-12 00:07:17 · 897 阅读 · 0 评论 -
hdu 6053 TrickGCD(筛法+容斥)
题意:给出a数组,问有能构成多少个长度与a相等的b数组,每个对应位置b比a小,并且gcd(b[1],b[n])>1.a[i]解题思路:看着大神的代码补的:http://www.cnblogs.com/jhz033/p/7246028.html看范围就知道要去枚举gcd,对于每个gcd,在a[i]这个位置上有gcd/a[i]个数能满足条件构成b[i],只要把每个位原创 2017-07-27 21:00:32 · 1249 阅读 · 0 评论 -
hdu 5238 Calculator(线段树+中国剩余定理)
非常巧的一个题。运算过多,肯定得用数据结构维护一些东西,这里要维护的是映射关系,运算的本质其实就是函数,也就是映射。但是答案对29393取模,对0-29393的数维护映射在空间上和时间上都是撑不住的。如果仔细观察这个数可以发现,这个数本身不是素数,但是可以分解为4个素数的乘积7*13*17*19。如果你学过中国剩余定理,就应该知道已知一个数x对m1,m2,m原创 2017-07-29 08:20:00 · 381 阅读 · 0 评论 -
hihocoder 1555 四次方根(矩阵快速幂)
做这个题之前你的知道一元四次方程的求根公式(为什么我的小学体育老师没教过我...)设x^4+ax^3+bx²+cx+d=0的四个根是x1,x2,x3,x4,则x1+x2+x3+x4=﹣ax1x2+x1x3+x1x4+x2x3+x2x4+x3x4=bx1x2x3+x1x2x4+x1x3x4+x2x3x4=﹣cx1x2x3x4=d然后你可以通过推导得到x1^2+x2^2+x3^2+x4^2原创 2017-08-21 11:03:23 · 680 阅读 · 0 评论 -
Gym - 101334E Exploring Pyramids(dp+分治)
题意:给出一个多叉树先序遍历序列,问有多少种不同的树的结构能跑出这样的序列,答案对1e9取模。解题思路:可以考虑一颗树在什么位置进行了怎样的分叉决定了它的情况,所以我们在不同的位置枚举不同的分叉, 统计情况就可以了。对于一个没有分叉的一条到叶子节点的链,它的先序遍历一定是一个回文串。所以一条链能产生一个分叉关键条件是否由两个及以上不重叠子串组成。这个过程可以递归分治得到。原创 2017-08-28 10:03:30 · 306 阅读 · 0 评论 -
codeforces 449 D Jzzhu and Numbers(容斥+dp)
这题真的爆炸难懂...待补。代码:#include using namespace std;const int mod=1e9+7;const int maxn=1e6+5;int dp[maxn];long long p[maxn];int main(){ int n, i, j, x; cin>>n; for(i=1, p[0]=1; i<原创 2017-08-23 20:29:12 · 325 阅读 · 0 评论 -
hdu 5450 Traversal(状压dp)
题意比较迷,第一句话的意思是那k个数不存在不用管,出题人的英语.....但是这个题还是比较难的。每个点只能到差值1, p, p+2的点,要求每次走数量大于等于3的环,不能重复走完所有点。走完所有点形成环其实相当于,每个点出度入度两次,要超过3个点意味着不能两两成环,更不能自环。由于最多只能到达p+2之外的点,所以每个点一定要在p+2的距离只能形成一个环。可以维护原创 2017-08-23 21:24:21 · 444 阅读 · 0 评论 -
codeforces 897 D Ithea Plays With Chtholly(交互)
题意:每次给你一个数,让你放到一个长度为n 的数组里,直到这个数组填满并且是不递减函数为止。需要 在m步内完成c是给出的数的范围。解题思路:一种显然的暴力方法就是从1开始扫描,遇到第一个大于x的或是a[i]==0的就放。但是还有显然的卡掉这种暴力的做法,就是把数n-1逐个给出,就每次要替换,这样的话就需要n^2次,显然不行。所以应该能想到从两边,开始扫描,让大于c...原创 2017-12-03 15:51:41 · 566 阅读 · 2 评论 -
hdu 1024 Max Sum Plus Plus(dp)
题意:求m段连续子序列和。解题思路:首先想到二维的dp状态dp[i][j]表示前i个数j段得到的最大值。转移有两种情况,首先是不增加新的组,加在前面一组上,转移就是dp[i][j]=max(dp[i][j], dp[i-1][j]+a[i]);第二种是增加新的一组,这里需要注意,不增加新的一组的时候由于是连续的一定和i-1相连,而增加新的一组就不需要了,中间可以很多原创 2017-07-27 08:11:12 · 223 阅读 · 0 评论 -
codeforces 832 D Misha, Grisha and Underground(倍增)
题意:给出n个点的树,q个询问,每次询问给出3个数x,y,z问选两个点作为起点,到第三个点的路径有多少个点重合。解题 思路:distance(x,y)=distance(x,root)+distance(y, root)-2*distance(lca(x,y),root).x,y为起点时,答案就是(dis(x,z)+dis(y,z)-dis(x,y))/2 。重原创 2017-07-26 20:22:42 · 563 阅读 · 0 评论 -
codeforces D 287 Shifting
题意:看示例吧。解题思路:一开始打了个表,找了找也没规律。后来一想,这题在动的只有每块的第一个数,其它的都是往前移,如果用stl模拟下岂不是美滋滋,然而我想vector和set去了,然后时间也不多,就gg了。感觉还是太蠢,用队列不是就完美实现坐标前移了。然后这个题还需要发现一个一个特性就是,每次移动就相当于所有的每块的一个数形成的序列循环右移,然后整个序列左移,就相原创 2017-06-14 22:22:51 · 342 阅读 · 0 评论 -
codeforces 811 E Vladik and Entertaining Flags(线段树+并查集)
题意:n*m的矩形,每个格子上有一个数字代表颜色,有q次询问,问(1,l),(n,r)这两个点对应的矩形的连通块有多少个。1解题思路 :这题最麻烦的就是写合并了,然后也是让我对并查集又重新认识了一下。。只要往线段树那个方向想了,想到每个区间维护左右两个列应该不难,然后再想一想这个题目要求连通块个数,那么应该也能想到左右两个列应该是并查集。然后需要注意的是L(原创 2017-05-31 20:54:56 · 870 阅读 · 2 评论 -
POJ 1015 Jury Compromise (dp)
题意:有n件物品,每件物品有a价值,b价值,从其中选m件物品,使其总a价值-总b价值的绝对值最小,相等的情况下,总a价值+总b价值最大。解题思路:背包既视感,网上很多题解的做法是有问题的,而且那种知道会重复,然后再判断下去掉重复的做法确实很变扭,最后的避免重复的做法就是像01背包一样逆向转移。设dp[i][j]表示选取i件物品,价值差为j时,价值和的最大值,如果为-原创 2017-07-17 22:11:35 · 333 阅读 · 0 评论