传送门


题目大意:

  给你一个序列,要求在序列上维护三个操作:

  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 (线段树 暴力)的更多相关文章

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

  2. CF(438D) The Child and Sequence(线段树)

    题意:对数列有三种操作: Print operation l, r. Picks should write down the value of . Modulo operation l, r, x. ...

  3. 2018.07.23 codeforces 438D. The Child and Sequence(线段树)

    传送门 线段树维护区间取模,单点修改,区间求和. 这题老套路了,对一个数来说,每次取模至少让它减少一半,这样每次单点修改对时间复杂度的贡献就是一个log" role="presen ...

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

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

  6. 题解——CodeForces 438D The Child and Sequence

    题面 D. The Child and Sequence time limit per test 4 seconds memory limit per test 256 megabytes input ...

  7. cf250D. The Child and Sequence(线段树 均摊复杂度)

    题意 题目链接 单点修改,区间mod,区间和 Sol 如果x > mod ,那么 x % mod < x / 2 证明: 即得易见平凡, 仿照上例显然, 留作习题答案略, 读者自证不难. ...

  8. 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, ...

  9. Codeforces 438D The Child and Sequence

    题意:给定一个n个数的序列,完成以下3个操作: 1.给定区间求和 2.给定区间对x取模 3.单点修改 对一个数取模,这个数至少折半.于是我们记一个最大值max,如果x>max则不做处理. #in ...

随机推荐

  1. String类型不属于八种基本类型

    String不属于8种基本数据类型,String是一个对象.因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. new String( ...

  2. CF_448D 二分

    给定n m k n和m为一个矩阵的行和列,都从1开始,矩阵的每个元素的值即为 i*j(行*列),求里面第k个数 还想找什么规律,发现虽然矩阵里面很有规律,但是n 和m在不断变化 根本不好找 其实元素从 ...

  3. Centos 7.4 DNS域名解析

    1.安装部署包 yum -y install bind bind-utils bind-chroot 2.启动服务并设置开机自启动 [root@localhost ~]# systemctl star ...

  4. 关于SOA的架构设计案例分析

    SOA体系架构及相关技术,主要应用在企业应用集成领域,它能够以服务的方式共享和复用企业现有应用资产,保护用户IT投资,并能够以服务的方式构建新的业务流程,对企业流程进行灵活重构和优化,增强业务的敏捷性 ...

  5. 使用html画爱心

    <!DOCTYPE html"> <html> <head> <meta http-equiv="Content-Type" c ...

  6. 工程日记之HelloSlide(1):Swift自定义可视化组件的方法(继承UIView和在StoryBoard中设置)

    需求描述 HelloSlide是把文本自动转化成幻灯片的软件,在幻灯片中我们有SmartArt:各种各样的几何形状,并且可以自定义大小和颜色,放在幻灯片不同的位置. 为了在我们的软件中实现类似的效果, ...

  7. .NET技术-2.0. 操作数据库-Dapper

    .NET技术-2.0. 操作数据库-Dapper 项目参见: 1. 为什么选择Dapper 1) 性能优越: 其实在各大网站上,我们大概都会看到这样的一个对比效果图,在超过500次poco seria ...

  8. 吴裕雄--天生自然MySQL学习笔记:MySQL 函数

    ASCII(s) 返回字符串 s 的第一个字符的 ASCII 码. SELECT ASCII(CustomerName) AS NumCodeOfFirstChar FROM Customers; C ...

  9. SQL基础教程(第2版)第7章 集合运算:练习题

    可能有些读者会对此感到惊讶:“同时使用 UNION 和 INTERSECT 时,不是 INTERSECT 会优先执行吗?”当然,从执行顺序上来说确实是从 INTERSECT 开始的, 但是在此之前,由 ...

  10. Unix网络编程学习 < 一 >

    #include "unp.h" int main(int argc , char**argv) { int sockfd , n; //sockfd套接字描述符 ]; struc ...