牛客小白月赛20 E.区区区间

题目描述

Keven 特别喜欢线段树,他给你一个长度为 n 的序列,对序列进行m 次操作。
(略)

输入描述:

第一行两个整数 n、m,表示序列的长度和操作次数(1<=n,m<=2e5)(1<=n,m<=2e5)

第二行 n 个整数,表示序列的初始值 a1,a2,…an(1<=ai<=2e5)
a1,a2…an​ (1<=ai<=2e5)

接下来 m 行,每行三或四个数字,若第一个数字是 1,则表示操作 1,反之则表示操作 2。

(1<=l<=r<=n,1<=k<=2e5)

输出描述:

对于每个操作 2,输出一行一个整数表示区间和。

很久没做线段树的题了,最近抽空补了一下,这题我一开始把值和加数拆开来算,后来发现值是与两端的l,r密切相关的,所以要构造一个结构体记录两个端点,我是看着AC代码写的,最好直接把值和加数都设成longlong,否则样例过不了一半:

#include <bits/stdc++.h>
#define maxn 200005
using namespace std;
typedef long long ll;struct node{int l,r,v;ll u;
}tree[4*maxn];
ll a[maxn];void pushup(int i)
{tree[i].u=tree[i<<1].u+tree[i<<1|1].u;
}void pushdown(int i)
{if(tree[i].v){tree[i<<1].v=tree[i].v;tree[i<<1].u=(2*tree[i<<1].v+tree[i<<1].r-tree[i<<1].l)*(tree[i<<1].r-tree[i<<1].l+1)/2;tree[i<<1|1].v=tree[i].v+tree[i<<1].r-tree[i<<1].l+1;tree[i<<1|1].u=(2*tree[i<<1|1].v+tree[i<<1|1].r-tree[i<<1|1].l)*(tree[i<<1|1].r-tree[i<<1|1].l+1)/2;tree[i].v=0;}
}void build(int i,int l,int r)
{tree[i].v=0;tree[i].l=l;tree[i].r=r;if(l==r){tree[i].u=a[l];return ;}int mid=l+(r-l)/2;build(i<<1,l,mid);build(i<<1|1,mid+1,r);pushup(i);
}void update(int i,int l,int r,int m,int n,ll k)
{if(m<=l && r<=n){tree[i].v=l-m+k;tree[i].u=(tree[i].r-tree[i].l+2*tree[i].v)*(tree[i].r-tree[i].l+1)/2;return ;}pushdown(i);int mid=l+(r-l)/2;if(m<=mid) update(i<<1,l,mid,m,n,k);if(n>mid) update(i<<1|1,mid+1,r,m,n,k);pushup(i);
}ll query(int i,int l,int r,int m,int n)
{if(n<l || m>r) return 0;if(m<=l && r<=n) return tree[i].u;pushdown(i);int mid=l+(r-l)/2;return query(i<<1,l,mid,m,n)+query(i<<1|1,mid+1,r,m,n);
}int main(){int n,m;ll k;scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){scanf("%lld",&a[i]);}build(1,1,n);while(m--){int t,l,r;scanf("%d%d%d",&t,&l,&r);if(t==1){scanf("%lld",&k);update(1,1,n,l,r,k);}else printf("%lld\n",query(1,1,n,l,r));}
}

牛客小白月赛20 E.区区区间相关推荐

  1. 牛客小白月赛 20 E区区区间(线段树)

    传送门 类似题:题目链接 题目: Keven 特别喜欢线段树,他给你一个长度为 n 的序列,对序列进行 m 次操作. 操作有两种: 1 l r k :表示将下标在 [l , r][l,r] 区间内的数 ...

  2. 牛客小白月赛20 D.3的倍数

    牛客小白月赛20 D.3的倍数 题目描述 给你 n 个字符串,每个字符串最多包含 A - Z 这26个字母,Keven 现在取了一些字符串,发现每个字母出现的次数都是 3 的倍数,Keven 现在想要 ...

  3. 牛客小白月赛5 I.区间 (interval)

    牛客小白月赛5 I.区间 (interval) 题目链接 题目描述 Apojacsleam喜欢数组.他现在有一个n个元素的数组a,而他要对a[L]-a[R]进行M次操作:操作一:将a[L]-a[R]内 ...

  4. 牛客小白月赛58 B(暴力)C(思维)D(dp滚动数组优化)

    牛客小白月赛58 感觉没什么意思,这场月赛出题人有点问题. B 题意:给定一定的数据填充顺序和每一个填充层的名称,只有填充满了上一层才可以填充下一层. 但是每一层又属于某一个大层,一个大层中包含了若干 ...

  5. 牛客小白月赛4 D.郊区春游

    牛客小白月赛4 D.郊区春游 题目链接 题目描述 今天春天铁子的班上组织了一场春游,在铁子的城市里有 nnn 个郊区和 mmm 条无向道路,第 iii 条道路连接郊区 AiA_iAi​ 和 BiB_i ...

  6. 牛客小白月赛23(A、B

    牛客小白月赛 A.膜法记录 题意: 给n行m列的矩阵,矩阵中的每个位置都可能有敌人 现在你能消灭a行和b列的敌人,问是否有可能将所有敌人都消灭. 数据范围:n<=20,m<=1e5 思路: ...

  7. 牛客小白月赛2 B.小马过河

    牛客小白月赛2 B.小马过河 题目链接 题目描述 E t e ˊ r e o \mathrm{Et\acute{e}reo} Eteˊreo 开始涉猎几何领域了.他现在正在研究小马喝水问题. 众所周知 ...

  8. 牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟

    牛客小白月赛28 E-会当凌绝顶,一览众山小 线段树+二分暴力模拟 题意 思路 Code 传送门: https://ac.nowcoder.com/acm/contest/16081/E 题意 登山顺 ...

  9. F-选座椅_牛客小白月赛61 (nowcoder.com) 双指针,差分,2021济南ICPC- K Search For Mafuyu (pintia.cn) dfs

    F-选座椅_牛客小白月赛61 (nowcoder.com) 双指针,差分 如果区间[l,r]满足所有条件,那么包含[l,r]的区间也一定是满足条件的,那就考虑双指针遍历每一个区间,如果当前区间满足条件 ...

最新文章

  1. Django models文件模型变更注意事项(表结构的修改)
  2. Visual Studio 智能提示功能消失解决办法
  3. Basic各编码每个字符占用字节个数
  4. Android开发系列(二十八):使用SubMenu创建选项菜单
  5. apache camel_使用Apache Camel进行负载平衡
  6. 罗彻斯特大学计算机科学系专业排名,罗切斯特大学计算机专业怎么样?
  7. html微数据,HTML5之 Microdata微数据
  8. linux fdisk 4k,linux查看硬盘4K对齐方法
  9. 接活,你为啥不行,之懒
  10. mycat管理mysql_Mycat用户和权限控制管理
  11. C语言反汇编 - 函数与结构体
  12. python题库刷题训练软件
  13. AI理论知识整理(4)-期望与方差以及联合概率分布
  14. switch服务器维护时间2020,switch pro什么时候出,2020性能加强版switch发布时间
  15. secureCRT 连接虚拟机的时候连接失败
  16. DCT和IDCT原始公式计算
  17. Adversarial Attack的粗略总结
  18. NP问题,P问题,NPC问题详解—黄宇老师《算法分析》笔记
  19. JDBC :java.sql.SQLException: Access denied for user ‘root‘@‘localhost‘ (using password: YES) 数据库登录正常
  20. 微软发布 Visual Studio 2022 版本 17.3:支持.NET MAUI 正式版,提高 C++ 性能

热门文章

  1. adams功能区不显示_基于ADAMS对初始角和相位角修改模拟力矩波动
  2. B树,B-树和B+树的区别
  3. C语言指针的一些易错点
  4. 2010-2015年笔记本专题研究及投资可行性评估报告
  5. 古典密码学、DES对称加密、3DES对称加密知识总结和实验
  6. 浪潮服务器账号,浪潮云云服务器配置
  7. python之百度贴吧自动签到
  8. go 源码工具解析-英文单复数变化 Inflection
  9. Python中print(f‘***‘)中f是什么意思
  10. matlab具有复数,MATLAB:具有复数的printmat