牛客练习赛28 B数据结构(线段树)
链接:https://www.nowcoder.com/acm/contest/200/B
来源:牛客网
空间限制:C/C++ 262144K,其他语言524288K
64bit IO Format: %lld
题目描述
输入描述:
第一行两个数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
-->
备注:
对于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数据结构(线段树)的更多相关文章
- 牛客网 牛客练习赛11 A.假的线段树
看不懂题意,而且太菜,写了两道就溜了... A.假的线段树 链接:https://www.nowcoder.com/acm/contest/59/A来源:牛客网 时间限制:C/C++ 1秒,其他语言2 ...
- 牛客练习赛28B (经典)【线段树】
<题目链接> qn姐姐最好了~ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, 1 l r 询问区间[l,r]内的元素和 2 l r 询问区间[l,r]内的元 ...
- 线段树 B数据结构 牛客练习赛28
链接:https://ac.nowcoder.com/acm/contest/200/B来源:牛客网 题目描述 qn姐姐最好了~ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ...
- 牛客练习赛16 B 漂亮的树【哈希hash/思维】
链接:https://www.nowcoder.com/acm/contest/84/B 来源:牛客网 题目描述 街上有n棵树,标号为1...n,第i棵树的高度为ai. 定义这n棵树是漂亮的,当且仅当 ...
- 牛客练习赛28 E迎风舞 (三分查找)
链接:https://www.nowcoder.com/acm/contest/200/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客 Rabbit的数列 (线段树维护值为x的个数+区间覆盖)
https://ac.nowcoder.com/acm/contest/907/C 链接:https://ac.nowcoder.com/acm/contest/907/C来源:牛客网 题目描述 Ra ...
- 牛客练习赛22-E.简单数据结构1(扩展欧拉定理降幂 +树状数组)
链接:E.简单数据结构1 题意: 给一个长为n的序列,m次操作,每次操作: 1.区间加 2.对于区间,查询 ,一直到- 请注意每次的模数不同. 题解:扩展欧拉定理降幂 对一个数p取log(p)次的 ...
- 牛客练习赛52 B题【树状数组维护区间和{查询区间和,如果区间元素重复出现则计数一次}】补题ing
[题目] 查询区间和,如果区间元素重复出现则计数一次. 链接:https://ac.nowcoder.com/acm/contest/1084/B [题解] 将询问按r排序,维护每个数最后出现的位置, ...
- 牛客练习赛28-B(线段树,区间更新)
牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, 1 l r 询问区间[l,r]内的元素和 2 l r 询问区间[l,r]内的 ...
随机推荐
- [转帖]Kerberos和NTLM - SQL Server
Kerberos和NTLM - SQL Server https://www.cnblogs.com/dreamer-fish/p/3458425.html 当我们使用Windows Authenti ...
- Laravel 的十八个最佳实践
本文翻译改编自 Laravel 的十八个最佳实践 这篇文章并不是什么由 Laravel 改编的 SOLID 原则.模式等. 只是为了让你注意你在现实生活的 Laravel 项目中最常忽略的内容. ...
- Flutter的Appbar
actions → List一个 Widget 列表,代表 Toolbar 中所显示的菜单,对于常用的菜单,通常使用 IconButton 来表示:对于不常用的菜单通常使用PopupMenuButto ...
- drf 之序列化组件
序列化 把Python中对象转换为json格式字符串 反序列化 把json格式转为为Python对象. 用orm查回来的数据都是都是一个一个的对象, 但是前端要的是json格式字符串. 序列化两大功能 ...
- linux 地址解析协议 arp
随便转载,保留出处:http://www.cnblogs.com/aaron-agu/ arp –na #查看 arp –s 123.253.68.209 00:19:56:6F:87:D4 #添加
- Java多线程之静态代理
package org.study2.javabase.ThreadsDemo.staticproxy; /** * @Date:2018-09-18 静态代理 设计模式 * 1.真实角色 * 2.代 ...
- WGS84,GCJ02, BD09坐标转换
public class Gps { private double wgLat; private double wgLon; public Gps(double wgLat, double wgLon ...
- How to flash Havoc on enchilada
update fastboot and adb fastboot oem unlock adb debug enchilada reboot to fastboot fastboot devices ...
- moogodb 安装及简单介绍
1,安装Moogodb 因为是windows 64位操作系统,直接到官网上下载.msi文件,下载完成后点击安装,点击同意协议之后,出现下面的对话框, Choose Setup Type, 就是选择安装 ...
- CSS知识点总结[部分]
css是英文Cascading Style Sheets的缩写,称为层叠样式表,用于对页面进行美化. 存在方式有三种:元素内联.页面嵌入和外部引入,比较三种方式的优缺点. 注释为 /* 注释内容 */ ...