$ \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 线段树相关推荐

  1. 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 ...

  2. 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 ...

  3. CodeForces 438D The Child and Sequence

    题目链接:http://codeforces.com/problemset/problem/438/D The Child and Sequence time limit per test:4 sec ...

  4. Codeforces 1004F Sonya and Bitwise OR (线段树)

    题目链接 https://codeforces.com/contest/1004/problem/F 题解 这种水题都不会做了怎么.. 考虑一个序列的前缀 \(\text{or}\) 值只会变化 \( ...

  5. CodeForces - 1529E Trees of Tranquillity(贪心+线段树)

    题目链接:https://vjudge.net/problem/CodeForces-1529E 题目大意:给出两棵根节点为 111 的树,分别称为 AAA 树和 BBB 树,现在通过两棵树可以构造出 ...

  6. Codeforces 1045. A. Last chance(网络流 + 线段树优化建边)

    题意 给你 \(n\) 个武器,\(m\) 个敌人,问你最多消灭多少个敌人,并输出方案. 总共有三种武器. SQL 火箭 - 能消灭给你集合中的一个敌人 \(\sum |S| \le 100000\) ...

  7. CodeForces - 272C Dima and Staircase (线段树区间更新)

    题意: 见以下样例,给出 5 个区间,每个区间的高度已知.一共 4 次操作.每次操作都是从最左边开始向下垒一个宽为 w 高为h 的木块,过程见下图. 问每次垒木块的高度是多少? Input 5 1 2 ...

  8. [codeforces] 383C Propagating tree(dfs序+线段树)

    题意: 给你一棵n个结点的树, 以1为根.每个结点有点权.有m次操作: 1.x结点权值 +val,x的儿子权值 −val,x的孙子们 +val,以此类推. 2.询问x的点权: 题解: 我们首先跑一边d ...

  9. CodeForces - 1217F Forced Online Queries Problem(线段树分治+并查集撤销)

    题目链接:点击查看 题目大意:给出 nnn 个点,初始时互相不存在连边,需要执行 mmm 次操作,每次操作分为两种类型: 1xy1 \ x \ y1 x y:如果 (x,y)(x,y)(x,y) 之间 ...

最新文章

  1. 相同命名空间相同类名的程序集间引发的致命错误
  2. png图片压缩原理解析
  3. nginx随机变换图片服务器网址来防止盗链
  4. boost::geometry::dsv用法的测试程序
  5. tkinter 菜单添加事件_Python+tkinter设置Label字体、字号、样式、对齐方式、鼠标形状、响应鼠标事件...
  6. QuickSkin简单学习--控制结构
  7. 基于gulp编写的一个简单实用的前端开发环境
  8. mysql 恢复空密码_mysql 找回密码
  9. Zoho:尽快修复已遭利用的 ManageEngine 严重漏洞
  10. DOM-window下的常用子对象-location-刷新页面
  11. 前端----表格的具体使用(jquery)
  12. JMeter 学习笔记从不懂慢慢提升(01)
  13. MybatisCodeHelperPro的使用
  14. Python使用pyserial实现串口收发
  15. 因为涉嫌歧视女性被开除的那位工程师到底在备忘录上写了什么?
  16. HTML用css把英文字母改大,CSS转换英文大小写text-transform属性
  17. 电主轴编码器测试工具VS sensorikHCU500/DCMU-BOX,海德汉PWM21/PWT101,LENORD+BAUER(L+B)211BSO/211CS04E2M使用对比
  18. Edge的新标签页设置
  19. 微信5 不能点开朋友圈的链接-思科路由器
  20. 新零售如何做到线上线下相结合?

热门文章

  1. php检测数组类型,javascript中通过哪些方法来检测数组类型?
  2. jmeter找不到java.dll_Windows下Jmeter安装出现Not able to find Java executable or version问题解决方案...
  3. php yii2 获取表里最大的id_Yii2中自带分页类实现分页
  4. python逆向什么意思_如何理解python逆向切片
  5. mysql 排序去重复_php mysql 过滤重复记录并排序
  6. git安装后找不见版本_无法安装最新版本的Gitlab
  7. python中面向对象空间时间_python基础学习Day15 面向对象、类名称空间、对象名称空间 (2)...
  8. 160 - 4 ajj.1
  9. CMake学习使用(基于vscode)
  10. 单调栈 leetcode整理(三)