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 ...
随机推荐
- android环境的搭配
android环境一般采用的是adt bundle 下载地址如下: http://tools.android-studio.org/index.php/adt-bundle-plugin 根据自己jd ...
- Ruby知识总结-一般变量+操作符+if+数组和哈希
ruby入门掌握其实很简单,下面对我司主要使用的部分入门做一个简单的归纳总结: 本文的文章结构: 1.变量 2.操作符 3.if~else~end .unless 4.数组(Array) 5.哈希(H ...
- Python3入门(六)——函数式编程
一.高阶函数 1.可以通过变量指向函数,达到类似别名的效果: >>> f = abs >>> f(-10) 10 2.函数的参数可以是函数,也就是函数可以作为一个入 ...
- 利用IDA6.6进行apk dex代码动态调试
网上公开IDA6.6已经有一段时间,这个版本有个好处就是可以动态调试java代码.正好现在需要动态调试,所以顺便练习一下. 根据android的官方文档,如果要调试一个apk里面的dex代码,必须满足 ...
- flaskr 报错及其修改
作者:hhh5460 官网有一个flaskr的例子,按照其8个步骤(包括测试),一步一步照着做,有3个地方报错. 究其原因,可能是flaskr这个例子年代比较久远,而现在python以及flask都有 ...
- kali安装后的网络设置教程(必需)
本文只适用于kali安装完成后的网络设置,使用NAT模式,关于桥接模式设置在完成本教程后,可以自行百度,教程有很多,但前提是你已经执行完了本教程才能进行进一步的设置(但有些人的kali是可以直接联网的 ...
- how2j 的shiro教程初探
教程案例里的mysql连接器只支持mysql,不支持mariadb,如果用的不是mysql,创建连接时会报错.
- [BZOJ1135][POI2009]Lyz[霍尔定理+线段树]
题意 题目链接 分析 这个二分图匹配模型直接建图的复杂度太高,考虑霍尔定理. 对于某些人组成的区间,我们只需要考虑他们的并是一段连续的区间的集合.更进一步地,我们考虑的人一定是连续的. 假设我们考虑的 ...
- Windows10没有修改hosts文件权限的解决方案(亲测有效)
当遇到有hosts文件不会编辑或者,修改了没办法保存”,以及需要权限等问题如图: 或者这样: 我学了一招,现在教给你: 1.win+R 2.进入hosts的文件所在目录: 3.我们开始如何操作才能不出 ...
- manjaro安装软件
fcitx 安装以下包 fcitx-googlepinyin kcm-fcitx 安装了输入法之后,还要在/etc/profile或~/.xprofile里添加如下内容: export GTK_IM_ ...