need review
文章平均质量分 72
johsnows
正在静下心来学算法的acmer
展开
-
uva 10934 Dropping water balloons(dp)
题意:给出k个水球,n层楼,现在想测试出水球最低会在那层楼扔下爆炸,问最少需要测试多少次, 注意要求的情况是每层楼都可能爆炸。解题思路:一眼看上去会觉得是二分,如果求数够的话,确实能够在log2(n)的次数之内求出测试出来,但是这个问题我们要考虑的是每个位置都有可能爆炸,所以不仅球不够,目标位置没有确定也导致我们不可能考虑二分。想一想如果去搜索的话,我们肯定会搜索还原创 2017-08-30 16:18:40 · 339 阅读 · 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 · 519 阅读 · 0 评论 -
hdu 2196 Computer(树dp)
题意:给出n个点, n-条边,每条边有权值,问从每个点出发能得到的最大值,不返回。解题思路:第一道树dp。树dp的话只不过是转移的关系是在当前节点和几个孩子节点上,也就是从孩子节点转移到当前节点,但由于是一棵树,当前节点的父节点其实也是自己的一个前驱,也可以从父亲节点转移到当前节点,树dp比较麻烦的就是这一步了。这道题,一个节点出发的最大值的路径无非就是过父亲节原创 2017-06-20 11:23:57 · 452 阅读 · 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 · 392 阅读 · 0 评论 -
codeforces 812 E. Sagheer and Apple Tree(树上博弈)
题意:a和b在玩游戏,一棵树有n个节点,每个叶子节点的深度的奇偶性相同,每个人每次可以有两次操作,第一种是将一个非叶子节点的苹果移动到儿子节点上,第二种是将叶子节点的苹果吃掉。a先手,b每次游戏开始前可以进行一次交换,把u,v两个节点的苹果数量交换,问有多少队u,v,使最后b获胜解题思路:考虑在普通的nim上增加一个操作,就是可以增加一堆石子。那么这个操作实际上是没有用的,原创 2017-06-02 17:12:31 · 821 阅读 · 0 评论 -
codeforces 812 C. Sagheer and Nubian Market(二分答案)
题意:n个商品,有s块钱,买第i件商品的价格为a[i]+i*k,a[i]为商品的基础价格,k为总共要买的商品数量,问最多能买多少件商品,在买相同数量的商品情况下,尽量让花的钱最少。解题思路:二分枚举要买的商品数量,然后排序一下价格,check是否能买到当前答案数量的商品,求出一个最大值即可。代码:#include using namespace std;c原创 2017-06-02 17:20:35 · 631 阅读 · 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 · 457 阅读 · 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 · 338 阅读 · 0 评论 -
codeforces 27 E. Number With The Given Amount Of Divisors(反素数)
题意:求最小的约数个数为n的数解题思路:反素数经典问题。这题要求的就是反素数,因为反素数的质因子一定是连续的,所以可以dfs枚举在连续几个质因子上的个数,即枚举种t1,t2,t3,每一个素因子的幂,来算出当前的数的因子个数,对于等于n的我们更新一下答案,使答案更小即可。更形象一点的还是看acdreamers的博客吧,看到搜索树的图就很好理解了。代码:原创 2017-06-05 11:39:50 · 330 阅读 · 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 · 614 阅读 · 0 评论 -
第八届山东省赛 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 · 452 阅读 · 0 评论 -
第八届山东省赛 sdut 3903 CF(贪心+dp)
题意:讲的是打cf的得分机制,给出n个题,每个题有它的初始分数a[i],随时间流逝要扣去的分数的系数d[i],做这道题需要花的时间c[i]。现在给你t时间,问你能获得的最大分数。解题思路:这题一开始想的就是dp,写了一发wa掉了,然后想到需要贪心,比赛就结束了。为什么单纯的for(int i=1; i=0; j--)dp[i]=max(dp[i], dp[i-c[i]]+a原创 2017-05-09 17:16:45 · 506 阅读 · 0 评论 -
51nod 1183 (dp)
编辑距离,又称Levenshtein距离(也叫做Edit Distance),是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。例如将kitten一字转成sitting:sitten (k->s)sittin (e->i)sitting (->g)所以kitten和sitting的编辑距离是3。俄原创 2017-04-26 15:15:19 · 322 阅读 · 0 评论 -
sdut 3893 Return of the Nim(matrix nim)
题意:n堆石子,n为质数,(2解题思路:这是个1*n的matrix nim,貌似只能解n为奇数的情况和n=2的情况,n=2的时候就是威瑟夫博弈。n不是2的情况的时候,考虑这个题如果没有第二种操作,就是nim博弈,我们可以考虑去每堆石子去k个石子是否会影响当前的np状态。对于n状态,我们不需要用第二种操作,用第一种操作就肯定可以找到一个继承状态是必败的,即异或为0.而对于一个原创 2017-05-08 21:18:30 · 570 阅读 · 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 · 580 阅读 · 1 评论 -
codeforces 382 B Number Busters(推公式)
给出 a, b, w, x, cc每秒c--;a的话,if(b>=x)b-=x;else {a--;b=w-(x-b);}问最少经过多少秒后c解题思路:最少多少秒的话,最后一个状态一定是处于一个a没变,c--的过程。然后具体分析,最好的情况是经过c-a秒,就达到了,这样验证一下就好。b=w-(x-b);转换一下,就是b=b-x+w.其实对于b来说,每次都是要-x原创 2017-06-21 11:54:35 · 441 阅读 · 0 评论 -
codeforces 200 D Programming Language(stl)
题意:给出若干个函数声明,再给出若干变量定义,然后给出若干个函数调用,问每个调用有多少个声明的函数是符合这个调用的。解题思路:直接把非法字符变成空格然后用stringstream再读入一遍,这样处理字符串简直不能更方便,然后接下来的比较其实就很暴力了。代码:#include #define ps push_backusing namespace std;s原创 2017-07-06 11:36:17 · 319 阅读 · 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 · 343 阅读 · 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 · 708 阅读 · 0 评论 -
hdu 5238 Calculator(线段树+中国剩余定理)
非常巧的一个题。运算过多,肯定得用数据结构维护一些东西,这里要维护的是映射关系,运算的本质其实就是函数,也就是映射。但是答案对29393取模,对0-29393的数维护映射在空间上和时间上都是撑不住的。如果仔细观察这个数可以发现,这个数本身不是素数,但是可以分解为4个素数的乘积7*13*17*19。如果你学过中国剩余定理,就应该知道已知一个数x对m1,m2,m原创 2017-07-29 08:20:00 · 399 阅读 · 0 评论 -
hdu 6133 Army Formations(线段树合并)
其实题目要求的就是一颗子树上把所有的权值从小到大排序,每个值对应第k大,把k和值乘在一起加和,就是这个子树对应的根的答案。说到底就是有多少个数大于一个值,这个值就要多加几次。然后我就死在这个理解上,因为要考虑值相同的情况,这句话没错,但是容易忽略值相同的情况。对于每个点我们建一颗权值线段树,表示以这个点为根的子树上的权值分部情况。然后右子树上有多少值大于左子树上的值,以及左子树上有原创 2017-08-20 17:26:35 · 523 阅读 · 0 评论 -
洛谷 排列LCS P1439 (LCS)
看到黑书上写着,LCS是稀疏匹配,只需要关注能让答案更新的地方就可以了。也就是当a[i]==b[j],dp[i+1][j+1]=dp[i][j]+1.这种情况。所以对于每一个i,我们只需要关心,和a[i]相等的值再b种的位置j,记为pair[i]。所以i从0开始更新,去找出pair[j]小于pair[i]的最大的dp[j],这个过程用个线段树或者树状数组优化就好原创 2017-07-27 09:38:21 · 411 阅读 · 0 评论 -
bzoj 2212 [Poi2011]Tree Rotations(线段树合并)
题意:一棵二叉树有n个叶子节点,每个叶子节点有权值,可以交换左右子树,问先序遍历这棵树,得到的最小逆序对数。思路:应该算是线段树合并的入门题。暴力每个非叶子节点,用ans1记录不交换左右子树时,跨越左子树和右子树的答案,即左子树大于右子树的数的对数,ans2记录交换左右子树时的答案。查询左子树中大于右子树的对数可以对左右子树各建一棵权值线段树,在线段树合原创 2017-08-18 22:16:56 · 331 阅读 · 0 评论 -
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 · 241 阅读 · 0 评论 -
hdu 6035 Colorful Tree(dfs)
题意:一棵有n个点的树,树上每个点都有颜色c[i],保证每两个点之间的路径只有一天,定义每条路径的值为这条路径上经过的不同颜色数量和。求所有路径的值。解题思路:可以把问题转化为对每种颜色有多少条不同的路径至少经过这种颜色的点,然后加和。求有多少条路径经过可以转换为总路径数-没有经过的路径数,只要求出没有经过的路径数就好了。对于每种颜色没有经过自己的路径条数我们可原创 2017-07-26 09:51:17 · 984 阅读 · 0 评论 -
Codeforces 388B Fox and Minimal path(构造最短路条数为N的图)
一道cf好题。转自:http://blog.csdn.net/yasola/article/details/52386132题目大意: 输入一个数字N,构造一个最短路径数为N的图,以邻接矩阵的形式输出。解题思路: 开始想的是因数分解,不过这样对于非常大的质数会超过1000个点的限制。后来在吃饭的时候灵光一闪想到的正确的方法转载 2017-08-16 18:09:21 · 411 阅读 · 0 评论 -
hdu 6050 Funny Function (矩阵快速幂)
二维的一个矩阵。如果只有一维,用一下矩阵快速幂求前缀和是很简单的。比如我构造出一个矩阵从[f(1,1),f(1,2), sum(1,2)]推到[f(1,2), f(1,3), sum(1,3)],这是不难的。由于我们是要求f(m,1),就是要求sum(m-1,n)所以还要构造矩阵从f(m-1, 1)推到f(m, 1)也就是sum(m-2,n)到sum(m-1, n)。但是第一维构造原创 2017-08-07 23:44:32 · 353 阅读 · 0 评论 -
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 · 354 阅读 · 0 评论 -
codeforces 707 D Persistent Bookcase(dfs+bitset)
题意:对一个n*m的01矩阵进行操作。第一种操作是将x行y列的数置1.第二种操作是将x行y列的数置0.第三种操作是将x行的数取反。第四种操作是将矩阵回到第x次操作后的矩阵。解题思路:说是可持久化数据结构,我最近又刚刚学了主席树,就真的被骗去写可持久化了,然后还没有写出来QAQ。其实这个题目由于n,m小于1000,本身操作消耗的时间很短,所以不需要可持原创 2017-07-20 16:26:52 · 270 阅读 · 0 评论 -
codeforces 811 E Vladik and Entertaining Flags(线段树+并查集)
题意:n*m的矩形,每个格子上有一个数字代表颜色,有q次询问,问(1,l),(n,r)这两个点对应的矩形的连通块有多少个。1解题思路 :这题最麻烦的就是写合并了,然后也是让我对并查集又重新认识了一下。。只要往线段树那个方向想了,想到每个区间维护左右两个列应该不难,然后再想一想这个题目要求连通块个数,那么应该也能想到左右两个列应该是并查集。然后需要注意的是L(原创 2017-05-31 20:54:56 · 894 阅读 · 2 评论 -
codeforces D 287 Shifting
题意:看示例吧。解题思路:一开始打了个表,找了找也没规律。后来一想,这题在动的只有每块的第一个数,其它的都是往前移,如果用stl模拟下岂不是美滋滋,然而我想vector和set去了,然后时间也不多,就gg了。感觉还是太蠢,用队列不是就完美实现坐标前移了。然后这个题还需要发现一个一个特性就是,每次移动就相当于所有的每块的一个数形成的序列循环右移,然后整个序列左移,就相原创 2017-06-14 22:22:51 · 384 阅读 · 0 评论 -
zoj 3962 Seven Segment Display(数位dp)
题意:一个8位的十六进制的数字电子显示器,显示每个数字对应每秒要消耗多少点能量,数字每秒钟会加1,问初始数字为x,y秒后消耗多少能量。解题思路:赛场上去找规律做写炸了。赛后才知道可以数位dp搞,于是决定不看题解写一发。写了一发dp[pos][pre]这种状态的数位,示例也不过了,最后发现符合pos,pre状态的情况,他们pos位之前的能量加和是不一样的,所以答案是错的。最后还是原创 2017-04-25 17:02:12 · 760 阅读 · 0 评论 -
codeforeces 792 C. Divide by Three (dp || 贪心)
题意:一个1e5长度的数字,去掉几个数字后让它是三的倍数,要求去掉的数最少,而且要去掉前导零解题思路:一开始瞎贪心,面向数据编程后终于搞出来了。其实总结起来只要注意五种情况1.sum%3==0,直接输出就行2.sum%3==1.去掉一个1。3.sum%3==1.去掉两个2.24.sum%3==2.去掉一个2.5.sum%3==2.去掉两个1对于s原创 2017-03-28 21:57:13 · 419 阅读 · 0 评论 -
hihocoder #1173 : 博弈游戏·Nim游戏·三
#1173 : 博弈游戏·Nim游戏·三时间限制:10000ms单点时限:1000ms内存限制:256MB描述在这一次游戏中Alice和Bob决定在原来的Nim游戏上增加一条规则:每一次行动时,不仅可以选择一堆取走任意数量的石子(至少取1颗,至多取出这一堆剩下的所有石子),还可以选择将一堆石子分成两堆石子,但并不取走石子。比如说有一堆石子原创 2017-04-08 12:02:09 · 606 阅读 · 0 评论 -
hihocode #1172 : 博弈游戏·Nim游戏·二
时间限制:10000ms单点时限:1000ms内存限制:256MB描述Alice和Bob这一次准备玩一个关于硬币的游戏:N枚硬币排成一列,有的正面朝上,有的背面朝上,从左到右依次编号为1..N。现在两人轮流翻硬币,每次只能将一枚正面朝上的硬币翻过来,并且可以随自己的意愿,在一枚硬币翻转后决定要不要将该硬币左边的任意一枚硬币也翻一次(正面翻到背面或背面翻到原创 2017-04-08 11:52:28 · 570 阅读 · 0 评论 -
poj 2155 Matrix (二维树状数组)
题意:一个初始为0的n*n矩阵,有m个操作,c为区间取反,q为单点查询解题思路:对于区间更新单点查询的题目,用树状数组是极好的,更新区间(a,b)我们update(a, 1), update(b+1, -1),然后查询的时候直接输出query(x)就是单点的值。这个题需要扩展到二维,其实解法类似, update(x1, y1, 1); update(x2+1, y1,原创 2017-04-07 22:09:56 · 301 阅读 · 0 评论 -
hdu 5724 Chess(sg函数)
题意:两个人在一个n*20的棋盘上下期,每行上已经放置一些棋子,每个棋子可以往右边移动一格,如果右边没有棋子的话,或者跳往右边第一个没有棋子的格子,问先手是否有必胜策略解题思路:这题要用到状态压缩和sg函数每行有20格,我们可以用一个二进制数来表示一行中那些位置有棋子摆放,如果为1就是有棋子摆放。压位之后就可以表示出每一行的状态了,棋盘上每行的棋子只能往右跳,所以每行都原创 2017-04-07 20:19:00 · 319 阅读 · 0 评论 -
poj 2559 Largest Rectangle in a Histogram(单调栈)
题意:在二维坐标上,有n个相邻的矩形,每个矩形的宽为单位长度,高不相同,问能组成的最大子矩形面积。配合图片使用更佳:阴影部分即样例的最大矩形。解题思路:我们考虑每一个单位矩形,它能否以自己的高度和相邻的矩形组成一个新的矩形取决于旁边的矩形的高度是否不小于它,那么,我们如果能知道一个矩形左边第一个高度小于它的矩形的位置l,右边第一个高度小于它的矩形的位置r,那么我原创 2017-04-07 09:11:49 · 369 阅读 · 0 评论 -
poj 2728 Desert King(最优比率生成树)
题意:有n个点,要求一棵生成树使总height/distance最小,height为两点高度差,distance为两点间距离,输出最小的height/distance。解题思路:这题是01规划在最小生成树中的应用,我们按照01规划的方法不断求优化斜率,在更新斜率的时候用求最小生成树的做法去使height-l*distance(l就是斜率,即要求的答案)的值最大,然后更新l到不能原创 2017-04-07 08:23:52 · 388 阅读 · 0 评论 -
gdut Problem G: 等凹数字 (数位dp)
Problem G: 等凹数字Description定义一种数字称为等凹数字,即从高位到地位,每一位的数字先非递增再非递减,不能全部数字一样,且该数是一个回文数,即从左读到右与从右读到左是一样的,仅形成一个等凹峰,如543212345,5544334455是合法的等凹数字,543212346,123321,111111不是等凹数字。现在问你[L,R]中有多少等凹数字呢?原创 2017-03-27 17:25:14 · 1409 阅读 · 0 评论