链接:https://www.nowcoder.com/acm/contest/200/B
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld

题目描述

qn姐姐最好了~
    qn姐姐给你了一个长度为n的序列还有m次操作让你玩,
    1 l r 询问区间[l,r]内的元素和
    2 l r 询问区间[l,r]内的元素的平方 

    3 l r x 将区间[l,r]内的每一个元素都乘上x
    4 l r x 将区间[l,r]内的每一个元素都加上x

输入描述:

第一行两个数n,m

接下来一行n个数表示初始序列

就下来m行每行第一个数为操作方法opt,

若opt=1或者opt=2,则之后跟着两个数为l,r

若opt=3或者opt=4,则之后跟着三个数为l,r,x

操作意思为题目描述里说的

输出描述:

对于每一个操作1,2,输出一行表示答案

输入例子:
5 6
1 2 3 4 5
1 1 5
2 1 5
3 1 2 1
4 1 3 2
1 1 4
2 2 3
输出例子:
15
55
16
41

-->

示例1

输入

复制

5 6
1 2 3 4 5
1 1 5
2 1 5
3 1 2 1
4 1 3 2
1 1 4
2 2 3

输出

复制

15
55
16
41

备注:

对于100%的数据 n=10000,m=200000 (注意是等于号)

保证所有询问的答案在long long 范围内

解题思路:这题目就是纯粹考查代码能力,板子没记牢,就因为下推少了个+号和*号就一直WA,他妈竟然样例竟然又能过,比赛一结束竟然就发现了,一提交就AC了,真是要气死了。。。
思路就是这样,复制下出题人的题解吧。
显然,线段树
窝们记录4个东西,区间和tree[root][0],区间平方和 tree[root][1],乘法懒标记 add2[root],加法懒标记add1[root] 。
查询的话就是常规查询,打标记就是线段树2板子一样,
初值:add1[root]=0,add2[root]=1;
加法:add1[root]+=dx
乘法:add2[root]*=dx;
然后考虑更新答案
当前区间[l,r] ,当前节点root,这里面每个元素都变成了( a[i]为更新后, x[i]为更新前)

所以

然后就标准线段树板子

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 10005
#define lson l,mid,root<<1
#define rson mid+1,r,root<<1|1
long long n,m,tree[maxn<<][],add1[maxn<<],add2[maxn<<]; void pushup(long long root)
{
tree[root][]=tree[root<<][]+tree[root<<|][];
tree[root][]=tree[root<<][]+tree[root<<|][];
}
void pushdown1(long long l,long long r,long long root)
{ //加法下推
if(add1[root])
{
add1[root<<]+=add1[root]; //+号不能少,切记
add1[root<<|]+=add1[root];
long long x=tree[root<<][];
long long y=tree[root<<|][];
tree[root<<][]+=l*add1[root];
tree[root<<|][]+=r*add1[root];
tree[root<<][]+=*x*add1[root]+l*add1[root]*add1[root];
tree[root<<|][]+=*y*add1[root]+r*add1[root]*add1[root];
add1[root]=;
}
}
void pushdown2(long long l,long long r,long long root)
{ //乘法下推
if(add2[root]!=)
{
add2[root<<]*=add2[root]; //*号不能少,切记
add2[root<<|]*=add2[root];
tree[root<<][]*=add2[root];
tree[root<<|][]*=add2[root];
tree[root<<][]*=add2[root]*add2[root];
tree[root<<|][]*=add2[root]*add2[root];
add2[root]=;
}
}
void build(long long l,long long r,long long root)
{
add1[root]=;
add2[root]=;
if(l==r)
{
scanf("%lld",&tree[root][]);
tree[root][]=tree[root][]*tree[root][];
return;
}
long long mid=(l+r)>>;
build(lson);
build(rson);
pushup(root);
}
void update1(long long L,long long R,long long C,long long l,long long r,long long root)
{ //加法更新
if(L<=l&&r<=R)
{
long long x=tree[root][];
tree[root][] += (r-l+)*C;
tree[root][] += *x*C+(r-l+)*C*C;
add1[root] += C;
return ;
}
long long mid = (l+r)/;
pushdown2(mid-l+1,r-mid,root); pushdown1(mid-l+,r-mid,root);
if(L<=mid)
update1(L,R,C,lson);
if(R>mid)
update1(L,R,C,rson);
pushup(root);
}
void update2(long long L,long long R,long long C,long long l,long long r,long long root)
{ //乘法更新
if(L<=l&&r<=R)
{
tree[root][] *= C;
tree[root][] *= C*C;
add2[root] *= C; if(add1[root]) add1[root] *= C;
return ;
}
long long mid = (l+r)/;
pushdown2(mid-l+,r-mid,root); pushdown1(mid-l+1,r-mid,root);
if(L<=mid)
update2(L,R,C,lson);
if(R>mid)
update2(L,R,C,rson);
pushup(root);
}
long long query(long long L,long long R,long long c,long long l,long long r,long long root)
{
if(L<=l&&R>=r)
{
if(c==)
return tree[root][];
if(c==)
return tree[root][];
}
long long ans=,mid=(l+r)>>;
pushdown2(mid-l+,r-mid,root); pushdown1(mid-l+1,r-mid,root);
if(L<=mid)
ans+=query(L,R,c,lson);
if(R>mid)
ans+=query(L,R,c,rson);
return ans;
} int main()
{
cin>>n>>m;
build(,n,);
while(m--)
{
long long op,x,y,val;
scanf("%lld",&op);
if(op==||op==)
{
scanf("%lld%lld",&x,&y);
printf("%lld\n",query(x,y,op,,n,));
}
else if(op==||op==)
{
scanf("%lld%lld%lld",&x,&y,&val);
if(op==)
update2(x,y,val,,n,);
else
update1(x,y,val,,n,);
}
}
return ;
}

牛客练习赛28 B数据结构(线段树)的更多相关文章

  1. 牛客网 牛客练习赛11 A.假的线段树

    看不懂题意,而且太菜,写了两道就溜了... A.假的线段树 链接:https://www.nowcoder.com/acm/contest/59/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2 ...

  2. 牛客练习赛28B (经典)【线段树】

    <题目链接> qn姐姐最好了~     qn姐姐给你了一个长度为n的序列还有m次操作让你玩,     1 l r 询问区间[l,r]内的元素和     2 l r 询问区间[l,r]内的元 ...

  3. 线段树 B数据结构 牛客练习赛28

    链接:https://ac.nowcoder.com/acm/contest/200/B来源:牛客网 题目描述 qn姐姐最好了~     qn姐姐给你了一个长度为n的序列还有m次操作让你玩,     ...

  4. 牛客练习赛16 B 漂亮的树【哈希hash/思维】

    链接:https://www.nowcoder.com/acm/contest/84/B 来源:牛客网 题目描述 街上有n棵树,标号为1...n,第i棵树的高度为ai. 定义这n棵树是漂亮的,当且仅当 ...

  5. 牛客练习赛28 E迎风舞 (三分查找)

    链接:https://www.nowcoder.com/acm/contest/200/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...

  6. 牛客 Rabbit的数列 (线段树维护值为x的个数+区间覆盖)

    https://ac.nowcoder.com/acm/contest/907/C 链接:https://ac.nowcoder.com/acm/contest/907/C来源:牛客网 题目描述 Ra ...

  7. 牛客练习赛22-E.简单数据结构1(扩展欧拉定理降幂 +树状数组)

    链接:E.简单数据结构1 题意: 给一个长为n的序列,m次操作,每次操作: 1.区间加 2.对于区间,查询 ,一直到- 请注意每次的模数不同.   题解:扩展欧拉定理降幂 对一个数p取log(p)次的 ...

  8. 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing

    [题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...

  9. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

随机推荐

  1. C#中闭包的陷阱

    我们在使用lambda的时候会遇到闭包,在闭包中有一个陷阱是在for循环中产生的,先上代码: class Program { static void Main(string[] args) { Act ...

  2. composer 自动加载 通过classmap自动架子啊

    https://github.com/brady-wang/composer github地址 composer加载自己写的类 放入一个目录下 更改composer.json "autolo ...

  3. Windows 下面 redis 发布为服务的官方方法

    除了 NSSM 之外 另外一种方式 感觉还是很好用的 redis-server --service-install redis.windows.conf --loglevel verbose 感觉也可 ...

  4. Docker实现运行tomcat并部署项目war包,并实现挂载目录

    之前写的有点乱,现在再来整理一下docker的简单部署运行 借鉴博客:https://blog.csdn.net/qq_32351227/article/details/78673591 一.dock ...

  5. jq简单仿上传文件

    html: <div> <input id="lefile" type="file" style="display:none&quo ...

  6. 在JavaEE中使用Hibernate框架

    我们必须要了解一些Hibernate基础对象,如下: 配置对象 配置对象是你在任何 Hibernate 应用程序中创造的第一个 Hibernate 对象,并且经常只在应用程序初始化期间创造.它代表了 ...

  7. B站弹幕姬(🐔)分析与开发(下篇)

    接上篇 下面开始分析弹幕信息: 当我们在完成和服务器的握手之后,b站的弹幕服务器就会开始不停的开始给我们推送相关房间的弹幕消息了.老规矩前面16个字节是这个包的相关信息,我们先来看下这条消息的前面16 ...

  8. SVN连接不上,Host地址问题

    链接https://svn.ct-ec:8888/svn/189cn-document C:\Windows\System32\drivers\etc 单独换成单行,就好了.

  9. maven配置,jdk1.8

    <!-- 局部jdk配置,pom.xml中 --> <build> <plugins> <plugin> <groupId>org.apac ...

  10. 【python练习题】程序10

    #10.题目:暂停一秒输出,并格式化当前时间. import time print(time.time())#timestamp print(time.localtime(time.time()))# ...