标题: ABC 368 G - Add and Multiply Queries [打印本页] 作者: 用户云卷云舒 时间: 2024-8-27 05:45 标题: ABC 368 G - Add and Multiply Queries 原题链接:G - Add and Multiply Queries 题意:给出数组a和b,三种操纵,第一种:以 1 i x 的形式给出。用x更换ai。第二种:以 2 i x 的形式给出。用x取代 bi 。第三种:以3 l r的形式给出,初始值为0,从l到r每个位置上可以选择加上a,或者乘上b,输出最大值。 思绪:链表+set+树状数组+二分。标题中给出了答案的范围不会高出1e18,那么就可以知道每次第三种操纵的区间内里b数组大于等于2的数的数目不会大于63个。
因为初始值是0,以是第一次操纵肯定是选择a[l],从l+1开始到b数组内里第一次出现大于等于2的数之间,肯定是之间加上a数组内里的数更加优秀,那么这一段区间的和怎么维护呢?因为操纵一会修改a数组,以是需要可以满足区间查询,单点修改的数据结构,那么就是树状数组。这样操纵一就完成。
考虑如何快速的找到b数组内里大于等于2的数的位置?可以使用链表来维护,链表的寄义是当前位置的b数组值大于等于2的下一个大于等于2的位置,这样的话,就可以先找到[l,r]区间内里第一个大于等于2的位置,然后不断的往反面跳跃,直到大于r。那么怎么快速的找到第一个位置呢?可以想打把每一个节点的位置塞到set内里,然后二分的查找就可以了。这样操纵三就完成了。
对于操纵二来说,因为是用链表来写的,以是如果改变的值大于等于2,那么就把改变的位置加入链表,如果小于2,并且b数组这个位置大于2,那么就把这个节点舍弃。如何快速的找当前点之前的呢,还是在set内里二分。