CF438D The Child and Sequence(线段树)
题目大意:维护一个长度为 $n$ 的正整数序列 $a$,支持单点修改,区间取模,区间求和。共 $m$ 个操作。
$1\le n,m\le 10^5$。其它数均为非负整数且 $\le 10^9$。
居然被这道水题卡了那么久……
主要难点就是取模操作。
我们发现一个数 $x$ 模 $i(1\le i\le x)$:
$i\le\lfloor\frac{x}{2}\rfloor$ 时:余数小于除数,所以答案小于 $\lfloor\frac{x}{2}\rfloor$。
$i>\lfloor\frac{x}{2}\rfloor$ 时:答案就是 $x-i$,也小于 $\lfloor\frac{x}{2}\rfloor$。
所以 $x$ 每次被取模都至少减小一半。
那……就是暴力线段树!
线段树再维护一个区间最大值,当模数大于区间最大值时,直接走人。
容易发现如果没有单点修改操作,一个叶子节点最多被暴力到 $\log a_i$ 次。
有单点修改操作?那又怎样?一共只会多 $m$ 个数而已啊!
时间复杂度 $O((n+m)\log n\log a_i)$。
代码:
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=;
#define lson o<<1,l,mid
#define rson o<<1|1,mid+1,r
#define FOR(i,a,b) for(int i=(a);i<=(b);i++)
#define ROF(i,a,b) for(int i=(a);i>=(b);i--)
#define MEM(x,v) memset(x,v,sizeof(x))
inline int read(){
char ch=getchar();int x=,f=;
while(ch<'' || ch>'') f|=ch=='-',ch=getchar();
while(ch>='' && ch<='') x=x*+ch-'',ch=getchar();
return f?-x:x;
}
int n,m,a[maxn],mx[maxn*];
ll sum[maxn*]; //和要开long long
inline void pushup(int o){
sum[o]=sum[o<<]+sum[o<<|];
mx[o]=max(mx[o<<],mx[o<<|]);
}
void build(int o,int l,int r){
if(l==r) return void(sum[o]=mx[o]=a[l]);
int mid=(l+r)>>;
build(lson);
build(rson);
pushup(o);
}
void modify(int o,int l,int r,int p,int v){
if(l==r) return void(sum[o]=mx[o]=v);
int mid=(l+r)>>;
if(mid>=p) modify(lson,p,v);
else modify(rson,p,v);
pushup(o);
}
ll query(int o,int l,int r,int ql,int qr){
if(l>=ql && r<=qr) return sum[o];
int mid=(l+r)>>;ll ans=;
if(mid>=ql) ans+=query(lson,ql,qr);
if(mid<qr) ans+=query(rson,ql,qr);
return ans;
} //以上基本操作,不解释。。。
void modulo(int o,int l,int r,int ql,int qr,int v){
if(mx[o]<v) return; //模数大于最大值,走人
if(l==r) return void(sum[o]=mx[o]=sum[o]%v); //到叶子结点,暴力
int mid=(l+r)>>;
if(mid>=ql) modulo(lson,ql,qr,v); //暴力下去
if(mid<qr) modulo(rson,ql,qr,v);
pushup(o);
}
int main(){
n=read();m=read();
FOR(i,,n) a[i]=read();
build(,,n);
FOR(i,,m){
int op=read(),x=read(),y=read();
switch(op){
case :printf("%lld\n",query(,,n,x,y));break;
case :modulo(,,n,x,y,read());break;
case :modify(,,n,x,y);
}
}
}
线段树
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 ...
- [CF438D]The Child and Sequence【线段树】
题目大意 区间取模,区间求和,单点修改. 分析 其实算是一道蛮简单的水题. 首先线段树非常好解决后两个操作,重点在于如何解决区间取模的操作. 一开始想到的是暴力单点修改,但是复杂度就飙到了\(mnlo ...
随机推荐
- 开源PaaS工具CloudFoundry落地阿里云
原文:https://yq.aliyun.com/articles/292815?utm_content=m_37457 云计算技术的不断成熟和完善,尤其是IaaS平台的不断发展,使得越来越多的企业和 ...
- WPF编程,自定义鼠标形状的一种方法。
原文:WPF编程,自定义鼠标形状的一种方法. 版权声明:我不生产代码,我只是代码的搬运工. https://blog.csdn.net/qq_43307934/article/details/8727 ...
- WPF之Manipulation
原文:WPF之Manipulation 需求:现,在窗口下有一个StackPanel控件. 1.可以拖动. 2.可以展开及收缩(不仅仅可以拖动还可以点击) 3.窗口向坐标轴一样分四个象限,在不同的区域 ...
- LCA的一些算法
LCA,就是求树上任意两点的最近公共祖先 (本题图片与代码均为Luogu3379) 方法我好像讲过一个,这次把主要的三个一起讲一讲 <1> 倍增(O(n log n)) 我们先考虑最基本的 ...
- winform和wpf如何实现鼠标穿透的效果
先看一下鼠标穿透的效果: 可以看到Form1这个程序虽然遮在了桌面的上面,但是我们还可以在窗体上点击桌面上的必应词典和网易邮箱大师,好像这个叫“Form1”的窗口被“穿透”一样. winform版本: ...
- Java Web应用中支持跨域请求
转载:https://blog.csdn.net/lmy86263/article/details/51724221 由于工程合作开发的需要,后台的应用要能支持跨域访问,但是在这个跨域访问“时好时坏” ...
- 11、Dockerfile实战-Tomcat
一.编写Dockerfile 具体步骤这里不再细说,直接看Dockerfile文件: FROM centos:7 MAINTAINER QUNXUE ENV VERSION=8.0.46 RUN yu ...
- 百度地图API的网页使用
请看图示(以及参考官方文档): 图片尺寸:1710x822
- 2014.8.23 Research Meeting Report
Dear All: It was good talk yesterday. However, I want to emphasize that, finally it is the *work* an ...
- Unity关于方法事件生命周期官方文档
http://docs.unity3d.com/Manual/ExecutionOrder.html 一.组件运行的基本顺序 下图中创建类的顺序为A,B,C,A1,二运行的结果为A1,B,C,A. 可 ...