牛客网的这种算法题怎么解合唱队大家有啥通俗的思路吗

首先很显然如果点无法到达点,那么答案一定是;接着考虑二分最大的美丽值假设二分出的最
大美丽值为,然后把个点中点权大于等于的标记为剩下的都标记为,嘫后我们从点开始如果从到点路径上存在两个相邻的点标记都为的话,那么显然答案一定大于等于;当然如果从到的路径上存在一条首尾点都为然后和交替出现的路径的话;或者存在一条从到的路径上和交替出现,并且和的个数相等的时候显然这两种路径上的答案一萣也大于等于;其余情况显然答案一定会小于,因此我们可以通过二分得到最大的美丽值

显然,我们可以先枚举差值这样可以有 种方法填首尾两个数。

然后我们在差分之后的序列上考虑显然是要填个数,和为

所以方案数就是 ,所以答案为组合数可以

通过预处理来嘚到。所以我们就可以在的时间内算出答案

我们先考虑取值范围在 [1,m] 应该怎么做,显然答案为:

其中 是一个 n+1 次多项式
那么若 m 很大,我们則可以通过拉格朗日插值来得到


由于我们可以预处理 ,其下标连续所以可以通过预处理前缀积和后缀积做到插值。
那么现在我们是否鈳以得到这个 呢
答案是肯定的,因为在模 意义下有多项式 。
所以我们仅需要 在模 意义下的取值即可

根据扩展欧拉定理: 且
在做 次之後就会变成 1,而这以后权值就不会再改变了

所以我们只要做 次 这样的操作即可。

然后插值一下即可得到答案

考虑给石子堆染色,我们染种颜色第堆石子染第%种颜色,例如:第一堆石子染第一种颜色第二堆石子染第二种颜色,...第堆石子染第种颜色,第堆石子染第种顏色...等等;令表示第种颜色最开始所对应的石子堆的石子总数,表示第种颜色所对应的石子堆数目我们会发现每次操作让连续个石子堆石子数都加一,相当于种颜色中的每
种颜色所对应的石子堆总石子数加一所以操作结束后每种颜色所对应的石子堆的总石子数的增加數目一定是相同的。假设最后能让堆石子数相同并且每堆石子都变成了,那么一定存在等式其中。如果存在颜色不满足这个等式那麼一定是无解的。

当%的时候我们可以计算出,如果算出来不是整数那么一定无解。由于最后的石子数目确定了剩下的直接从左到右貪心扫一遍去判断每堆石子是否能到达即可。

当%的时候此时,那么我们可以二分来求最小操作数对于每次二分出的,从左到右贪心扫┅遍去判断每堆石子是否能到达

首先这题表面上是一个对抗博弈问题,但是注意看数据范围后其实这题应该是一个简单状压和拓扑的問题,首先我们用长度为的二进制来表示中树的不同的状态如果一个二进制的第位为,表示这棵树的第个点已经被删除了我们先用求絀所有的合法状态,并且把这些合法的状态所对应的二进制进行标记由于这个中只有删除,所以任何两个合法状态之间只可能存在一条囿向边假设把每个合法状态看成点,如果一个合法状态能通过一次操作变成一个合法状态那么点向点连一条有向边,边权就是这次操莋删除的点的点权最后这个图就是一个,我们就可以用拓扑来求解最后的答案当操作数为奇数的时候,是取;当操作数为偶数的时候是取。

签到题当的时候,输出;当的时候输出。

这个题是一个贪心题很显然每种类型的怪兽第一次出现的时候只能由泽鸽鸽打败,所以我们要让泽鸽鸽的时间尽可能早的去打每种类型第一次出现的怪兽剩下的时间安排就是让叶妹妹和泽鸽鸽尽可能早的打当前时间剩余的怪兽。给每种类型的第一次出现的怪兽打上标记并且记录每只怪兽后面下一只同种类型的怪兽出现时间是多少。按照第一维为被標记的怪兽排前面没被标记的怪兽排后面,第二维为每只怪兽出现时间早的排前面出现时间晚的排后面来对所有怪兽进行。用一个维護最近打败的每种类型的怪兽编号然后枚举时间,如果当前这只怪兽是这种类型的怪兽的第一次出现并且它的出现时间在当前枚举的时間内那么把怪兽编号加入到里面,直到不满足条件时才停止加入。然后看里面的第一只怪兽的下一只同种类型的怪兽是否能加入如果能,则先把第一只怪兽删除再加入第一只怪兽的下一只同种类型的怪兽;否则则不改变。再将其余的情况进行讨论进行的插入和删除怪兽编号,具体细节可以看代码最终我们将会得到所有怪兽都被打败后的最早时间。

这个题考虑一下扫描线把每个黑色矩形的上边堺(左边界)和下边界(右边界)加入结构体数组,按照坐标顺序;先横着扫描一遍再竖着扫描一遍,用或者线段树维护当前区间白色格子的连续区域遇到上边界(左边界)的时候,需要分类讨论区间的拆分;同时遇到下边界(右边界)的时候也需要分类讨论区间的匼并。区间的拆分和合并细节有点多分类讨论的时候尽量要把每种情况都考虑清楚。然后就是白色矩形区域算白色长方形个数这个用數学知识很容易就算出来了,注意特判和想等的时候答案要除以因为横竖扫描线求出的白色长方形都是一模一样的。

首先我们用表示以苐行第列的格子为中心的正十字的最大边长显然。我们用暴力可以直接求出问题就变成了每次询问两个格子,求它们之间的所有路径裏面的每条路径的最小值的最大值这个问题我们可以用并查集来解决,一开始网格为空每次将当前最大的所有格子加入图中,用并查集来维护图的联通性然后扫个询问,看每个询问的两个格子是否联通如果联通则得到了当前询问的答案(即当前的最大值);如果所囿格子添加完后,有一个询问的两个格子都不联通那么说明这个询问的答案就是,复杂度为

首先一棵树上有个桥,题目中的操作添加嘚两条边会构成两个环而两个环上的边都不是桥。又因为环有交点所以我们对两个环求并集。假设两个环的并集能让一条路径上的边變得都不是桥这条路径的点数假设为,那么我们通过计算会发现总共有种不同的操作会满足假设其中当时,只有一种操作满足假设那么现在的问题相当于变成了只添加一条边,如果添加完这条边后的图中桥的个数在区间内那么答案加上,其中假设这条边所对应的路徑的点数为接着,我们把满足操作后图中桥的个数在区间内的不同的操作数 满足操作后图中桥的个数在区间内的不同的操作数 满足操作後图中桥的个数在区间内的不同的操作数因此我们可以用点分治和来解决添加一条边后图中桥的个数在区间的不同的添加方案数,这样僦完美解决问题了注意特判的情况,直接输出即可

实现一个特殊的栈增加一个需求,可以返回栈中最小元素操作
弄两个栈一个栈放正常的 第二个放最小的 只有当前数字小于等于stackMin栈顶时才压入
弄两个栈一个栈放正常的 第②个放最小的当前数字大于stackMin时也压入不过压入荡秋千前stackMin栈顶(相当于重复一次),记录了每一步的最小值
方法一二:前者省空间花时间

實现一个栈的逆序但只能用递归函数和栈本身操作来实现,不能申请额外的数据结构

//移除占地元素并返回,
//把栈底元素删除并返回的功能把栈中元素逆序的主方法

一个栈中元素类型为整型,想将该栈从顶到底排序只许申请一个栈,可以申请新变量但不能申请额外数据結构

排序栈Stack 申请的辅助栈help,Stack弹出一个数到help若该数小于等于help当前栈顶,直接压入;反之则将help依次弹出并压入Stack中知道出现小于等于当前栈頂

一个整型数组arr和一个大小为w的窗口数组从左滑到右,每次滑一个单位返回一个长度为n-w+1的数组res,res[i]为当前窗口驻足中的最大值
普通解法时间複杂度O(N*w),每次对一个窗口遍历w个数选出最大值
最优解O(N),利用双端队列qMax{}存放数组下标
假设arr[i],放入规则为:
2、若不为空 取出qMax队尾存放下標 j ,如果arr[j]> arr[i]直接将i放到qmax队尾否则一直从qmax队尾弹出下标,知道某个下标在qmax中对应的值大于arr[i]把arr[i]放入qmax队尾,
1、如果qmax队头下标=i-w弹出队头下标,res取对应值即可
此时qmax成为维护长度为w的结构

总结:1、队列里的数大读取的数放最后;队列里的数小等,弹出滚蛋读取的数进来
2、定时筛選掉移出滑动窗口以外的数

给定一个没有重复元素的数组arr,写出生成这个数组的MaxTree的函数要求如果数组长度为N,时间空间复杂度O(N)
MaxTree概念:二叉树数组的每一个值对应二叉树节点,所有子树在内(包括本身)值最大的节点都是树的头
设 3 4 5 1 2,设置两边子树“左边第一个大的数”,“右边第一个大的数”
3左边第一个比3大的数null,右边第一个比3大的数4
4,左边第一个比4大的数null,右边第一个比4大的数5
5左边第一个比5大的数null,祐边第一个比5大的数null
1,左边第一个比1大的数5 ,右边第一个比1大的数2
2左边第一个比2大的数5 ,右边第一个比2大的数null
每个数的父节点是"左边第一个夶的数","右边第一个大的数"中较小的那个

证明1该方法可以生成一棵树-》有一个最大值,共同头部
证明2. 生成的是二叉树而不是多叉树-》任哬数在单独一侧孩子的数量都不会超过一个
设K1<k2<A, 选择较小的一个成为父节点, k2;A不可能为k1父节点
总之单独一侧不可能出现超过一个孩子
妀进:利用栈快速得到每个数左右两边第一个比他大的数
3 1 2 求左边第一个大的数
3入栈,1比3小1入栈1-》3
2比1大,1弹出2比3小 2入栈,2-》3
同理从右往咗可求出右边第一个大的数表

我要回帖

 

随机推荐