线段树 B数据结构 牛客练习赛28
链接:https://ac.nowcoder.com/acm/contest/200/B
来源:牛客网
题目描述
输入描述:
第一行两个数n,m 接下来一行n个数表示初始序列 就下来m行每行第一个数为操作方法opt, 若opt=1或者opt=2,则之后跟着两个数为l,r 若opt=3或者opt=4,则之后跟着三个数为l,r,x 操作意思为题目描述里说的
输出描述:
对于每一个操作1,2,输出一行表示答案
备注:
对于100%的数据 n=10000,m=200000 (注意是等于号) 保证所有询问的答案在long long 范围内 这个比较简单,但是出现了一个很难找的bug。
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <queue>
#include <algorithm>
#include <iostream>
#include <vector>
#include <map>
#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn = 2e5 + ; ll a[maxn]; struct node
{
int l, r;
ll lazyc, lazyadd;
ll sum, all;
}tree[maxn*]; void push_up(int id)
{
tree[id].sum = tree[id << ].sum + tree[id << | ].sum;
tree[id].all = tree[id << ].all + tree[id << | ].all;
} void push_down(int id)
{
if(tree[id].lazyc>)
{
tree[id << ].sum = tree[id << ].sum*tree[id].lazyc;
tree[id << | ].sum = tree[id << | ].sum*tree[id].lazyc;
tree[id << ].all = tree[id << ].all*tree[id].lazyc*tree[id].lazyc;
tree[id << | ].all = tree[id << | ].all*tree[id].lazyc*tree[id].lazyc;
tree[id << ].lazyc *= tree[id].lazyc;
tree[id << | ].lazyc *= tree[id].lazyc;
tree[id].lazyc = ;
}
if(tree[id].lazyadd)
{
tree[id << ].all += tree[id << ].sum * *tree[id].lazyadd + (tree[id << ].r - tree[id << ].l + )*tree[id].lazyadd*tree[id].lazyadd;
tree[id << | ].all += tree[id << | ].sum * *tree[id].lazyadd+ (tree[id << | ].r - tree[id << | ].l + )*tree[id].lazyadd*tree[id].lazyadd;
tree[id << ].sum += (tree[id<<].r - tree[id<<].l + )*tree[id].lazyadd;
tree[id << | ].sum += (tree[id << | ].r - tree[id << | ].l + )*tree[id].lazyadd;
tree[id << ].lazyadd += tree[id].lazyadd;
tree[id << | ].lazyadd += tree[id].lazyadd;
tree[id].lazyadd = ;
}
} void build(int id,int l,int r)
{
tree[id].l = l;
tree[id].r = r;
tree[id].lazyc = ;
tree[id].lazyadd = ;
if(l==r)
{
tree[id].sum = a[l];
tree[id].all = a[l] * a[l];
return;
}
int mid = (l + r) >> ;
build(id << , l, mid);
build(id << | , mid + , r);
push_up(id);
} void updatec(int id,int l,int r,int x)
{
push_down(id);
if(l<=tree[id].l&&r>=tree[id].r)
{
tree[id].lazyc *= x;
tree[id].lazyadd *= x;
tree[id].sum = tree[id].sum*x;
tree[id].all = tree[id].all*x*x;
return;
}
int mid = (tree[id].l + tree[id].r) >> ;
if (l <= mid) updatec(id << , l, r, x);
if (r > mid) updatec(id << | , l, r, x);
push_up(id);
} void updateadd(int id,int l,int r,int x)
{
push_down(id);
if(l<=tree[id].l&&r>=tree[id].r)
{
tree[id].lazyadd += x;
tree[id].all += tree[id].sum * *x + (tree[id].r - tree[id].l + )*x*x;
tree[id].sum += (tree[id].r - tree[id].l + )*x;
return;
}
int mid = (tree[id].l + tree[id].r) >> ;
if (l <= mid) updateadd(id << , l, r, x);
if (r > mid) updateadd(id << | , l, r, x);//这里的id<<1|1忘记+1了,就写成了id<<1
push_up(id);
} ll querysum(int id,int l,int r)
{ if(l<=tree[id].l&&r>=tree[id].r)
{
return tree[id].sum;
}
ll ans = ;
push_down(id);
int mid = (tree[id].l + tree[id].r) >> ;
if (l <= mid) ans += querysum(id << , l, r);
if (r > mid) ans += querysum(id << | , l, r);
return ans;
} ll queryc(int id,int l,int r)
{
if(l<=tree[id].l&&r>=tree[id].r)
{
return tree[id].all;
}
push_down(id);
ll ans = ;
int mid = (tree[id].l + tree[id].r) >> ;
if (l <= mid) ans += queryc(id << , l, r);
if (r > mid) ans += queryc(id << | , l, r);
return ans;
} int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = ; i <= n; i++) scanf("%lld", &a[i]);
build(, , n);
int opt, l, r, x;
for(int i=;i<=m;i++)
{
scanf("%d%d%d", &opt, &l, &r);
if(opt==)
{
ll ans = querysum(, l, r);
printf("%lld\n", ans);
}
if(opt==)
{
ll ans = queryc(, l, r);
printf("%lld\n", ans);
}
if(opt==)
{
scanf("%d", &x);
updatec(, l, r, x);
}
if(opt==)
{
scanf("%d", &x);
updateadd(, l, r, x);
}
}
return ;
}
线段树 B数据结构 牛客练习赛28的更多相关文章
- 牛客练习赛28 B数据结构(线段树)
链接:https://www.nowcoder.com/acm/contest/200/B来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 牛客练习赛28 E迎风舞 (三分查找)
链接:https://www.nowcoder.com/acm/contest/200/E来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言5242 ...
- 线段树优化dp——牛客多校第一场I(好题)
和两天做了两道数据结构优化dp的题,套路还是差不多的 题解链接! https://www.cnblogs.com/kls123/p/11221471.html 一些补充 其实这道题的dp[i]维护的不 ...
- 线段树区间离散化——牛客多校E
这个区间离散化把我调死了.. 总之用vector来离散化,然后叶子节点维护的是一段区间,记录下每个叶子结点的起点+长度 千万要注意下标不能弄错! #include<bits/stdc++.h&g ...
- 牛客练习赛28-B(线段树,区间更新)
牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, 1 l r 询问区间[l,r]内的元素和 2 l r 询问区间[l,r]内的 ...
- 牛客练习赛 29 E 位运算?位运算!(线段树)
题目链接 牛客练习赛29E 对$20$位分别建立线段树.首先$1$和$2$可以合起来搞(左移右移其实是等效的) 用个lazy标记下.转移的时候加个中间变量. $3$和$4$其实就是区间$01$覆盖操 ...
- 牛客练习赛11 假的字符串 (Trie树+拓扑找环)
牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
- 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B
牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...
随机推荐
- Python趣味入门3:变量、字串输入与输出
安装配置python环境完毕,非常有必要花十分钟对一些基本概念:变量.数学字符.输入.输出等4个概念进行理解,下面通过简单示例,深入了解python的基本语法. 本文的示例均在IDLE的命令行模式中完 ...
- AJ学IOS(53)多线程网络之NSOperation简介
AJ分享,必须精品 一:简单介绍 1:NSOperation的作⽤使用步骤: 配合使用NSOperation和NSOperationQueue也能实现多线程编程. NSOperation和NSOper ...
- 挑战全网最幽默的Vuex系列教程:第二讲 Vuex旗下的State和Getter
先说两句 上一讲 「Vuex 到底是个什么鬼」,已经完美诠释了 Vuex 的牛逼技能之所在(纯属自嗨).如果把 Vuex 比喻成农药里面的刘备,那就相当于你现在已经知道了刘备他是一个会打枪的力量型英雄 ...
- 使用 PyQt5 实现图片查看器
一.前言 在学习 PyQt5 的过程中我会不断地做一些小的 Demo,用于让自己能够更好地理解和学习,这次要做的就是一个图片查看器,主要功能包括打开图片.拖动图片.放大和缩小图片. 最终实现的图片查看 ...
- 提升效率必备!8个超好用的Python内置函数
文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 吃着不想停 PS:如有需要Python学习资料的小伙伴可以加点击下方链接自 ...
- Mybatis Generator通用Join的实现
通常,我们使用Mybatis实现join表关联的时候,一般都是通过在xml或注解里写自定义sql实现. 本文通过Mybatis Generator的插件功能新增一个JoinPlugin插件,只要在配置 ...
- C++创建动态库
[C++]创建动态库 有很多方法,这个只是其中一种 比较简洁的方法. char* __stdcall correction(char* str) char *_result = new char[se ...
- 带你玩linux集成环境
据我现在知道的,在linux一键部署集成环境的应用有: “宝塔面板” “LNMP" "XRDP" 参考:http://www.ampnmp.com/ 具体什么安装就直接百 ...
- java8 流式编程
为什么需要流式操作 集合API是Java API中最重要的部分.基本上每一个java程序都离不开集合.尽管很重要,但是现有的集合处理在很多方面都无法满足需要. 一个原因是,许多其他的语言或者类库以声明 ...
- Nginx四层代理
Nginx支持四层代理 http://nginx.org/en/docs/stream/ngx_stream_core_module.html 该ngx_stream_core_module模块自1. ...