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

题目描述

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,输出一行表示答案
示例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 范围内

这个比较简单,但是出现了一个很难找的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的更多相关文章

  1. 牛客练习赛28 B数据结构(线段树)

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

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

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

  3. 线段树优化dp——牛客多校第一场I(好题)

    和两天做了两道数据结构优化dp的题,套路还是差不多的 题解链接! https://www.cnblogs.com/kls123/p/11221471.html 一些补充 其实这道题的dp[i]维护的不 ...

  4. 线段树区间离散化——牛客多校E

    这个区间离散化把我调死了.. 总之用vector来离散化,然后叶子节点维护的是一段区间,记录下每个叶子结点的起点+长度 千万要注意下标不能弄错! #include<bits/stdc++.h&g ...

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

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

  6. 牛客练习赛 29 E 位运算?位运算!(线段树)

    题目链接  牛客练习赛29E 对$20$位分别建立线段树.首先$1$和$2$可以合起来搞(左移右移其实是等效的) 用个lazy标记下.转移的时候加个中间变量. $3$和$4$其实就是区间$01$覆盖操 ...

  7. 牛客练习赛11 假的字符串 (Trie树+拓扑找环)

    牛客练习赛11 假的字符串 (Trie树+拓扑找环) 链接:https://ac.nowcoder.com/acm/problem/15049 来源:牛客网 给定n个字符串,互不相等,你可以任意指定字 ...

  8. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  9. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

随机推荐

  1. xxx 表 is marked as crashed and last (automatic?) repair 解决办法

    如上图出现 xxx 表 is marked xxxx   的问题 运维那说是因为数据库非正常停掉 时 刚好有数据正在写入 数据库 导致的问题,这个没多大影响,需要 执行命令修复数据库,至于命令是什么? ...

  2. 精彩的jquery弹幕效果

    html页面如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://w ...

  3. GeoGebra重复手段实现

    1.自定义工具部分可以在网上搜一些别人做的工具,主要是把自己经常做的一些任务做成工具,减少重复过程 2.列表部分的简单操作如图所示,实现对三个点的多项式拟合 3.通过序列指令格式可以做一个好玩的效果, ...

  4. 10.添加script标签,判断onload是否完成

    class Tools { static loadScript(url, callback) { let old_script = document.getElementById(url); if ( ...

  5. 任意用户密码重置的十种姿势=====>学习笔记!

    原学习视频链接:https://www.butian.net/School/content?id=214%E2%80%98 1.验证码不失效 原因:获取的验证码缺少时间限制,仅判断验证码是否不正确而未 ...

  6. [De1CTF 2019]SSRF Me

    原帖地址 : https://xz.aliyun.com/t/5927 De1CTF 2019 的一个题目总结 题目描述 直接查看页面源代码可以看到正确格式的代码 #! /usr/bin/env py ...

  7. 移植seetafaceengine-master、opencv到ARM板

    0.前言 在要移植opecv和SeetaFaceEngine-master到ARM板子上运行的所有步骤之前,有几点需要注意的: 查看板子运行的Kernel版本 交叉编译工具链的gcc版本,关键就是工具 ...

  8. 数据挖掘入门系列教程(十点五)之DNN介绍及公式推导

    深度神经网络(DNN,Deep Neural Networks)简介 首先让我们先回想起在之前博客(数据挖掘入门系列教程(七点五)之神经网络介绍)中介绍的神经网络:为了解决M-P模型中无法处理XOR等 ...

  9. ubuntu下载速度慢的解决办法--修改下载源

    操作:https://blog.csdn.net/qq_24326765/article/details/81916222 推荐源:https://blog.csdn.net/qq_36328643/ ...

  10. ubuntu server 18.04 网络配置

    从17.10开始放弃在/etc/network/interfaces里固定IP的配置 配置文件是:/etc/netplan/50-cloud-init.yaml .用缩进来表示层级关系 冒号之后要有个 ...