
刷题记录
文章平均质量分 57
rootting
一个立志于学算法,却总学不会的大学生
展开
-
刷题记录(NC16562 开车旅行)(树上倍增)
3、对于询问一,给出x0,枚举每个城市,求出a行驶的路程和b行驶的路程,然后进行比值计算(比值计算可以换成乘法计算),那么这个根据出发城市s,总行驶路程x,求出a行驶的路程和b行驶的路程这个过程在询问二中也有出现,因此可以维护成一个函数。说明下数组:dis[i][j]表示从i点出发,j=0表示最短距离点,j=1表示次短距离点,nxt[i][j]表示从i点出发,j=0表示最短距离,j=1表示次短距离。f[i][j][0/1]维护从i点出发,走2^j次方轮,0表示A走的次短距离,1表示B走的次短距离。原创 2023-01-06 15:44:51 · 267 阅读 · 0 评论 -
刷题记录(NC235654 牛可乐和公平点)(树上倍增)
(1)该中点为两点的lca点,此时若两点a,b的深度相同,则lca点到两点间的距离(经过的边数)一定相同,此时满足“中”点概念的点为总点数 - a'(父亲为lca点,为a点的祖先)的孩子节点数 - b'(父亲为lca点,为b点的祖先)的孩子节点数。3、通过分析可以得出,我们需要维护出每个节点的深度,孩子数量,f数组(f[i][j]表示i节点往上的2^j个节点的点),可以通过dfs和求lca得出,对于如何求祖先中,指定父亲的节点,可以利用类似于lca的求法,一步步往上判断,具体看代码。以上可以通过画图分析。原创 2023-01-05 20:55:02 · 258 阅读 · 0 评论 -
刷题记录(NC16527 货车运输)(树上倍增)
2、通过画图观察样例可以发现,要求两点间最小权值的最大值,首先这两点要连通,其次才是找一条有着尽可能大的权值分布的路径,再在这条路径上找权值的最小值,那么选的边就为最大生成图上的边。4、然后是如何求该最大生成图上,两点间边的最小权值,利用树上倍增的思想,维护一个数组f,f[i][j]表示i节点向上2^j的节点,w[i][j]表示i节点向上2^j路径上的最小权值。5、初始值,f[i][0] = i节点的父亲,w[i][0] = (若i节点为根结点,那么其为一个最大值,若不是根结点,为与父亲相连的边的权值)原创 2023-01-04 20:54:55 · 266 阅读 · 0 评论 -
刷题记录(NC22494 选点)(dfs序)
1、选择根结点,那么其子树要比根结点来得大,选择左子树上一点,那么其右子树上的数字选择要比该左子树上选的点要小。按照dfs序来按照根右左的顺序来排列各点的权值,那么符合要求的最多选点数目为该序列的最长上升子序列。2、对于题目的n,m的范围为10^5,可以利用二分优化来求.原创 2022-12-30 20:47:22 · 184 阅读 · 0 评论 -
刷题记录(NC23051 华华和月月种树)(dfs序)
2、对于操作2,利用dfs序,维护出两个数组,一个l[N]表示该点的dfs序中的编号,r[N]表示该点dfs序的孩子节点的最后一个下标。那么对于区间加操作,可以利用dfs序维护出范围,然后求和。1、转换思想:即根据所有操作来建树,利用线段树。有关于将一点长出一个为权值为0的节点,可以当作将该权值清为0。3、对于操作3,可以利用树状数组来求该点的权值。4、线段树的tree值,也为lazy值。原创 2022-12-27 20:55:59 · 103 阅读 · 0 评论 -
刷题记录(NC13611 树)(dfs序)
2、那么如果按照dfs的顺序来染色,则对于一个孩子结点,染的颜色要么与父亲相同,要么就是用之前从未出现的颜色来染,因为按照dfs顺序来染色,则染到该点时,该点的父亲、祖先、某些兄弟的颜色已经全染了。如果与除了父亲颜色外其他祖先、兄弟的颜色,那么无法保证从该祖先或者兄弟到该点的颜色均相同。dp[i][j] += dp[i][j-1](该点染的颜色与父亲相同) + dp[i-1][j-1] * (k-(j-1))(该点染一种之前从未出现过的颜色,则选择的颜色数为总颜色数(k) - 之前用的颜色数(j-1))原创 2022-12-22 20:51:56 · 112 阅读 · 0 评论 -
刷题记录(NC17450 因数个数和、NC218398 小G的约数、NC204916 浅尝辄止)(数论分块)
2、对于sqrt(x)范围内的贡献,即找i*(刚刚好大于sqrt(x))还在x范围内的数字的个数,那么该数的范围为(sqrt(x)+1 -> x/i)即11有因子11,12有因子12....个数为(100-11+1)这就是利用sqrt(x)的因子个数。然后有2*11,2*12,...2*50,即22有11因子,24有12因子。原创 2022-12-20 21:08:56 · 342 阅读 · 0 评论 -
刷题记录(NC16596 [NOIP2011]计算系数(排列组合))
的系数为(因为不会打排列组合的符号,就用文字描述)k的n的组合 *3、对于组合数,可以利用杨辉三角快速求出。2、对于求一个数的次方,可以采用快速幂。原创 2022-12-15 21:02:42 · 86 阅读 · 0 评论 -
刷题记录(NC15532 Happy Running)
同理,对于k>x,若AB为一定,此时满足B>k-x即可,计算为:(2*x-k)*(2*x-k)*0.5/(x*x)所以当前的概率可以通过画图来计算,横坐标为起点到A的距离,纵坐标为起点到B的距离,则A原创 2022-12-13 21:03:52 · 116 阅读 · 0 评论 -
刷题记录(NC50614 取石子游戏 1、NC50615 取石子游戏 2、NC19156 石子游戏、NC236262 二叉树游戏)(博弈论)
2、先手是在奇数轮拿奇数个点,后手是在偶数轮拿奇数个点,那么若奇数拿好节点后,其总的被拿掉的节点数应该为奇数,即奇数个奇数相加为奇数;同理,后手拿好节点后,其总的被拿掉的节点数为偶数,即偶数个奇数相加为偶数。2、那么总共分的次数为奇数的个数,和总数(奇数+偶数)-1,因为每次奇数分都会有一个偶数,而偶数合成的次数,为总数-1。2、若不为(1+k)的倍数,那么先手先将其拿为(1+k)的倍数,然后根据后手拿的个数,来凑1+k。1、如果石子个数为1+k的倍数,那么先手必败,否则先手必胜。原创 2022-12-12 21:16:01 · 250 阅读 · 0 评论 -
刷题记录(NC236214 石子游戏、NC223888 红色和紫色、NC201610 Game)(博弈论)
1、观察发现,若n*m为奇数时,则先手可以先涂中心的方格,然后开始与后手对称涂格子。若为偶数,那么后手只要与先手涂对称的格子即可。2、计算给出的数的质因子的个数cnt,那么只cnt-1即为要经过的步数,若该数为奇数,则先手必胜,否则,先手必败。1、当集合中全剩下质因子时,那么就不可以再分解了。因此我们计算要经过多少步使集合中只剩下质因子。1、该题目与NIM博弈相同,若所有石子数的异或和为0,则先手必败,反之先手必胜。原创 2022-12-11 14:36:39 · 150 阅读 · 0 评论 -
刷题记录(NC25354 愉快的递推式、NC15666 又见斐波那契)
1、首先求出递推式数组:关于f(n) = 3*f(n-1) + 2*f(n-2) + 2int a[3][3] = { {3, 2, 2}, {1, 0, 0}, {0, 0, 1}}; 与g{ f(n-1), f(n-2), 1 }相乘,得到下一个递推式{f(n), f(n-1), 1}2、确定初始值f[1] = f[2] = 1, 即刚开始{ f(n-1), f(n-2), 1 }数组为{1, 1, 1}3、一个矩阵乘法计算a*g, 一个计算a*aa*ga*a矩阵快原创 2022-12-07 00:02:15 · 243 阅读 · 0 评论 -
刷题记录(NC20545 [HEOI2012]采花)(树状数组)
1、题目要求求出能采到花的颜色数。2、记下每种颜色的前一个位置,和前前个位置。当一朵花第一次出现时,我们将其当作该种花前前个位置。当一朵花出现第二次时,将该位置当作该种花前一个位置。并且说明所有包含前前个花的区间都可以采该颜色的花,所以颜色数+1。当一朵花出现三次以上时,我们将包含前一朵花的区间+1,因为如果左区间从前一朵花开始,到当前这朵花结束,刚刚好为两朵花,那么颜色数可以+1。而对于包含前前朵花的区间则要-1,不然颜色就会重复计算3、我们将所求的区间按照右区间排序,从小到大开始求,最后记得要按照题目给原创 2022-12-04 21:42:09 · 99 阅读 · 0 评论 -
刷题记录(NC23054 华华开始学信息学)(树状数组)
然后再从将add数组计算进去,如何计算[x,y]区间的add数组的影响呢,可以发现,比如对于以y为结尾的区间,我们可以用该区间内的最后一个数y对于add数组存在数的下标j相除,所得的数为以该最后数y为结尾的区间内,总共有因子j的总个数。对于d的操作,如果d很大的话,说明其计算因子的数目较少,就直接计算因子,然后相加,如果因子小,那么计算因子的操作就多,可以利用一个add数组,表示当前因子为x的+y。找数组里下标所有包含i因子的数 ,首先a[i]这个区间是包含i的最小下标区间,然后我们再找其他区间也包含i。原创 2022-12-01 20:45:08 · 138 阅读 · 0 评论 -
刷题记录(NC16610 [NOIP2009]Hankson的趣味题)
3、求lcm时计算a*b,所以要开long long,也可以不开,就将运算顺序调换,lcm(a, b) = a/gcd(a, b)*b;所以可以枚举b1的因子作为x,然后验证gcd(x, a0) = a1, lcm(x, b0) = b1是否符合。1、根据题目要求求gcd(x, a0) = a1, lcm(x, b0) = b1;那么b1%x == 0。2、减少复杂度:循环sqrt(b1)次,找到i为b1的因子,说明b1/i如果不为i,那么也为b1的因子。原创 2022-11-22 22:14:25 · 125 阅读 · 0 评论 -
刷题记录(NC208253 只能吃土豆的牛牛)
1、首先根据题目给出的样例分析可以发现,1、3、4(=1+3)、9、10(=1+9)、12(=9+3)、13(=1+9+3)……2、因此我们可以利用二进制数的排列,来计算的K个数,比如0100表示为ans = 0+0+3^(3-1) = 9。其排序是一个二进制数的排列,0001 0010 0011 0100....。比如第三个0011 ,如果该位置有1,就加上该位的三次方。原创 2022-11-20 20:30:25 · 133 阅读 · 0 评论 -
刷题记录(NC208250 牛牛的最美味和最不美味的零食)
否则,[x, y]就包括左右区间,找左区间[x, tree[2*p].num]+右区间[1, y-tree[2*p].num](从1开始)因为题目是将节点将区间去掉,如何表示区间去掉,可以加一个数num表示当前区间里的元素个数。如果左区间的元素个数大于y,说明区间[x, y]全在左区间。如果左区间元素个数小于x,说明区间[x, y]全在右区间。查询区间[x, y](第x个元素到第y个元素)如果左区间的元素个数大于x,说明x在左区间内。如果元素个数小于x,说明x在右区间。比方说x在线段树的相对位置进行转换。原创 2022-11-16 20:44:43 · 422 阅读 · 0 评论 -
刷题记录(NC236242 序列求和、NC50428 数星星 Stars)
1、因为题目给出的星星顺序是按照y从小到大,x从小到大,在0-maxx(x)中开线段树,对于当前x,看小于等于x区间内是否出现星星,即为该星星的等级数量。2、对于当前输入的x,先查询[0, x]内星星的个数,然后记上该星星的等级,然后再在线段树的x位置+1,加上当前星星。1、利用开根号的性质,一个数在开有限次根号后就会变成1,利用这个性质,当该数开根号为1时,就不要再进行开根号了。2、big标记表示当前区间是否全开为1,所以big区间更新取左右区间的最大值,如果为1,说明左右区间均全开为1。原创 2022-11-15 21:06:39 · 145 阅读 · 0 评论 -
牛客练习赛105(A切蛋糕的贝贝、B抱歉,这没有集美、D点分治分点)
1、题目已经定下来了切的块数,即六块,且比例为1:1:4:5:1:4,那么只有刚刚好为题目要求的比例的倍数,才可以切。1、可以发现要是序列的排序和其所分配的号至少要出现一个公倍数为偶数,那么至少要有一个偶数在偶数位,直接这样求很麻烦,反过来我们可以求所有的奇数在偶数位的情况数,然后将总数的全排列个数减去该数即可。4、将最小堆改为利用最大堆,并且有关路径更新的要求也不同,可以发现,求出两点的d值,后序再次经过时,其d值也会受先前的d值影响,那么就可以用来更新。d(u,v) = max(u->v的最短路径);原创 2022-11-14 21:48:23 · 323 阅读 · 0 评论 -
刷题记录(NC19246 数据结构)
首先对于两个标记是先加还是先乘很难搞清,统一设为(xi+p1)*p2的形式,即lazy1要随着lazy2更新,每次对该区间进行乘操作时,lazy1也跟着*k,注意这里两个区间的更新不可以调换,因为区间平方和要利用区间和,因此区间平方和要先计算,如果调换,那么就会重复计算。因此我们只要将该区间的平方和 += 该区间的和*2*k + 该区间长度*k。区间平方和*k² = ∑(每个元素*k)²,因此区间平方和直接乘k²即可。区间和*k = ∑每个元素*k,因此区间和直接乘k即可。同样的分析对于区间和。原创 2022-11-12 15:39:28 · 445 阅读 · 0 评论 -
刷题记录(NC23047 华华给月月出题,NC15164 Big Water Problem,NC50454 A Simple Problem with Integers)
因此,对于素数的幂,我们就利用快速幂来求,而对于合数的幂,我们利用其因数的幂相乘求出。2、 可以在线性筛素数时,额外开一个数组来专门存储和计算幂。1、要将1-n的所有数的n次方给求出来进行异或,可以发现。哪位大佬可以帮忙看看是哪里出问题了,一直找不到错误。3、最后在1-n内的所有幂进行异或即可。原创 2022-11-10 22:05:35 · 131 阅读 · 0 评论 -
刷题记录(NC224933 漂亮数)
2、在线性筛中加一个数组vis来记录漂亮数,st数组表示当前数是否为素数,注意在st == 0,即判断当前数为素数时,先不要将其置为1,在该素数与前面素数在相乘的过程中还需要该判断。所以期间只将该素数所合成的合数的st置为1,而本身不为1,反正后序也不会再次判断。1、求两个素数的乘积,可以在线性筛中找出所有的素数,然后对当前素数乘以当前已找到的素数记录下来,最后可以利用前缀和,求区间中满足条件的数量。原创 2022-11-09 23:22:01 · 115 阅读 · 0 评论 -
刷题记录(NC229005 【模板】同余方程)
2、如何保证求出的x为最小整数解,因为x要在mod b的条件下最小,那么就将x一直减去b,找到那个刚刚好为正整数的解即可。1、ax≡1(modb) 可以转换成 ax+by = 1,那么我们要求的x就可以通过扩展欧几里得算法求出。那么那些(a,b)!原创 2022-11-04 20:05:35 · 103 阅读 · 0 评论 -
刷题记录(NC20313 [SDOI2008]仪仗队)
1、首先分析题目,对于只能看到的点,设原点坐标为(0,0),则除去横纵坐标上能看到的两点(0, 1)、(1, 0),和对角线上的(1, 1),我们能看到的点为(2,3)、(3,5)等等等,对于(10,15)该点必定被(2,3)给挡住。其横坐标必定是大于纵坐标的,且对于x = n,其能看到的点必定为与其互质的数,即φ(n),那么该题就转换成从求欧拉函数的和。那么可以发现,该两数的质因子均相同,那么就只有前面的N不同, 则两数相乘的欧拉函数就相差乘一个当前遍历的素数。当a,b互质时,φ(a。原创 2022-11-03 20:39:16 · 260 阅读 · 0 评论 -
刷题记录(NC14399 素数判断,NC235228 素数的个数,NC23050 华华对月月的忠诚)
那么gcd(f[i], f[i-1]) = gcd(f[i-1], f[i] - f[i-1]) = gcd(f[i-1], f[i-2]);2、构造法,可以先将区间内的合数标记,则找到两个乘数相乘在区间范围内,就将其标记,最后遍历一遍区间,将未标记的记上个数。1、由fi = f[i-1]+f[i-2],以及求最大公约数的公式gcd(a, b) = gcd(b, a-b);照这样推下去,那么gcd(f[i], f[i-1]) = gcd(a, b);1、如果为素数就直接输出,如果不为素数,要输出其质因子。原创 2022-11-02 21:35:35 · 304 阅读 · 0 评论 -
刷题记录(NC25064 [USACO 2007 Mar G]Ranking the Cows)
则当i点的k(中间点)位置为1,那么该中间点为1的位置,即中间点可以到达的点,i也可以到达,那么就将b[i]|=b[k];3、因为题目要求查看任意两点的大小关系,利用floyd算法,枚举起点终点,中间点,若起点到中间点、中间点到起点有边,则将起点到终点连边。5、答案对所有的两点间看是否已经确定了关系,即b[i][j] == 1 || b[j][i] == 1,保证不判断相同的两点,第二层循环从i+1开始。1、本题要求求出在题目给出的大小关系下,最少还需要几对大小关系才可以得知所有数字的大小关系。原创 2022-10-30 22:10:31 · 130 阅读 · 0 评论 -
刷题记录(NC236210 传送门)
1、建图:对于同一类型的传送门,各点间可以连接ti长度的边,但是如果对于给出的点都两两连边,会导致复杂度过大,我们可以考虑对于每一种类型的传送门,设置一个总点,使该类型的点直接与该点连ti长度的双向边,保证同一类型的传送门的点之间,一定要通过该总点才能访问。那么这就可以保证同一类型的点之间的长度为ti。2、答案会很大,要开longlong,且dis的初始化最好要大一点。原创 2022-10-27 20:46:44 · 148 阅读 · 0 评论 -
刷题记录(NC22594 Rinne Loves Graph)
1、在用dijkstra求最短路的过程中加入了警戒城市,可以在dis最短路数组中加入当前过了几个警戒城市,即再开一维。在vis数组也开一维。在求最短路的过程中,在多加一个判断当前经过的警戒城市是否超过要求,其余就与dijkstra求最短路算法类似。原创 2022-10-26 20:05:53 · 113 阅读 · 0 评论 -
刷题记录(NC19987 [HAOI2012]ROAD)
3、对于所经过的最短路数量,假如一条边为最短路所经过的,那么起点到该边起点的最短路的数量num,和该边终点到终点的最短路数量num2,两个数量相乘即为该边最短路的数量。通俗的讲,一点的num为起点到该点的最短路数量,num2为该点到终点的最短路的数量。5、总结:对所有点都跑一遍dijkstra和dfs,每边的最短路数量ans[i]+=num[该边的起点]*num2[该点的终点](每次以不同的点作为起点时,每次更新)2、求出所有的最短路,用dijkstra算法求出以所有点为起点的最短路。原创 2022-10-21 21:18:59 · 95 阅读 · 0 评论 -
刷题记录(NC20568 [SCOI2012] 滑雪与时间胶囊)
3、先考虑在所有点均为双向边的连接情况下,所能到达的最短距离,我们可以用最小生成树prim或者Kruskal算法来求解,我们这里考虑使用Kruskal来计算,但是这里有一个限制条件,即边有可能为单向的,如果我们直接对边的长度进行排序后,然后找最小边插入,那么我们有可能会造成该树的所有结点并不能均到达,即不满足在点最多的情况下找距离最小的情况。4、因此我们要先挑那些高的景点(一条边的两点,那么该边的高度即为两点中高度较低的那个高度),在高度均相同的情况下再挑距离小的边,这样排序来选边。原创 2022-10-20 22:15:53 · 91 阅读 · 0 评论 -
刷题记录(NC236176 分层图最短路)
1、建图:对于两层之间有传送带的,将两层的点连接一条长度为c(传送带距离)的双向边,对于两点有边,则连接双向边。2、利用最短路算法求出1-n的最小距离。原创 2022-10-19 21:26:31 · 89 阅读 · 0 评论 -
刷题记录(NC20115 [HNOI2015]菜肴制作)
2、对于某些菜品有先后顺序,这就很容易想到拓扑排序,对于有先后顺序的两道菜,就将其连边。首先第一道菜是必要最先做的,那么就从1一直往前找入度为0的点,且如果有并排的选择时先做号小的。以此类推求2所连接的入度为0的点。3、我们可以倒过来,先选择入度为0,且序号最大的点,然后继续更新入度,再选最大的,最后再将其反过来输出。1、题目要求在给定某些菜品的先后顺序下,并且满足号小的尽量在前的最优顺序。原创 2022-10-17 20:41:35 · 104 阅读 · 0 评论 -
刷题记录(NC17511 公交线路(求最短路),NC17509 挖沟(求最小生成树))
3、用一个vis数组来标记当前点是否有访问过,每次从所有节点中找dis值最小且未访问过的节点x,将其当作中间节点,标记为访问过,即该点到s的最小距离已经求出,然后利用该最小距离作为中间节点,更新每个节点的dis值。如果该点未加入树中,将该点所连接的边放入队列中,并标记已经加入树中,继续更新。4、优化:用队列,我们每次没必要都将所有点的边都看一遍,用一个队列,里面存放所有要进行迭代的点(作为中间节点),首先是放着初始点s,然后将s能更新的所有的点都放入队列中(不能重复放入节点),这样更新直到队列为空为止。原创 2022-10-16 22:28:21 · 367 阅读 · 0 评论 -
刷题记录(NC201400 树学)
1、w值即为所有点的深度和,那么假如我们将一个点作为根节点,那么该点的深度和 - 该点孩子的深度(该点所有的孩子深度都-1) + 该点父亲的结点深度(该点所有祖先结点深度+1)2、首先求出所有点的深度,和以1(任意一个结点)的深度和,这些可以用一个dfs解决。3、然后是求出所有以所有点为根节点的总深度和,再用类似的dfs可以解决。4、答案是所有结点为根节点的总深度的最小值。原创 2022-10-09 22:25:44 · 98 阅读 · 0 评论 -
刷题记录(NC20273 [SCOI2009]粉刷匠,NC210249 打砖块(brike))
4、如果维护w(l+1, k),我们可以求出蓝色格子的前缀和,设sum[i][j]为粉刷第i个木板,前j个格子的蓝色格子和,那么w(l+1, k)(第i个木板) == max(sum[i][k]-sum[i][l], k-l-sum[i][k]+sum[i][l])f[i][j][k] = max(f[i][j-1][l] + w(l+1, k));5、对于g[i][j] = max(g[i-1][k] + f[i][j-k][m]);1、题目要求求出给出的粉刷次数下,所能正确粉刷的木板的格子的最多数量。原创 2022-10-08 16:20:15 · 419 阅读 · 0 评论 -
刷题记录(NC210520 Min酱要旅行)
2、设g[i][j]为不带前i件产品,背包容量为j的最多方案数,f[i][j]为带前i件产品,背包容量为j的最多的方案数,则f[i][j] = f[i][j] - g[i][j-a[i]],可以发现第一维可以去掉,则。g[j] = f[j] - g[j-a[i]]//当j>a[i]的情况下。1、题目要求求出不带第i件产品,背包容量为j的最多的方案数。3、如何求f[j],01背包。4、同样的对于g也来个循环。原创 2022-10-06 20:36:34 · 87 阅读 · 0 评论 -
刷题记录(NC16615 传纸条)
f[i][j][k][l]指当前一条路走到(i, j),另一条路走到(k, l),此时所得到的最大值,则状态转移方程:f[i][j][k][l] = max(f[i-1][j][k-1][l],f[i-1][j][k][l-1],f[i][j-1][k-1][l],f[i][j-1][k][l-1])+a[i][j]+a[k][l];1、题目要求:找出两条路径,从左上角到右下角能得到的最大值,且两条路径不能有相同的点。原创 2022-10-06 11:29:52 · 85 阅读 · 0 评论 -
刷题记录(NC20471 [ZJOI2007]棋盘制作)
r[i][j]表示该点最多向右能到达的纵坐标,那么以该点为右下角的正方形边长最大为min(h[i][j],r[i][j]-l[i][j]+1),此时的l和r应为从该点开始能到达的最远的纵坐标(得计算两次),矩形面积最大为max(h[i][j]*(r[i][j] - l[i][j]+1)),同样的l和r。2、对于初始化,每个点的h都包括着自己,即初始化为1,对于l和r,我们先初始化为自己的纵坐标,在遍历时,一旦左右两点不同,说明可以拓展,就更新l和r,这是第一次计算l和r。原创 2022-10-05 14:05:27 · 175 阅读 · 0 评论 -
刷题记录(NC51189 Mondriaan‘s Dream)
3、对于当前行的状态和上一行的状态能否转移,我们可以发现,对于偶数列,我们可以用偶数个横方块,或者偶数个竖方块,和偶数个横方块,那么对于奇数列,我们可以用奇数个竖方块和偶数个横方块,这三种情况下,上下两行的或运算出来的连续的0,一定是为偶数个的,所以对于奇数个连续的0,我们要将其排除。2、接下来用f[i][j],表示状态为i,第j行的总共可以放置的方块,那么因为竖着的方块可以影响到两行的放置,所以我们在枚举时要考虑当前行和上一行的状态。5、最终的最后一行要是刚刚好填满的,则最后一行应均为0。原创 2022-10-04 13:08:14 · 111 阅读 · 0 评论 -
刷题记录(NC210981 mixup2混乱的奶牛)
2、定状态,因为对于相邻的奶牛间,我们有要求让其差值>k,那么对于每一个奶牛的状态,0表示没选,1表示选,则f[i][j],指状态为i,选择了前j头奶牛的最大的方案数。4、初始状态,对于只有第i位为1,选了前i位,这时f[1原创 2022-10-02 11:42:26 · 132 阅读 · 0 评论