Codeforces 438D The Child and Sequence

给出一个序列,进行如下三种操作:

  1. 区间求和
  2. 区间每个数模x
  3. 单点修改

如果没有第二个操作的话,就是一棵简单的线段树。那么如何处理这个第二个操作呢?

对于一个数a,如果模数 x > a ,则这次取模是没有意义的,直接跳过;

如果 x > a/2 ,则取模结果小于 a / 2; 如果 x < a / 2,取模结果小于x,则也小于 a / 2。

所以对于一个数,最多只会做log a次取模操作。这是可以接受的!

对于一个区间,维护最大值,如果模数x > 最大值,直接跳过即可。

否则继续往下像单点修改一样。

时间复杂度不会超过 \(O(n \log ^2 n)\) ……吧。

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
#define INF 0x3f3f3f3f
#define space putchar(' ')
#define enter putchar('\n')
template <class T>
bool read(T &x){
char c;
bool op = 0;
while(c = getchar(), c < '0' || c > '9')
if(c == '-') op = 1;
else if(c == EOF) return 0;
x = c - '0';
while(c = getchar(), c >= '0' && c <= '9')
x = x * 10 + c - '0';
if(op) x = -x;
return 1;
}
template <class T>
void write(T x){
if(x < 0) putchar('-'), x = -x;
if(x >= 10) write(x / 10);
putchar('0' + x % 10);
} const int N = 100005;
int n, m, a[N], ma[4*N];
ll sum[4*N]; void build(int k, int l, int r){
if(l == r) return (void) (ma[k] = sum[k] = a[l]);
int mid = (l + r) >> 1;
build(k << 1, l, mid);
build(k << 1 | 1, mid + 1, r);
ma[k] = max(ma[k << 1], ma[k << 1 | 1]);
sum[k] = sum[k << 1] + sum[k << 1 | 1];
}
void change(int k, int l, int r, int p, int x){
if(l == r) return (void) (ma[k] = sum[k] = x);
int mid = (l + r) >> 1;
if(p <= mid) change(k << 1, l, mid, p, x);
else change(k << 1 | 1, mid + 1, r, p, x);
ma[k] = max(ma[k << 1], ma[k << 1 | 1]);
sum[k] = sum[k << 1] + sum[k << 1 | 1];
}
void mo(int k, int l, int r, int ql, int qr, int x){
if(ma[k] < x) return;
if(l == r) return (void) (ma[k] %= x, sum[k] %= x);
int mid = (l + r) >> 1;
if(ql <= mid) mo(k << 1, l, mid, ql, qr, x);
if(qr > mid) mo(k << 1 | 1, mid + 1, r, ql, qr, x);
ma[k] = max(ma[k << 1], ma[k << 1 | 1]);
sum[k] = sum[k << 1] + sum[k << 1 | 1];
}
ll query(int k, int l, int r, int ql, int qr){
if(ql <= l && qr >= r) return sum[k];
int mid = (l + r) >> 1;
ll ret = 0;
if(ql <= mid) ret += query(k << 1, l, mid, ql, qr);
if(qr > mid) ret += query(k << 1 | 1, mid + 1, r, ql, qr);
return ret;
} int main(){
read(n), read(m);
for(int i = 1; i <= n; i++) read(a[i]);
build(1, 1, n);
int op, l, r, x;
for(int i = 1; i <= m; i++){
read(op);
if(op == 1){
read(l), read(r);
write(query(1, 1, n, l, r)), enter;
}
else if(op == 2){
read(l), read(r), read(x);
mo(1, 1, n, l, r, x);
}
else{
read(l), read(x);
change(1, 1, n, l, x);
}
}
return 0;
}

Codeforces 438D (今日gg模拟第二题) | 线段树 考察时间复杂度的计算 -_-|||的更多相关文章

  1. 51nod 1563 坐标轴上的最大团(今日gg模拟第一题) | 线段覆盖 贪心 思维题

    51nod 1563 坐标轴上的最大团 坐标轴上有n个点,每个点有一个权值.第i个点的坐标是 xi ,权值是 wi .现在对这些点建图.对于点对 (i,j) ,如果 |xi−xj|≥wi+wj ,那么 ...

  2. 2018.07.23 codeforces 438D. The Child and Sequence(线段树)

    传送门 线段树维护区间取模,单点修改,区间求和. 这题老套路了,对一个数来说,每次取模至少让它减少一半,这样每次单点修改对时间复杂度的贡献就是一个log" role="presen ...

  3. 【bzoj3638】Cf172 k-Maximum Subsequence Sum 模拟费用流+线段树区间合并

    题目描述 给一列数,要求支持操作: 1.修改某个数的值 2.读入l,r,k,询问在[l,r]内选不相交的不超过k个子段,最大的和是多少. 输入 The first line contains inte ...

  4. 「CQOI2006」简单题 线段树

    「CQOI2006」简单题 线段树 水.区间修改,单点查询.用线段树维护区间\([L,R]\)内的所有\(1\)的个数,懒标记表示为当前区间是否需要反转(相对于区间当前状态),下方标记时懒标记取反即可 ...

  5. hdu 5475 模拟计算器乘除 (2015上海网赛H题 线段树)

    给出有多少次操作 和MOD 初始值为1 操作1 y 表示乘上y操作2 y 表示除以第 y次操作乘的那个数 线段树的叶子结点i 表示 第i次操作乘的数 将1替换成y遇到操作2 就把第i个结点的值 替换成 ...

  6. MAZE(2019年牛客多校第二场E题+线段树+矩阵乘法)

    题目链接 传送门 题意 在一张\(n\times m\)的矩阵里面,你每次可以往左右和下三个方向移动(不能回到上一次所在的格子),\(1\)表示这个位置是墙,\(0\)为空地. 现在有\(q\)次操作 ...

  7. Codeforces 1368H - Breadboard Capacity(最小割+线段树维护矩阵乘法)

    Easy version:Codeforces 题面传送门 & 洛谷题面传送门 Hard version:Codeforces 题面传送门 & 洛谷题面传送门 首先看到这种从某一种颜色 ...

  8. codeforces 876 D. Sorting the Coins(线段树(不用线段树写也行线段树写比较装逼))

    题目链接:http://codeforces.com/contest/876/problem/D 题解:一道简单的类似模拟的题目.其实就是看右边连出来有多少连续不需要换的假设位置为pos只要找pos- ...

  9. Codeforces 407E - k-d-sequence(单调栈+扫描线+线段树)

    Codeforces 题面传送门 & 洛谷题面传送门 深感自己线段树学得不扎实-- 首先特判掉 \(d=0\) 的情况,显然这种情况下满足条件的区间 \([l,r]\) 中的数必须相同,双针扫 ...

随机推荐

  1. python迭代器的内置函数

    1.迭代器: 内置函数: (1)iter() -__iter__() (2)next() -__next__() 2.迭代器的举例; 对于Fibs数列,我们对其进行 限量输出: 实现代码如下: cla ...

  2. lua中table的常用方法

    转载:https://blog.csdn.net/Fenglele_Fans/article/details/83627021 1:table.sort() language = {"lua ...

  3. Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 之一

    Deep learning for visual understanding: A review 视觉理解中的深度学习:回顾 ABSTRACT: Deep learning algorithms ar ...

  4. golang slice使用不慎导致的问题

    原文链接 : http://www.bugclosed.com/post/16 背景 go语言中切片slice是方便且好用的强大数据结构,但是使用的时候需要注意,不然容易出问题,最近因为遇到了一个sl ...

  5. Django之Form

    目录 一.说明 二.参数说明 三.自定义验证规则 四.实例 一.说明 Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数 ...

  6. react + antiDesign开发中遇到的问题记录

    react + antiDesign开发中遇到的问题记录 一:页面中子路由失效: antiDesign的官方实例中,会把路由重复的地方给去重,而且路由匹配模式不是严格模式.所以我们需要在util.js ...

  7. linux后退文件夹命令

    后退文件夹: cd -  在重复一遍就是前进了

  8. centos下配置gitosis服务器遇到的困难

    这篇博客主要讲的是在centos下配置gitosis遇到的问题. 背景:centos7.2 64 :gitosis2.0 1.困难1 1)产生的问题及原因.gitosis没有安装成功,没有出现fini ...

  9. [东北师大软工]Week2-作业2:个人项目实战 初步测试结果

    作业地址 https://edu.cnblogs.com/campus/nenu/2016SE_NENU/homework/1656 测试须知 测试机为Windows环境,所有提交到Coding.ne ...

  10. 冲刺One之站立会议2

    在确定了总体目标之后,我们先决定了实现的具体功能,包括一个登陆界面,一个聊天室的主界面和服务器端的内容.我们今天完成了一小部分内容,把每个内容的主体框架搭建了起来. 效果如下图所示: 燃尽图2