codeforces CF438D The Child and Sequence 线段树
$ \Rightarrow $ 戳我进CF原题
D. The Child and Sequence
time limit per test: 4 seconds memory limit per test: 256 megabytes input: standard input output: standard output
At the children's day, the child came to Picks's house, and messed his house up.
Picks was angry at him. A lot of important things were lost, in particular the favorite sequence of Picks.
Fortunately, Picks remembers how to repair the sequence.
Initially he should create an integer array $ a[1], a[2], ..., a[n] $ .
Then he should perform a sequence of m operations. An operation can be one of the following:
$ 1. $ Print operation $ l, r $ . Picks should write down the value of $ \sum_{i=l}^r a[i] $ .
$ 2. $ Modulo operation $ l, r, x $ . Picks should perform assignment $ a[i] = a[i] \quad mod \quad x $ for each $ i (l ≤ i ≤ r) $ .
$ 3. $ Set operation $ k, x $ . Picks should set the value of $ a[k] $ to $ x $ (in other words perform an assignment $ a[k] = x $ ).
Can you help Picks to perform the whole sequence of operations?
Input
The first line of input contains two integer: $ n, m (1 ≤ n, m ≤ 10^5) $ .
The second line contains n integers, separated by space: $ a[1], a[2], ..., a[n] (1 ≤ a[i] ≤ 10^9) $ — initial value of array elements.
Each of the next $ m $ lines begins with a number $ type (type \in (1,2,3) ) $ .
- If $ type = 1 $ , there will be two integers more in the line: $ l, r (1 ≤ l ≤ r ≤ n) $ , which correspond the operation 1.
- If $ type = 2 $ , there will be three integers more in the line: $ l, r, x (1 ≤ l ≤ r ≤ n; 1 ≤ x ≤ 10^9) $ , which correspond the operation 2.
- If $ type = 3 $ , there will be two integers more in the line: $ k, x (1 ≤ k ≤ n; 1 ≤ x ≤ 10^9) $ , which correspond the operation 3.
Output
For each operation 1, please print a line containing the answer. Notice that the answer may exceed the 32-bit integer.
Examples
input1
5 51 2 3 4 52 3 5 43 3 51 2 52 1 3 31 1 3
output1
85
input2
10 106 9 6 7 6 1 10 10 9 51 3 92 7 10 92 5 10 81 4 73 3 72 7 9 91 2 41 6 61 5 93 1 10
output2
49152319
Note
Consider the first testcase:
- At first, $ a = (1, 2, 3, 4, 5) $ .
- After operation 1, $ a = (1, 2, 3, 0, 1) $ .
- After operation 2, $ a = (1, 2, 5, 0, 1) $ .
- At operation 3, $ 2 + 5 + 0 + 1 = 8 $ .
- After operation 4, $ a = (1, 2, 2, 0, 1) $ .
- At operation 5, $ 1 + 2 + 2 = 5 $ .
题目大意
给出一个序列,进行如下三种操作:
区间求和
区间每个数
膜模 $ x $单点修改
$ n,m \le 100000 $
思路
如果没有第二个操作的话,就是一棵简单的线段树。那么如何处理这个第二个操作呢?
对于一个数 $ a $ ,如果模数 $ x>a $ ,则这次取模是没有意义的,直接跳过;
如果 $ x>a/2 $ 则取模结果小于 $ a/2 $ ;如果 $ x<a/2 $ ,取模结果小于 $ x $,则也小于 $ a/2 $所以对于一个数,最多只会做 $ log_a $ 次取模操作。这是可以接受的!
对于一个区间,维护最大值,如果模数 $ x> $ 最大值,直接跳过即可。否则继续往下像单点修改一样。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define int long long
#define N 100005
int n,m,sum[N<<2],smx[N<<2];
void build(int o,int l,int r){if(l==r){scanf("%lld",&sum[o]);smx[o]=sum[o];return;}int mid=l+r>>1;build(o<<1,l,mid); build(o<<1|1,mid+1,r);sum[o]=sum[o<<1]+sum[o<<1|1];smx[o]=max(smx[o<<1],smx[o<<1|1]);
}
void updata(int o,int l,int r,int pos,int val){if(l==r){sum[o]=smx[o]=val;return;}int mid=l+r>>1;if(pos<=mid) updata(o<<1,l,mid,pos,val);else updata(o<<1|1,mid+1,r,pos,val);sum[o]=sum[o<<1]+sum[o<<1|1];smx[o]=max(smx[o<<1],smx[o<<1|1]);
}
void modtify(int o,int l,int r,int L,int R,int k){if(smx[o]<k) return;if(l==r){sum[o]%=k;smx[o]=sum[o];return;}int mid=l+r>>1;if(L>mid) modtify(o<<1|1,mid+1,r,L,R,k);else if(R<=mid) modtify(o<<1,l,mid,L,R,k);else{modtify(o<<1,l,mid,L,R,k);modtify(o<<1|1,mid+1,r,L,R,k);}sum[o]=sum[o<<1]+sum[o<<1|1];smx[o]=max(smx[o<<1],smx[o<<1|1]);
}
int query(int o,int l,int r,int L,int R){if(L<=l&&r<=R) return sum[o];int mid=l+r>>1;if(L>mid) return query(o<<1|1,mid+1,r,L,R);else if(R<=mid) return query(o<<1,l,mid,L,R);else return query(o<<1,l,mid,L,R)+query(o<<1|1,mid+1,r,L,R);
}
signed main(){scanf("%lld %lld",&n,&m);build(1,1,n);while(m--){int opt,x,y;scanf("%lld %lld %lld",&opt,&x,&y);if(opt==1) printf("%lld\n",query(1,1,n,x,y));else if(opt==2){int k;scanf("%lld",&k);modtify(1,1,n,x,y,k);} else updata(1,1,n,x,y);}return 0;
}
/*
# 42611024
When 2018-09-07 14:02:33
Who PotremZ
Problem D - The Child and Sequence
Lang GNU C++11
Verdict Accepted
Time 826 ms
Memory 6300 KB
*/
转载于:https://www.cnblogs.com/PotremZ/p/CF438D.html
codeforces CF438D The Child and Sequence 线段树相关推荐
- 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 438D The Child and Sequence
题目链接:http://codeforces.com/problemset/problem/438/D The Child and Sequence time limit per test:4 sec ...
- Codeforces 1004F Sonya and Bitwise OR (线段树)
题目链接 https://codeforces.com/contest/1004/problem/F 题解 这种水题都不会做了怎么.. 考虑一个序列的前缀 \(\text{or}\) 值只会变化 \( ...
- CodeForces - 1529E Trees of Tranquillity(贪心+线段树)
题目链接:https://vjudge.net/problem/CodeForces-1529E 题目大意:给出两棵根节点为 111 的树,分别称为 AAA 树和 BBB 树,现在通过两棵树可以构造出 ...
- Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)
题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...
- CodeForces - 272C Dima and Staircase (线段树区间更新)
题意: 见以下样例,给出 5 个区间,每个区间的高度已知.一共 4 次操作.每次操作都是从最左边开始向下垒一个宽为 w 高为h 的木块,过程见下图. 问每次垒木块的高度是多少? Input 5 1 2 ...
- [codeforces] 383C Propagating tree(dfs序+线段树)
题意: 给你一棵n个结点的树, 以1为根.每个结点有点权.有m次操作: 1.x结点权值 +val,x的儿子权值 −val,x的孙子们 +val,以此类推. 2.询问x的点权: 题解: 我们首先跑一边d ...
- CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)
题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1xy1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间 ...
最新文章
- 相同命名空间相同类名的程序集间引发的致命错误
- png图片压缩原理解析
- nginx随机变换图片服务器网址来防止盗链
- boost::geometry::dsv用法的测试程序
- tkinter 菜单添加事件_Python+tkinter设置Label字体、字号、样式、对齐方式、鼠标形状、响应鼠标事件...
- QuickSkin简单学习--控制结构
- 基于gulp编写的一个简单实用的前端开发环境
- mysql 恢复空密码_mysql 找回密码
- Zoho:尽快修复已遭利用的 ManageEngine 严重漏洞
- DOM-window下的常用子对象-location-刷新页面
- 前端----表格的具体使用(jquery)
- JMeter 学习笔记从不懂慢慢提升(01)
- MybatisCodeHelperPro的使用
- Python使用pyserial实现串口收发
- 因为涉嫌歧视女性被开除的那位工程师到底在备忘录上写了什么?
- HTML用css把英文字母改大,CSS转换英文大小写text-transform属性
- 电主轴编码器测试工具VS sensorikHCU500/DCMU-BOX,海德汉PWM21/PWT101,LENORD+BAUER(L+B)211BSO/211CS04E2M使用对比
- Edge的新标签页设置
- 微信5 不能点开朋友圈的链接-思科路由器
- 新零售如何做到线上线下相结合?
热门文章
- php检测数组类型,javascript中通过哪些方法来检测数组类型?
- jmeter找不到java.dll_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...
- php yii2 获取表里最大的id_Yii2中自带分页类实现分页
- python逆向什么意思_如何理解python逆向切片
- mysql 排序去重复_php mysql 过滤重复记录并排序
- git安装后找不见版本_无法安装最新版本的Gitlab
- python中面向对象空间时间_python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)...
- 160 - 4 ajj.1
- CMake学习使用(基于vscode)
- 单调栈 leetcode整理(三)