线段树
&*^*&
这个作者很懒,什么都没留下…
展开
-
acm-(主席树)Codeforces Round #668 (Div. 1) C. Fixed Point Removal
传送门首先假设前iii个数有fif_ifi个可以被删除,那么fi=fi−1+[i−ai≥0 or fi≥i−ai]f_{i}=f_{i-1}+[i-a_i\ge 0\,or\,f_i\ge i-a_i]fi=fi−1+[i−ai≥0orfi≥i−ai]。证明:我们可以先删除前i−1i-1i−1个数中的i−aii-a_ii−ai个可删的数,此时刚好可以把aia_iai删除,于是把aia_iai删除以后再去删除前面剩下的可删除的数即可。设最多长度为lim[i]lim[i]lim[i]的.原创 2020-12-03 00:28:16 · 145 阅读 · 0 评论 -
acm-(线段树、栈、思维)Codeforces Raif Round 1 (Div. 1 + Div. 2) F. Fruit Sequences
传送门本题有至少三种方法可以做。方法一:考虑对每个连续的111段求解贡献,首先是整体的贡献,此时我们可以分别向左和向右延伸,得到延伸最远的lll和rrr,注意到如果多个连续111段长度相同的,我们把贡献计算在最左边的段上,故延伸到最远的lll必须满足长度小于当前段,最远的rrr则满足小于等于当前段,对于000段需要特殊判断。然后是当部分贡献,此时我们固定左端点或者右端点然后让另一个端点向对应的方向延伸,类似地讨论来得出当前段的部分的贡献,固定的端点不位于边界上。具体代码实现的时候需要用线段树来查找.原创 2020-11-25 09:27:59 · 105 阅读 · 0 评论 -
acm-(哈希、线段树)2020 China Collegiate Programming Contest, Weihai Site G.Caesar Cipher
传送门本题让对字符串进行区间加操作,然后随机询问两个子串是否相同。如果是普通的区间加操作,我们直接用线段树维护每个节点的哈希值即可,子串哈希值可以直接查询区间哈希值然后再除以基数的幂次获得。不过本题中区间加需要对655366553665536取模,不过我们可以再每次区间加后通过线段树找到所有刚好等于655366553665536的点,然后将它的值变成0即可,这样修改的次数其实不会很多,由于每655366553665536次区间加操作最多导致655366553665536次取模操作,故实际上均摊下来每次.原创 2020-11-24 18:20:52 · 212 阅读 · 0 评论 -
acm-(线段树、mex)Codeforces Round #678 (Div. 2) E. Complicated Computations
传送门本题不好直接求每个子串的mexmexmex,转化一下思路,对于iii而言,我们不妨检查是否存在一个子串使得mex=imex=imex=i。现在讨论满足怎样条件的一个子串s[l∼r]s[l\sim r]s[l∼r]的mex=imex=imex=i:s[l∼r]≠is[l\sim r]\ne is[l∼r]=i1,2,...,i−1∈s[l∼r]1,2,...,i-1\in s[l\sim r]1,2,...,i−1∈s[l∼r]于是我们遍历sss数组,以当前位置r+1r+1r+1减去.原创 2020-11-23 07:07:02 · 478 阅读 · 0 评论 -
acm-(线段树、max维护、结论)Codeforces Round #684 (Div. 2) E. Greedy Shopping
传送门本题需要知道一个结论,就是操作二找值的时候其实最多只会跳O(log(n))O(log(n))O(log(n))段,这样的话我们可以用线段树去二分查找那些符合条件的段。具体来说,对于操作一,我们每次找到恰好满足小于yyy的一个点iii,然后修改i∼xi\sim xi∼x段的值为yyy,线段树打懒标记的操作不多说了。对于操作二,我们用whilewhilewhile处理,假设现在位于curcurcur位置,每次都线段树二分找到前缀和小于等于y+sum[1∼cur−1]y+sum[1\sim cur-.原创 2020-11-19 16:54:02 · 127 阅读 · 0 评论 -
acm-(线段树)2020ICPC·小米 网络选拔赛第二场 C.Data Structure Problem
传送门首先cx=max0≤i≤x{a[i]+sum[x]−sum[i]}=sum[x]+max0≤i≤x{a[i]−sum[i]}c_x=max_{0\le i\le x}\{a[i]+sum[x]-sum[i]\}=sum[x]+max_{0\le i\le x}\{a[i]-sum[i]\}cx=max0≤i≤x{a[i]+sum[x]−sum[i]}=sum[x]+max0≤i≤x{a[i]−sum[i]},于是用线段树考虑维护a[i]−sum[i]a[i]-sum[i]a[i]−sum[i.原创 2020-11-01 08:00:14 · 184 阅读 · 0 评论 -
acm-(线段树、区间最大最小)2020ICPC·小米 网络选拔赛第一场 E.Phone Network
传送门题意简单来说就是给你一个数组aaa长度为nnn,元素取值从1∼m1\sim m1∼m,保证1∼m1\sim m1∼m都会出现在数组aaa中至少一次,然后问你包含1∼i1\sim i1∼i所有元素的最小区间长度,对于iii从111到mmm都要求一个最小区间长度出来。对于求区间长度的问题,一般是固定左端点或右端点,然后让另一个端点与当前端点距离最小。这里我们固定左端点,也就是对数组中每个位置iii维护一个右端点值t[i]t[i]t[i]使得区间[i,t[i]][i,t[i]][i,t[i]]中包含1.原创 2020-10-28 09:31:27 · 173 阅读 · 0 评论