链接: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. Cilium架构 (Cilium 2)

    Cilium架构 译自:http://docs.cilium.io/en/stable/architecture/ 本文档描述了Cilium的架构.它通过记录BPF数据路径(datapath)的钩子来 ...

  2. App 开发中判断 ios 和 andriod 常用方法便于修复在两类机型样式不一样等缺陷

    判断安卓, ios

  3. 45道SQL数据题详解1

    准备阶段: 创建表: //创建学生表,前面的s表示学生,相应的标签前面加t表示老师 CREATE TABLE students (sno VARCHAR(3) NOT NULL, sname VARC ...

  4. 文件密码忘记了怎么办,教你如何使用Python破解密码

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者:轻松学编程小梁 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

  5. Java Instrumentation插桩技术学习

    Instrumentation基础 openrasp中用到了Instrumentation技术,它的最大作用,就是类的动态改变和操作. 使用Instrumentation实际上也可以可以开发一个代理来 ...

  6. Python算法题:金字塔

    代码如下: #Python金字塔练习 """ 最大层数:max_level 当前层数:current_level 金字塔正序时: 每层的空格=最大层数-当前层数 每层的星 ...

  7. Django文档阅读-Day1

    Django文档阅读-Day1 Django at a glance Design your model from djano.db import models #数据库操作API位置 class R ...

  8. (转载)基于BIGINT溢出错误的SQL注入

    我对于通过MySQL错误提取数据的新技术非常感兴趣,而本文中要介绍的就是这样一种技术.当我考察MySQL的整数处理方式的时候,突然对如何使其发生溢出产生了浓厚的兴趣.下面,我们来看看MySQL是如何存 ...

  9. Springboot:员工管理之删除员工及退出登录(十(9))

    springboot2.2.6 delete请求报错,降至2.1.11功能可用 原因未知 构建员工删除请求 com\springboot\controller\EmployeeController.j ...

  10. Mysql列属性

    列属性又称之为字段属性在mysql中一共有6个属性:null,默认值(default),列描述(comment),主键(primary key),唯一键(unique key)和自动增长 修改数据库字 ...