线段树
nof_uck
人一我十,人百我万
展开
-
牛客小白月赛16 D、小阳买水果 (线段树或前缀和+后缀max)
题意: 水果店里有 nnn 个水果排成一列。店长要求顾客只能买一段连续的水果。 小阳对每个水果都有一个喜爱程度 aia_iai ,最终的满意度为他买到的水果的喜欢程度之和。 如果和为正(不管是正多少,只要大于 0即可),他就满意了。 小阳想知道在他满意的条件下最多能买多少个水果。 你能帮帮他吗? 思路: 维护一个前缀和,对于每个位置,找到在它后面且离他最远的大于它的值(前缀和) O(n)做法 对于找到后面大于它且离他最远的位置,我们可以对求得的前缀和维护一个后缀max,然后每次尽可能往后移动。 #prag原创 2020-07-11 14:20:32 · 230 阅读 · 0 评论 -
牛客小白月赛16 H、小阳的贝壳
对原序列进行差分,得到新的序列。 维护这个序列的最大值,gcd\gcdgcd。 对于区间 [l,r][l,r][l,r]求 gcd\gcdgcd,只需要求 gcd(a[l],gcd(a[l+1],...a[r]))\gcd(a[l],\gcd(a[l+1],...a[r]))gcd(a[l],gcd(a[l+1],...a[r])) 因为 gcd(a,b,c)=gcd(a,b−a,c−a)\gcd(a,b,c) = \gcd(a,b-a,c-a)gcd(a,b,c)=gcd(a,b−a,c−a)原创 2020-07-11 08:37:54 · 147 阅读 · 0 评论 -
牛客练习赛66 E、骚区间
思路: 明显枚举每个端点作为骚区间的左端点,假设我们枚举ai作为左端点,然后在他右边找到第一个小于ai的数的位置x,然后再在x的右边找第一个小于ai的数的位置y,明显以ai为左端点的骚区间只能在[x,y)这个区间中选择右端点,同理也可以枚举每个数作为右端点,然后找他左边第一个第二个大于ai的数x,y,那么以这个数为右端点的骚区间的左端点只能在(x,y]中选择,这样的话问题就化成了枚举每个点作为左端点,然后得到一个区间,在log的时间复杂度的下,求这个区间中的每个数对应的区间中包含左端点的区间个数 最后令点原创 2020-07-07 21:09:57 · 184 阅读 · 0 评论 -
Educational Codeforces Round 88 (Rated for Div. 2) D.Yet Another Yet Another Task
way1(枚举+最大子段和) a[i]a[i]a[i]的范围很小,所以可以从这方面入手,我们可以枚举最大值[0,30][0,30][0,30],然后做一个贪心的最大字段和。 可能有一个疑惑,就是我们怎么确定枚举的最大值一定在这个区间呢 if(a[i]>v||sum<0)sum = 0; 这句a[i]>va[i]>va[i]>v就可以决定这个最大值在这个区间,虽然可能对于当前最大值v,大于这一段的元素(不存在这些元素里),但是最终答案肯定是取的存在的。因为 ans = max(原创 2020-06-10 15:54:30 · 142 阅读 · 0 评论 -
牛客挑战赛39 C牛牛的等差数列
牛牛的等差数列 由于是每个区间都要加上一个等差数列,而又因为等差数列的第iii项可以直接得到 ,等差数列+等差数列依旧是等差数列。 具有可加性,所以可以用线段树来维护,那么我们每个节点维护的的信息有区间和sumsumsum,区间首项ffffff,区间公差dddddd, 最后查询就直接查询sumsumsum,那么我们区间的首项和区间的公差又怎么维护,每个节点都只能维护一段区间,比如下面这种去情况: [L,R][L,R][L,R]是要更新的区间,首项为aaa,公差为ddd,但是在线段树中被分成了3部分,很明显原创 2020-05-16 14:14:06 · 388 阅读 · 1 评论 -
POJ 3368 区间连续个数最多的 (RMQ + 区间线段树 2种做法)
对于某个区间连续个数最多的数,假设这些连续的数都在这个区间,即a[l]!=a[l−1]和a[r]!=a[r+1]a[l]!=a[l-1]和a[r]!=a[r+1]a[l]!=a[l−1]和a[r]!=a[r+1],那么对于区间[l,r][l,r][l,r],可以先预处理出来iii这个位置连续个数numnumnum,然后就可以直接查询这个区间numnumnum的最大值。就可以用数据结构来维护了,区间...原创 2020-04-17 16:06:59 · 236 阅读 · 0 评论