- 博客(96)
- 收藏
- 关注
原创 CF Div2 977 C2
可以观察到,如果完成讲解p数组中的数在q数组里面第一次出现的下标一定是升序的,用f数组来代表p数组里面每个数第一次在q数组里面出现的位置,完成讲解的情况下一定满足f[p[i]]
2024-10-08 17:44:46 186
原创 CF D. Minimize the Difference
对于每一个数,初始sum=p[i],cnt=1,如果sum/cnt<=栈顶的值,那么就可以减少栈顶的值,让当前的值增加,也就是sum+栈顶的值*数量,cnt+数量。这样也就是总和为sum,然后分到cnt个位置的问题,因为要尽可能的平均,那么就如果sum能整除cnt,那么就往栈里面放入sum/cnt和cnt,如果不能整除,那么就放入sum/cnt,cnt-sum%cnt和sum/cnt+1,sum%cnt。给你长度为n的数组,可以无限次的让i位置的数-1,让i+1的位置的数+1。
2024-10-05 18:49:57 335
原创 ABC 373 F - Knapsack with Diminishing Values
一道很神奇的dp题。令g[i][j]为拿重量为i的物品,拿j个的时候的幸福度,f[i][j]为拿重量小于i的物品,总重小于j的情况下的幸福度。观察可以知道,幸福度的方程是二次函数,如果多拿一个物品,那么就会多价值-2-1的幸福度,那么就可以先求出g数组的值,然后求f数组就可以得到答案。给n个物品,每个物品有二种属性,第一种为重量,第二种为价值,每个物品有无限个,最多拿总重不多于W的物品,每种物品提供的幸福值是价值*拿的数量-拿的数量*拿的数量。
2024-10-03 21:54:05 143
原创 CF C. Nikita and LCM
思维题.首先先对数组排序,考虑一种特殊情况,那就是如果数组最大值不能被其他数整除,这代表什么?代表其他数里面有某个质因子,最大值里面没有或者数量不管,所有最小公倍数都会大于最大值.那么其他情况的话,就可以确定所有的数都是最大数的因子,那么形成的最小公倍数也一定是最大数的因子,那么就可以枚举一下最大数的因子,就可以了.给长度为n的数组,求出最长的特殊子数组,如果子数组的最小公倍数不在原数组中,那么就是特殊的.
2024-09-13 17:43:09 374
原创 牛客周赛 小红的数组回文值
最暴力的思路是枚举出全部的子序列,然后暴力的计算回文值,但是明显会超时。从算贡献的角度来思考,对于每一对不相同的元素可以计算出这一对对全部子序列的贡献,例如说 i,j这二个位置不相同,如果它们在同一个子序列里面,就是在[1,i-1]和[j+1,n],这二个区间里面选择相同数量的数,再在[i+1,j-1]这个区间里面随便的取数,那么就可以的到答案的组合数公式。给长度为n的数组,求这个数组的任意子序列的回文值总和,回文值定义为一个子序列应该元素相同,但是不相同的位置数量。,根据范德蒙恒等式的性质,
2024-09-10 11:04:19 309
原创 CF D. Shocking Arrangement
将正数放入一个数组,负数放入一个数组,正数按照从大到小排列,负数按照从小到大排列,使用sum记录前缀和,如果前缀和大于0,那么就放入小于0的数,如果小于0,那么就放入大于0的数。为什么这样一定是正确的,这样排列的情况下,前缀和一定是贴近0的,对于任意一段区间的区间和来说,都可以转换为区间和的差,所以如果从0开始的区间和都符合条件,那么其他情况也符合条件。多测,每次给出长度为n的数组,可以任意排列这个数组,问能否让绝对值最大的区间和小于数组最大值减去最小值。
2024-09-10 10:48:08 208
原创 ABC 370 E - Avoid K Partition
j是从1到i-1,然后如果从j到i这一段的总和是k,那么就减去f[j],对于任意的f[i]来说,这样是不重不漏的,那么可以很容易写出一个n*2的算法,可以观察到,这个算法的瓶颈是在减去j到i总和是k的这一步上,从前缀和的角度考虑,对于每个从j到i总和为k来说,从1到j的总和都是一样的值,那么就可以用map来记录一下,从1到j总和为键,从1到j的划分方法为值,这样时间复杂度就可以了。给长度为n的数组,将数组划分成任意份,但是每一份的总和都不能是k,问有多少种分割方法。
2024-09-09 21:03:09 365
原创 牛客周赛 59 小红的X型矩阵
会形成(n-1)*(n-1)种不同形态的矩阵,这些矩阵如果是依次枚举出来,时间复杂度和空间复杂度都要上天。经过观察可以发现如果将n*n的矩阵拓展成2n*2n的矩阵,那么这个矩阵里面的n*n的小矩阵会形成(n-1)*(n-1)种不同形态的矩阵。那么就可以让矩阵循环展开成2n*2n的矩阵,那么就相当于给你一个n*n的矩阵,每次可以让一个元素改变,问变成x矩阵的最小次数,就可以直接用前缀和来解决了。问至少几次操作二可以让矩阵变成x矩阵,x矩阵的定义是对角线上都是1,其余都是0。
2024-09-09 20:34:27 347
原创 CF C. Candy Store
因为每一袋糖果的价格都是由数量和单价相乘构成的,所以cost%单价=0,所以cost是这一段单价的最小公倍数。所以一段糖果可以使用一个标签,那么每种糖果的总价是数量×单价,总价%cost=0,这就意味着,这一段的最小公约数%cost=0。多测,先给出n代表n种糖果,每种糖果分别给出数量和单价,可以将糖果平均分成若干袋,每一袋的的价格是一袋糖果数量×单价,对于每一种糖果都求出一袋的价格,对于每种糖果都需要用标签贴出一袋的价格,但是如果相邻的糖果价格相同,那么就可以用一个标签来代表价格,问最少使用几个标签。
2024-08-31 18:18:12 278
原创 ABC 368 G - Add and Multiply Queries
可以使用链表来维护,链表的含义是当前位置的b数组值大于等于2的下一个大于等于2的位置,这样的话,就可以先找到[l,r]区间里面第一个大于等于2的位置,然后不断的往后面跳跃,直到大于r。因为初始值是0,所以第一次操纵一定是选择a[l],从l+1开始到b数组里面第一次出现大于等于2的数之间,肯定是之间加上a数组里面的数更加优秀,那么这一段区间的和怎么维护呢?对于操作二来说,因为是用链表来写的,所以如果改变的值大于等于2,那么就把改变的位置加入链表,如果小于2,并且b数组这个位置大于2,那么就把这个节点舍弃。
2024-08-26 17:56:48 339
原创 CF E. Best Pair
观察可以知道所有的cnt总和是n,不同种类的cnt数量不会超过sqrt(n)的范围,那么就可以双重循环枚举cnt,时间复杂度为O(n),如果cnt确定了,那么对于i和j来说一定是取最大的时候最优的,所以暴力跑就行了。多测,每次给出n个数,m个数对。要求找到最大的f(i,j),cnt(i)定义为i出现的次数,f(i,j)定义为(i+j)*(cnt(i)+cnt(j)),并且i和j不能是m里面出现的数对。
2024-08-25 16:05:38 638
原创 牛客小白月赛99 F-自爆机器人
转化一下,那么就是长度为n的线段,最多可以由多少个长度不同的线段组成?贪心的想,线段的长度肯定是从一开始递增最多了,那么如果由v个不同的线段,那么1+2+3+4.....+v<=n,根据等差数列求和,所以v最大也就是根号n,所以真正的时间复杂度应该是O(sqrt(n)*(t-n)).多测,每次给出n,m,t,坐标轴上初始机器人的位置在0,怪物的位置在n,机器人初始往正整数方向行走,碰到墙壁会转向并损害墙壁,碰到怪物会瞬间爆炸,爆炸威力等于行走时间,一共有m个位置可以放置墙壁。
2024-08-25 15:36:22 540
原创 CF 965 C. Perform Operations to Maximize Score
多测,每次给出n和k,n代表长度为n的数组,每个数有二个属性,第一个是本身的值,第二个是这个数是否能被修改,如果能被修改那么就可以让k减去1让数的值增加1,可以从数组里面随意拿出一个数,对于剩下的数求出中位数,问拿出来的数和中位数的和的最大值是多少?贪心+二分,可以观察到最终的答案构成是拿出的数和中位数组成的,那么就只有二种情况,第一种是让拿出来的数变大,第二种是让中位数变大,不存在都变大的情况,因为花费1代价不一定可以让中位数变大,但是一定可以让拿出来的数变大。最后二种答案取最值。
2024-08-22 22:47:05 255
原创 CF 967 D. Longest Max Min Subsequence
那么就可以贪心的考虑这个问题,设置二个指针head和tail,head到tail的区间为可以选择的区间,tail+1到n的区间是如果不取tail位置,那么后面就不会出现tail位置这个元素,1到head-1的位置代表元素已经选了的区间。多测,每次给出长度为n的数组,要求找出没有重复元素的,最长的子序列,如果不止一个最长子序列,那么就选择字典序最小的,比较字典序的时候,如果这个元素的下标是奇数,那么就变成负数比较。
2024-08-22 20:21:31 550 3
原创 CF 967 C. Guess The Tree
交互题,多测,每次给出n,代表一颗树有n个点,最大15n次询问,每次询问可以询问到二个点距离之差最小的点,如果存在二个点到询问的二个点距离之差相同,那么优先返回到第一个询问点距离比较小的点。从数据范围来看,可以明显发现这题的时间复杂度是O(nlogn),每次询问相当于一次二分的操作,所以可以想到本题应该是,遍历每个节点并且询问出遍历的节点和什么节点相连。
2024-08-22 15:42:57 284
原创 ABC 362 E - Count Arithmetic Subsequences
dp,因为是要找出等差数列,并且这题的数据量极小,所以可以考虑设计dp数组,dp[i][j][k][v],i代表当前寻找的等差数列倒数第二项,j代表最后一项,k代表还需要寻找的长度,v代表当前判断的数,dp[i][j][k][v]代表以i为第一项,j为第二项,还要寻找k个数的等差数列数量。给出长度为n的数组,要求找出所有的等差数列,并且按照长度递增输出。
2024-08-22 13:26:32 267
原创 CF 966 Div3 F. Color Rows and Columns
dp,先求出dp[i][j],i代表第i个长方形,j代表这个长方形得到j分,dp[i][j]代表最小的涂色数,然后就可以理解成对于第i个长方形选择j分就要填涂dp[i][j]个格子,然后就是对于每个长方形都选择一个dp[i][j]来进行dp就可以了。多测,每组测试数据给出n和k,n代表有n个长方形,k代表需要的到k分,每个长方形都有宽和高,每次可以填涂一个格子,如果填满一列或者一行就可以获得一分,问达到k分最少需要填涂多少格子。
2024-08-21 22:49:51 899
原创 牛客周赛56 F.不是烤串故事
多测,每组测试给出二个字符串s和v,定义下标从1开始,可以选取字符串s的前i个字符 s1s2⋯si,然后将这一部分反转后与剩余部分拼接,求最长的公共前缀长度和可以让公共前缀最长时的反转下标。对于s串来说,如果我们反转了一部分,那么这个时候最长公共前缀是有三种可能,第一种可能是在反转的那一部分里面,第二种是在反转和不反转的交界处,第三种是在不反转的位置。Z函数的作用是预处理出s的任意长度的前缀反转之后和v的最长公共子串长度,dp数组的作用是对于不反转的部分求最长公共子串长度。
2024-08-19 22:33:02 180
原创 牛客周赛55 E 小红的序列乘积2.0
思路:dp+贡献法。从左边到右边考虑数组,第i个数有选或者不选二种可能性,那么记忆化的转移就是选这个数或者不选择这个数,这样就可以出现所有的子数组。令当前位置为x,那么后面还有n-x个数,这些数都可以选择或者不选择,那么这个6就会出现2^(n-x)次,也就是2^(n-x)次贡献。所以代码就很显然了。题意:给出长度为n的数组,可以随意的选择其中的一些数,构成一个新的数组,这个数组的价值定义为,这些数做前缀乘积,然后前缀乘积数组末尾为6的数的个数,问题目给出的数组价值为多少。
2024-08-12 20:50:01 238
原创 ABC 366 E - Manhattan Multifocal Ellipse
题目中要求的距离是曼哈顿距离,曼哈顿距离很特殊的一点是,对于二个点来说它们的x距离和y距离可以相互独立计算。观察数据范围,可以发现的是x和y的范围在[-1e6,1e6]之间,d的范围是[0,1e6]。那么就可以知道能够满足距离总和小于d的点的x和y坐标范围是在[-2e6,2e6]之间,可以分别计算出全部可能的x位置,这个位置上和n个点x的距离总和,y也同理,然后双指针的寻找全部的符合条件的x和y。给n个点和一个最大距离d,求出有多少个点距离这n个点的距离总和小于等于d。
2024-08-11 17:35:12 303
原创 CF 963 D. Med-imize
首先数组下标从0开始,举个例子,如果n=8,k=3,那么数组的下标是:0,1,2,3,4,5,6,7,将这些下标全部对k取余,下标就是:0,1,2,0,1,2,0,1。可以发现这个规律普遍存在全部的情况,那么可以抽象一下,最终数组的长度是v,那么能够构成这个数组的元素在原数组中,下标对k取余之后的值是,0,1,2,3,......,v-1。总结一下,如果k=4,n=7,数组下标就是:0,1,2,3,0,1,2。最终数组的长度就是3,最终待选的下标是:0,1,2,0,1,2。如果将这些数堆起来看呢?
2024-08-08 21:09:32 364
原创 ABC 365 F-Takahashi on Grid
因为第二步结束之后,我们的位置一定是这一列的最上面或者最下面,那么明显的优化思路就是,预处理出从每列最上面点和最下面的点,重复一次上面的步骤能够走到的点。第一个难点,是怎么预处理出一次跳跃的点,我们可以使用st表来维护区间的最大值和最小值,如果我们是从一列的最上方的点开始走那么,我们操作结束之后,我们肯定是停留在某一列的最上方的点,这一列一定是最上方的点,低于操作值的点。如果我们是从一列的最下方的点开始走那么,我们操作结束之后,我们肯定是停留在某一列的最下方的点,这一列一定是最下方的点,高于操作值的点。
2024-08-06 21:04:57 538
原创 ABC 365 E - Xor Sigma Problem
可以想到的是使用异或前缀和,异或有一个性质是:a^b^b=a,所以如果用pre[i]来代表从0到i的异或值,那么从l到r的异或值就是pre[r]^pre[l-1],这样这题的答案就成了找二个位置不同异或前缀和异或的总和了。再次思考,对于二进制的某个位来说,我们可以枚举右端点,如果右端点是1,那么能够异或为1的区间就是之前为0的位置,如果右端点为0,那么能够异或为1的区间就是之前为1的位置。给长度为n的数组,要求求出所有连续区间长度不为1的区间的异或值。
2024-08-05 20:49:23 230
原创 Educational Codeforces Round 168 E. Level Up
可以发现一个明显的规律,如果k越小那么,主角升级的一定越快,那么主角从1到i(i代表题目里面问能不能战斗的怪物的位置),可以发现是具有单调性的,那便是k大于等于某个值之后,主角一定和怪物战斗,那么就可以二分的寻找这个最小的k。有n个怪物,每个怪物都有一个等级,主角从左到右打怪物,如果主角的等级严格大于了怪物的等级,那么怪物就会逃跑,主角每升一级需要杀死k个怪物,多组询问题目给出第几个怪物和升级一次需要杀死的怪物,问主角能不能和这个怪物战斗?
2024-08-02 20:36:37 434
原创 CF962 E. Decode
但是直接的找到符合条件的区间的时间复杂度是不行的,所以可以先使用map 来记录前缀和相等的位置,并且这样存下来的字符串是一个大串的,例如:010101,前缀和是-1,0,-1,0,-1,0,map[-1]里面存的值就是1,3,5,意思就是2到3,4到5是符合条件的字符串,而且可以发现2到5也是符合条件的,这样一来可以更快的算出这类串的贡献(定义是一类串那么它们的前缀和的值就是相同的)。为什么需要开前缀和来记录呢?
2024-08-01 21:17:11 469
原创 CF Pinely Round 4 B. AND Reconstruction
从二进制角度出发,如果b[i]的二进制位为1,那么a[i]和a[i+1]这个二进制位都要为1,这个是必须满足的要求,所以可以对每位二进制位进行构造,最后判断一下能不能变成b数组就行了。多测,给你一个长度为n-1的数组b,要求求出数组a,要求b[i]=a[i]&a[i+1],如果满足输出a数组,不满足输出-1。
2024-08-01 21:09:39 129
原创 2024河南萌新三 H-魔法
dp[i][j][k],i代表横坐标,j代表纵坐标,k代表花费的体力值,dp[i][j][k]代表在当前位置用魔法次数最小的数,所以含义就是在(i,j)这个点花费了k个体力的时候使用魔法次数的最小值。所以最终遍历一下在(n,m)这个点花费合法体力的的最小值就行了。题目给出n*m的迷宫,小白站在(1,1)这个点,终点在(n,m),小白有自己的体力值,迷宫中的每一个点都有一个值,这个值代表小白走到这个点需要花的体力值。小白会魔法,可以不用体力就走到下一个格子,问小白到终点最少用几次魔法?小白只能向下和向右。
2024-07-31 20:16:31 234
原创 CF Pinely Round 4 C. Absolute Zero
如果数组里面有奇数和偶数那么就一定不可以,本题的本质是让n个数变成相同的数,如果有偶数和奇数,如果减去偶数,那么奇偶性不变,如果减去奇数,那么也是奇偶性不变的,所以不可能变成相同的数。如果全是奇数或者全是偶数的情况下,每次可以减去最大值的一半,从二进制的角度来说,相当于右移了一位,对于其他数来说,变换之后它们的值也小于等于最大值的一半。所以这样的策略是合法的。多测,给长度为n的数组,最多四十次操作,每次可以对每个数的减去一个任意值,最后询问能否都为0,可以就输出每次减少的值,不可以就输出-1。
2024-07-30 20:55:33 295
原创 ABC364 F - Range Connect MST
根据题意可以知道,对于[1,N]这些点它们之间是不会有边相连的,所以可以先根据给出了的代价进行从小到大的排序,然后对于每组数据的[L,R],这些点都应该在同一个联通块里面,如果中间有点不在同一个连通块里面,那么就给这个点连上一条代价为C的边。例如样例中给出的1 2 2,1 3 4,2 4 5,先根据第一组数据来将1,2,5这三个点相连接,然后对于第二组数据,1,2和3不在同一块连通块,如果想要联通,那么就要2连上6,3连上6就可以了。题目给出N+Q个点,有Q次操作,每次操作会给出L,R,C。
2024-07-29 19:22:26 481
原创 ABC364 E.Maximum Glutton
本题有个很直接的思路,那就是动态规划,最直接想到的dp数组是dp[i][j][k],i代表前i盘菜,j代表吃了菜的总甜度,k代表吃了菜的总咸度,dp[i][j][k]的值是能吃的数量。但是可以满足时间复杂度并且正确的找到答案吗?明显也是可以的,时间复杂度是O(NNX),符合题目要求,当dp数组被递推完全之后,取遍历前n个,取i盘菜,甜度为k的数组,如果dp数组值满足咸度的要求,那么就i就是我们能够在不超过甜度和咸度的情况下吃的最多的菜,但是根据题意,可以再吃一盘,这个一盘要和n取最小值。
2024-07-28 16:06:46 479 2
原创 CF962 DIV3 F. Bomb
给n个初始值Ai,答案每次可以加上一个值,加上这个值之后,这个值会减少Bi,最多操作m次,问答案最多是多少?
2024-07-27 15:33:53 246
原创 牛客暑假训练4 A. LCT
先构建出树,然后从根节点跑出每个节点的深度。因为题目保证了询问c的时候,c不会是其他节点的儿子,所以顺序的求出当前联通块的根节点的深度,这个深度就是之后询问这个点的答案。给一颗有根树,依次给出n-1行的信息,分别为a,b,c,意思是链接a和b之后,询问以c为根节点的最大深度。保证询问c的时候,c不会是其他节点的儿子。
2024-07-26 20:15:10 233
原创 ABC 393 F - Palindromic Expression
因为数字n的因子很小,所以就算是因子全部是2,并且n为1e18,因子个数也才60个。所以可以dfs暴力的求出最终字符串的每个数字位置的值就可以了。给定数字n,求这个一个1,2,3,4,5,6,7,8,9和*,构成的字符串,要求这个字符串是个回文字符串,并且计算结果为n。
2024-07-21 17:15:36 170
原创 CF 959 C. Hungry Games
考虑dp,dp[i]的含义是从i开始加和能有多少符合条件的区间。因为dp数组的含义是从i开始加,所以可以当成之前加的值变成了0,所以dp的转移方程是,从i开始加然后第二个大于m的位置的dp值加上到这个位置的区间数量,所以先求前缀和,然后倒着求dp数组的值,最后加上全部的dp值就可以了。n个数,取区间[l,r],从l加到r,过程中如果和超过了m,那么就变成0,在r这个点的和不能能是0,问n个数能有多少个区间满足?
2024-07-21 15:47:36 231
原创 CF 959 B. Fun Game
将第一个字符串的字符称为待改变字符,第二个称为目标字符,首先考虑四种情况,如果待改变的字符是1,如果要需要变成1,那么只要和0异或就可以了,如果要变成0,那么只要和1异或就可以了。如果待改变的字符是0,如果要需要变成1,那么只要和1异或就可以了,如果要变成0,那么只要和0异或就可以了。因为[l,r]的区间可以仍取,所以只要在第一次出现待改变字符和目标字符不同的情况之前,待改变字符出现了1,那么就是可以让第一个字符串变成第二个字符串的,否则就不行。问无限次操作之后,能不能让第一个字符串等于第二个字符串。
2024-07-21 14:37:50 195
原创 牛客暑假训练2 C.Red Walking on Grid
对每一列进行考虑,从后往前,如果后一位是红色,当前位也是红色,那么当前的位置的答案就是后一位的答案加一,但是这可能并不是当前位最大的情况,如果当前位的上下位置是红色,那么就需要比较一下从上下转移过来,或者从后面转移过来的大小。宽为2,长为n的方格,每个格子上有一种颜色,一共有二种颜色,分别是红色和白色,开始的时候选择一个红色的格子,然后每一步都可以选择上下左右的方向进行行走,问最多可以走多少步?
2024-07-20 14:43:33 287
原创 牛客暑假训练营1 B.A Bit More Common
考虑奇数对答案的贡献,因为只能有一种子序列并且这个子序列必须是k个奇数构成的(如果只需要k-1个奇数,就可以满足条件,那么k个肯定也可以,所有不是只有一种子序列)。如果当前二进制位的数为这一位二进制位的唯一一个0,那么这个位置就叫做特殊位,必须保证k个数,每个都有至少一个特殊位,如果没有特殊位就代表这个数可以被那走与要求不符。A题中求出的答案是只要包含一个子序列就可以的总和,自然也包含存在至少二个的子序列,所以可以用A题求出的答案来减去只包含一个子序列的数量。特别的,如果只有一个奇数,并且是1,那么有。
2024-07-20 01:24:13 464
原创 牛客暑假训练营1 A.A Bit Common
(因为最多不会超过2的m次方,所以二进制的长度最多不会m,除去第0位,所以为m-1)。对于n-k个偶数来说,这些数除了二进制位的第0位必须位0以外,其他位数都可以随便填,那么可以随便填的二进制位是(n-k)*(m-1),(n-k代表偶数的个数,m-1代表除了第0位的0以外其他的位数。如果一个子序列AND和为1,可以知道这些数肯定是奇数(因为奇数的二进制尾数为1),那么这个序列就可以分为偶数和奇数来判断,枚举n中奇数的个数,奇数的个数为k,然后考虑这些奇数如何放置?,因为这些数的范围是。
2024-07-19 21:26:00 637
原创 2024河南萌新联赛第一场 D 小蓝的二进制询问
对于从[l,r]上的数,可以先算出从[0,r]的所有二进制1然后减去[0,l]的所有二进制1。思考如何计算,从样例中给出的5来思考,[0,5]的二进制表示分别为:000,001,010,011,100,101。可以发现二进制的最后一位循环的是01,倒数第二位循环的就是0011,根据二进制数的性质就可以知道,每一位的二进制循环长度是2的次方。分别计算每一位二进制1的数量累加即可。
2024-07-17 20:07:17 390
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人