链接: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. Flex Socket与Java通信实例说明(转)

    Flex Socket与Java通信实例说明(转) 这两天一直在flex的Socket ,现在终于懂了很多.由浅到深一步一步深入.慢慢体会实例,虽然实例都是在网上找的,但也经过了我的测试.我比较喜欢注 ...

  2. 常见的 PHP 面试题和答案分享

    如何直接将输出显示给浏览器? 将输出直接显示给浏览器,我们必须使用特殊标记 <?=and?>. PHP 是否支持多重继承? PHP 只支持单继承.PHP 的类使用关键字 extends 继 ...

  3. 1.Git 安装

    Git的安装 阿里云镜像去下载 阿里云的镜像地址 卸载Git 1.首先在系统环境变量->path->里面去清理掉git相关的环境变量 2.然后控制面板卸载 安装Git 一直下一步即可 使用 ...

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

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

  5. selenium 键盘鼠标模拟

    一.键盘模拟常用的键 sendKeys(Keys.BACK_SPACE);  //删除键--Backspace sendKeys(Keys.SPACE);   //空格键 Space sendKeys ...

  6. PHP反序列化漏洞总结

    写在前边 做了不少PHP反序列化的题了,是时候把坑给填上了.参考了一些大佬们的博客,自己再做一下总结 1.面向对象 2.PHP序列化和反序列化 3.PHP反序列化漏洞实例 1.面向对象 在了解序列化和 ...

  7. 几个可以提高工作效率的Python内置小工具

    在这篇文章里,我们将会介绍4个Python解释器自身提供的小工具.这些小工具在笔者的日常工作中经常用到,减少了各种时间的浪费,然而,却很容易被大家忽略.每当有新来的同事看到我这么使用时,都忍不住感叹, ...

  8. java 多线--静态代理模式

    我们使用 java 多线程时,都需要通过线程代理对象来启动线程,常见的写法: new Thread(target).start(); 这在设计模式中叫静态代理模式,静态代理模式组成; 1.公共接口 2 ...

  9. Nginx知多少系列之(十四)Linux下.NET Core项目Nginx+Keepalived高可用(主从模式)

    目录 1.前言 2.安装 3.配置文件详解 4.工作原理 5.Linux下托管.NET Core项目 6.Linux下.NET Core项目负载均衡 7.负载均衡策略 8.加权轮询(round rob ...

  10. C#多线程(14):任务基础②

    目录 判断任务状态 再说父子任务 组合任务/延续任务 复杂的延续任务 并行(异步)处理任务 并行(同步)处理任务 并行任务的 Task.WhenAny 并行任务状态 循环中值变化问题 定时任务 Tas ...