CodeForces 438D The Child and Sequence (线段树 暴力)
题目大意:
给你一个序列,要求在序列上维护三个操作:
1)区间求和
2)区间取模
3)单点修改
这里的操作二很讨厌,取模必须模到叶子节点上,否则跑出来肯定是错的。没有操作二就是线段树水题了。
既然必须模到叶子节点,那我们就模咯。
显然,若$b<c$,则$b%c=b$。
因此我们同时维护一个区间最大值,若某区间内最大值小于模数,就把该分支剪掉。
若$a=b%c$,那么肯定有$a \leq \frac{b}{2}$成立。
也就是说,一个数最多被模$\log_2 x$次。总的时间复杂度为$O(n \log n)$,可以接受(就算取模$log$次以后单点修改将某点的值改大,因为有上述剪枝存在,时间复杂度并不会上升太多)。
代码:
#include<cstring>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cctype>
#define foru(i,x,y) for(LL i=x;i<=y;i++)
#define ford(i,x,y) for(LL i=x;i>=y;i--)
#define re(x) x=read()
#define max(a,b) ((aaa=a)>(bbb=b))?aaa:bbb
using namespace std;
typedef long long LL;
typedef double db;
const LL inf=1e9;
const LL N=2e6+; struct node{LL s,m;}t[N];
LL n,m,aaa,bbb; LL read(){
static LL f,x;static char ch;
x=f=;ch=getchar();
while(!isdigit(ch)){f=(ch=='-');ch=getchar();}
while(isdigit(ch)){x=x*+ch-'';ch=getchar();}
return f?-x:x;
} #define mid ((L+R)>>1)
#define ls (k<<1)
#define rs ((k<<1)+1) void upd(LL k,LL L,LL R,LL p,LL x){
if(p<L||p>R)return;
if(L==R){t[k]=(node){x,x};return;}
upd(ls,L,mid,p,x);upd(rs,mid+,R,p,x);
t[k].s=t[ls].s+t[rs].s;
t[k].m=max(t[ls].m,t[rs].m);
} LL qrys(LL k,LL L,LL R,LL l,LL r){
if(r<L||l>R)return ;
if(l<=L&&R<=r)return t[k].s;
return qrys(ls,L,mid,l,r)+qrys(rs,mid+,R,l,r);
} LL qrym(LL k,LL L,LL R,LL l,LL r){
if(r<L||l>R)return ;
if(l<=L&&R<=r)return t[k].m;
return max(qrym(ls,L,mid,l,r),qrym(rs,mid+,R,l,r));
} void mo(LL k,LL L,LL R,LL l,LL r,LL x){
if(r<L||l>R||t[k].m<x)return;
if(L==R){t[k].s%=x;t[k].m=t[k].s;return;}
mo(ls,L,mid,l,r,x);mo(rs,mid+,R,l,r,x);
t[k].s=t[ls].s+t[rs].s;
t[k].m=max(t[ls].m,t[rs].m);
} int main(){
LL l,r,x;
//freopen("mod.in","r",stdin);freopen("mod.out","w",stdout);
re(n);re(m);
foru(i,,n){
re(x);
upd(,,n,i,x);
}
foru(i,,m){
re(x);re(l);re(r);
if(x==){
printf("%I64d\n",qrys(,,n,l,r));
}else if(x==){
re(x);
mo(,,n,l,r,x);
}else{
upd(,,n,l,r);
}
}
return ;
}
CodeForces 438D The Child and Sequence (线段树 暴力)的更多相关文章
- 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 ...
- CF(438D) The Child and Sequence(线段树)
题意:对数列有三种操作: Print operation l, r. Picks should write down the value of . Modulo operation l, r, x. ...
- 2018.07.23 codeforces 438D. The Child and Sequence(线段树)
传送门 线段树维护区间取模,单点修改,区间求和. 这题老套路了,对一个数来说,每次取模至少让它减少一半,这样每次单点修改对时间复杂度的贡献就是一个log" role="presen ...
- 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 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 ...
- 题解——CodeForces 438D The Child and Sequence
题面 D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input ...
- cf250D. The Child and Sequence(线段树 均摊复杂度)
题意 题目链接 单点修改,区间mod,区间和 Sol 如果x > mod ,那么 x % mod < x / 2 证明: 即得易见平凡, 仿照上例显然, 留作习题答案略, 读者自证不难. ...
- 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, ...
- Codeforces 438D The Child and Sequence
题意:给定一个n个数的序列,完成以下3个操作: 1.给定区间求和 2.给定区间对x取模 3.单点修改 对一个数取模,这个数至少折半.于是我们记一个最大值max,如果x>max则不做处理. #in ...
随机推荐
- Swift实现iOS录音与播放音频功能
作用AVPLayer:可以用来播放在线及本地音视频AVAudioSession:音频会话,主要用来管理音频设置与硬件交互使用时需要导入 #import <AVFoundation/AVFound ...
- quartz详解1:初步了解quartz
http://blog.itpub.NET/11627468/viewspace-1763389/ 一.引入 你曾经需要应用执行一个任务吗?这个任务每天或每周星期二晚上11:30,或许仅仅每个月的最后 ...
- CountDownLatch、CyclicBarrier、Semaphore的使用
CountDownLatch(计数器) 主线程等待另外三个线程执行完成后再执行 public static void main(String[] args) { //定义一个CountDownLatc ...
- [GXYCTF2019]BabySQli
0x00 知识点 emmm这道题目就是脑洞得大,能猜后端源码 0x01 解题 查看源码: base32,base64解码得到 select * from user where username = ' ...
- JAVA初学者——Hello,World!
大家好,我是浩宇大熊猫 我本科专业学的是GIS(Geographical Information System),大学期间也学习了很多的编程语言,有C/C++/JAVA等 之前给我们授课的是韩冰老师, ...
- UVA 11468 AC 自动机
首先我们应该是枚举 L个位置上的每个字符来得到最终概率 然后AC自动机的作用就是为了判断你枚举的地方是否对应了单词节点,如果对应了,就肯定要不得 #include <iostream> # ...
- Sqlserver 标量函数
以前只是了解标量函数这个概念,感觉使用量好像并不大,等我真正做sql编码的时候才发现它的好处.简直太方便了实用了. 我们知道在进行软件开发的时候要定义很多不同类型,每个类型又会分很多项.比如: 搞前端 ...
- 吴裕雄--天生自然 JAVASCRIPT开发学习: 表单
<!DOCTYPE html> <html> <head> <meta charset="utf-8"> <script> ...
- IO流处理文件读取到字节数组,再从字节数组读取到文件,Java实现
package cn.zhang.io; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; impo ...
- JavaWeb之Servlet入门(二)
1. 准备 在JavaWeb之Servlet入门(一)中,我们完成了第一个Servlet程序,完成了从URL到后台控制器的中转过程,接下来我们延续JavaWeb之Servlet入门(一)学习下如何传参 ...