链接: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. pgsql中的lateral使用小结

    pgsql中的lateral 什么是LATERAL 带有LATERAL的SQL的计算步骤 LATERAL在OUTER JOIN中的使用限制(或定义限制) LATERAL的几个简单的例子 总结 举几个我 ...

  2. GO中的逃逸分析

    1.什么是逃逸分析 以前写c/c++代码时,为了提高效率,常常将pass-by-value(传值)“升级”成pass-by-reference,企图避免构造函数的运行,并且直接返回一个指针. 那么这里 ...

  3. Python 操作mysql数据库之 SQLAlchemy 案例详解

      前言: 字段声明类型中,最右边的是数据库中对应的字段,我们依然可以使用,其左边的的 SQLAchemy 则是其自身封装的自定义类型. 本篇不会讲太多的理论知识,因为这个实用性更强,所以通篇全部都是 ...

  4. 自己模拟的ftl 用法:

    基类 public class Ftl_object_data_model { //三种基本属性 private boolean canRead=true;//是否能读取 ;//长度 private ...

  5. 造轮子:实现一个简易的 Spring IoC 容器

    作者:DeppWang.原文地址 我通过实现一个简易的 Spring IoC 容器,算是入门了 Spring 框架.本文是对实现过程的一个总结提炼,需要配合源码阅读,源码地址. 结合本文和源码,你应该 ...

  6. 给我Python几十行代码,我还你一个微信聊天助手

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

  7. MySQL系列操作

    Linux环境下安装使用MySQL Portal 数据备份&恢复 Portal

  8. 关于Python+selenium 定位浏览器弹窗元素

    首先要确定弹窗的类型: (1)div弹窗 (2)新标签页弹窗 (3)alert弹窗 一,div弹窗div弹窗是浏览器中比较好定位的弹窗,定位的方法与普通的元素一样.不过这里会有一个坑,明明可以找到这个 ...

  9. Maven+JSP+Servlet+JDBC+Redis+Mysql实现的黑马旅游网

    项目简介 项目来源于:https://gitee.com/haoshunyu/travel 本系统是基于Maven+JSP+Servlet+JdbcTemplate+Redis+Mysql实现的旅游网 ...

  10. [YII2] COOKIE的操作使用

    PHPcookie的设置 setcookie('username',$data['username'],time()+3600*24*7); YII2cookie的设置 $cookies = Yii: ...