[CF438D]The Child and Sequence【线段树】
题目大意
区间取模,区间求和,单点修改。
分析
其实算是一道蛮简单的水题。
首先线段树非常好解决后两个操作,重点在于如何解决区间取模的操作。
一开始想到的是暴力单点修改,但是复杂度就飙到了\(mnlogn\),直接爆炸。
但是重新看到了题目中给出的4s的操作,说明,我们可以优化单点修改的操作。
那么我们顺便维护一下区间的最大值,如果当前的区间的最大值是小于mod数的,那么这个区间内的所有数都是没有必要mod的。
后面随着数据的越来越大,那么就可以剪去不必要的操作。
代码
#include <bits/stdc++.h>
#define ll long long
#define N 100005
using namespace std;
struct segment_tree {
#define lc (nod << 1)
#define rc (nod << 1 | 1)
#define mid ((l + r) >> 1)
struct node {
ll s;
int l, r, mx;
node() {
mx = s = 0;
}
}tr[N << 2];
void pushup(int nod) {
tr[nod].s = tr[lc].s + tr[rc].s;
tr[nod].mx = max(tr[lc].mx, tr[rc].mx);
}
void build(int l, int r, int nod, int *a) {
tr[nod].l = l, tr[nod].r = r;
if (l == r) {
tr[nod].mx = tr[nod].s = a[l];
return;
}
build(l, mid, lc, a);
build(mid + 1, r, rc, a);
pushup(nod);
}
ll query_sec_sum(int nod, int ql, int qr) {
ll res = 0;
int l = tr[nod].l, r = tr[nod].r;
if (ql <= l && r <= qr) return tr[nod].s;
if (ql <= mid) res += query_sec_sum(lc, ql, qr);
if (qr > mid) res += query_sec_sum(rc, ql, qr);
return res;
}
void update_point(int nod, int k, int val) {
int l = tr[nod].l, r = tr[nod].r;
if (l == r) {
tr[nod].mx = tr[nod].s = val;
return;
}
if (k <= mid) update_point(lc, k, val);
else update_point(rc, k, val);
pushup(nod);
}
void update_sec_mod(int nod, int ql, int qr, int p) {
int l = tr[nod].l, r = tr[nod].r;
if (tr[nod].mx < p) return;
if (l == r) {
tr[nod].s %= p;
tr[nod].mx %= p;
return;
}
if (ql <= mid) update_sec_mod(lc, ql, qr, p);
if (qr > mid) update_sec_mod(rc, ql, qr, p);
pushup(nod);
}
}tr;
int a[N];
int main() {
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1; i <= n; i ++) scanf("%d", &a[i]);
tr.build(1, n, 1, a);
while(m --) {
int opt, x, y, z;
scanf("%d", &opt);
if (opt == 1) {
scanf("%d%d", &x, &y);
printf("%lld\n", tr.query_sec_sum(1, x, y));
}
if (opt == 2) {
scanf("%d%d%d", &x, &y, &z);
tr.update_sec_mod(1, x, y, z);
}
if (opt == 3) {
scanf("%d%d", &x, &z);
tr.update_point(1, x, z);
}
}
return 0;
}
[CF438D]The Child and Sequence【线段树】的更多相关文章
- CF438D The Child and Sequence 线段树
给定数列,区间查询和,区间取模,单点修改. n,m小于10^5 ...当区间最值小于模数时,就直接返回就好啦~ #include<cstdio> #include<iostream& ...
- Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间取摸
D. The Child and Sequence Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/contest ...
- Codeforces 438D The Child and Sequence - 线段树
At the children's day, the child came to Picks's house, and messed his house up. Picks was angry at ...
- Codeforces Round #250 (Div. 1) D. The Child and Sequence 线段树 区间求和+点修改+区间取模
D. The Child and Sequence At the children's day, the child came to Picks's house, and messed his h ...
- cf250D. The Child and Sequence(线段树 均摊复杂度)
题意 题目链接 单点修改,区间mod,区间和 Sol 如果x > mod ,那么 x % mod < x / 2 证明: 即得易见平凡, 仿照上例显然, 留作习题答案略, 读者自证不难. ...
- CF(438D) The Child and Sequence(线段树)
题意:对数列有三种操作: Print operation l, r. Picks should write down the value of . Modulo operation l, r, x. ...
- CodeForces 438D The Child and Sequence (线段树 暴力)
传送门 题目大意: 给你一个序列,要求在序列上维护三个操作: 1)区间求和 2)区间取模 3)单点修改 这里的操作二很讨厌,取模必须模到叶子节点上,否则跑出来肯定是错的.没有操作二就是线段树水题了. ...
- Codeforces Round #250 (Div. 1) D. The Child and Sequence (线段树)
题目链接:http://codeforces.com/problemset/problem/438/D 给你n个数,m个操作,1操作是查询l到r之间的和,2操作是将l到r之间大于等于x的数xor于x, ...
- 2016暑假多校联合---Rikka with Sequence (线段树)
2016暑假多校联合---Rikka with Sequence (线段树) Problem Description As we know, Rikka is poor at math. Yuta i ...
随机推荐
- No enclosing instance of type is accessible. Must qualify the allocation with an enclosing instance of type LeadRestControllerTest (e.g. x.new A() where x is an instance of ).
java - No enclosing instance is accessible. Must qualify the allocation with an enclosing instance o ...
- PHP之常用设计模式
在日常开放中,经常会用到一些设计模式,进行我们代码的优化处理,一个很好的设计思想 1) 工厂模式 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创建的对象 ...
- PHP中友好的处理方式
在使用PHP进行开发的时候,由于PHP是弱类型语言的特性,所以,偶尔会遇到一些意想不到的错误.规范我们的编程就变得尤为重要了.下面总结一下,我日常开发中的一些经验,可能有些地方不妥,还请多多斧正,指教 ...
- Jmeter之Constant Timer与constant throughput timer的区别(转)
当放置Constant Timer于两个http请求之间,那么它代表的含义是:在上一个请求发出至完成后, 开始Contant Timer指定的时间,最后再发出第二个请求.它并不是代表两个请求之间的发送 ...
- IdentityServer4【Topic】之登陆注册
Sign-in 登陆注册 为了让标识服务器(identity server)代表用户发出令牌,该用户必须登录到标识服务器. Cookie authentication Cookie认证 身份验证是由来 ...
- GRASP软件设计的模式和原则
GRASP 模式:每一个模式描述了一个在我们周围不断重复发生的问题,以及该问题的解决方案的核心.”这是关于模式最经典的定义,作者是建筑大师Christopher Alexander.如果是第一次看到这 ...
- Oracle条件判断if...elsif
- C#读书笔记:线程,任务和同步
前言 学习C#两个多月了,像当初实习做PHP开发一样,也是由着一个个Feature需求,慢慢掌握了很多相关的编程技巧.本次主要记录下学习C# 多线程的相关知识. 参考书籍:<Csharp高级编程 ...
- 关于 html input标签的几个常用操作
1.清除 input 标签默认样式 input { -moz-appearance: none; outline: 0; text-decoration: none; outline: none; b ...
- Django的模板层
一 模版简介 你可能已经注意到我们在例子视图中返回文本的方式有点特别. 也就是说,HTML被直接硬编码在 Python代码之中. def current_datetime(request): now ...