首页 > TAG信息列表 > CF438D
洛谷 CF438D The Child and Sequence(线段树)
传送门 解题思路 直接用线段树维护取模是不好维护的。 而且我们发现一个数x最多取模logx次(每次大小减半),所以可以暴力取模。 维护的信息除了区间和,还有区间最大值,因为当区间最大值<模数时,此操作是无效的。 AC代码 #include<iostream> #include<cstdio> #include<cstring> #includeCF438D The Child and Sequence(线段树区间取模)
思路 维护区间的最大值,取模的时候如果最大值小于模数就跳过此区间;否则,对每个点暴力修改。由于每次取模后 \(x \bmod p<2/x\),所以每个点最多被修改\(logx\)次。 代码 // Problem: D. The Child and Sequence // Contest: Codeforces - Codeforces Round #250 (Div. 1) // URL: httpCF438D The Child and Sequence 线段树水题
CF438D The Child and Sequence 线段树水题 链接 取模操作只需要暴力做就可以。我们只需要维护其最大值然后判断模数是否大于最大值,如果大于,那么就不用取模了,否则直接往下做。注意到每一个数最多被取模 \(\log\) 次,复杂度最多不超过 \(n\log^210^9\) 要注意不加 pushup 尽量不要加[CF438D] The Child and Sequence - 线段树
[CF438D] The Child and Sequence - 线段树 Description 给定数列,查询区间和,区间取模,单点修改。 Solution 线段树,记录区间最大值,如果大于要取模的数就把修改暴力递归下去。 #include <bits/stdc++.h> using namespace std; #define int long long struct SegmentTree { strucCF438D The Child and Sequence
CF438D The Child and Sequence 题意:给定一个序列,支持三种操作; 1,单点修改 2,区间查询 3,区间取模 难点在于区间取模,思考使一个数取模变为1时间复杂度是log的,因此记录一个最大值,当模数<=最大值时,暴力取模; #include<iostream> #include<cstdio> #define l(o) (o<<1) #define r(o) ((o<线段树+由%加快(CF438D The Child and Sequence
https://www.luogu.org/problem/CF438D 题意 给定数列,区间查询和,区间取模,单点修改。 n,m小于10^5 分析 和花神那题一样,i%k运算可以考虑, i < k时, i不变,所以我们可以维护区间最大值,在给区间[l,r]中的每个元素%k的时候,只要max < k, 就直接return, 由此提速 (提醒: 千万不要用前一题(指花神)[CF438D]The Child and Sequence【线段树】
题目大意 区间取模,区间求和,单点修改。 分析 其实算是一道蛮简单的水题。 首先线段树非常好解决后两个操作,重点在于如何解决区间取模的操作。 一开始想到的是暴力单点修改,但是复杂度就飙到了\(mnlogn\),直接爆炸。 但是重新看到了题目中给出的4s的操作,说明,我们可以优化单点修改的操作