题面

题解

这是一道线段树的模板题。

题目需要我们维护一个支持区间修改、区间查询的一个数据结构,很容易想到线段树。

然后发现和洛谷上线段树的模板1是同一道题。

由于本题中每个数的初始值都为\(0\),因此我们就不需要建树,直接开始把树上每个结点的值都初始化成\(0\)即可。

修改时寻找指定区间,维护一下\(lazy\ tag\)并更新节点的值即可。

查询时和修改同理,只是把查找更新的区间变成了加上区间的和。

注意:

  1. 数据有\(T\)组,因此每组数据开头都需要清空数组;
  2. \(lazy\ tag\)标记下传时要注意最后清空当前节点的\(lazy\ tag\);
  3. 需要开\(long\ long\)。

代码

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <cctype>
#define int long long
#define itn int
#define gI gi using namespace std; inline int gi()
{
int f = 1, x = 0; char c = getchar();
while (c < '0' || c > '9') { if (c == '-') f = -1; c = getchar();}
while (c >= '0' && c <= '9') { x = x * 10 + c - '0'; c = getchar();}
return f * x;
} int n, ans[100005 << 2], tag[100005 << 2]; inline int ls(int x) {return x << 1;}//左儿子
inline int rs(int x) {return x << 1 | 1;}//右儿子 inline void push_up(int x)//上传标记
{
ans[x] = ans[ls(x)] + ans[rs(x)];//求和
} inline void pushdown(int p, int l, int r)//下传标记
{
if (tag[p])//如果还有标记
{
ans[ls(p)] = ans[ls(p)] + tag[p] * l;
ans[rs(p)] = ans[rs(p)] + tag[p] * r;//加上和
tag[ls(p)] = tag[ls(p)] + tag[p];
tag[rs(p)] = tag[rs(p)] + tag[p];//加上标记
tag[p] = 0;//清零标记
}
} void upd(int nl, int nr, int l, int r, int p, int k)//更新操作
{
if (nl <= l && nr >= r)//当前区间包含于要更新的区间
{
ans[p] = ans[p] + (r - l + 1) * k, tag[p] = tag[p] + k;//加上和并记录lazy标记
return;
}
int mid = (l + r) >> 1;
pushdown(p, mid - l + 1, r - mid);//下传lazy标记
if (nl <= mid) upd(nl, nr, l, mid, ls(p), k);//更新左区间
if (nr > mid) upd(nl, nr, mid + 1, r, rs(p), k);//更新右区间
push_up(p);//上传节点
} int getans(int ql, int qr, int l, int r, int p)//求和操作,与更新同理
{
int sum = 0;
if (ql <= l && qr >= r) return ans[p];
int mid = (l + r) >> 1;
pushdown(p, mid - l + 1, r - mid);
if (ql <= mid) sum = sum + getans(ql, qr, l, mid, ls(p));
if (qr > mid) sum = sum + getans(ql, qr, mid + 1, r, rs(p));
return sum;
} signed main()
{
int T = gi();
while (T--)//多组数据
{
memset(tag, 0, sizeof(tag));
memset(ans, 0, sizeof(ans));//多组数据记得清空数组
int n = gi(), m = gi();
for (int i = 1; i <= m; i++)
{
int fl = gi();
if(fl == 0)//修改操作
{
int x = gi(), y = gi(), k = gi();
upd(x, y, 1, n, 1, k);
}
else//求和操作
{
int x = gi(), y = gi();
printf("%lld\n", getans(x, y, 1, n, 1));
}
}
}
return 0;//结束
}

题解【SP8002】HORRIBLE - Horrible Queries的更多相关文章

  1. 【题解】A Horrible Poem

    题目大意 给出一个由小写英文字母组成的字符串 S,再给出 q 个询问,要求回答 S 某个子串的最短循环节. 如果字符串 B 是字符串 A 的循环节,那么 A 可以由 B 重复若干次得到. 输入格式 第 ...

  2. 题解-Codeforces710F String Set Queries

    咕了好久没更博客,最近得知可以去冬眠营玩耍,还可以搭顺风车回广州过年 (最近做到的比较有意思的题目:bzoj3958.hihocoder1419) Problem Codeforces-710F--洛 ...

  3. 题解-------CF1304E 1-Trees and Queries

    传送门 题目大意 给你一棵无根树,然后询问Q次,每次把点$x$和点$y$连接,问你从点$a$到点$b$是否有一条长度为$k$的简单路径,每次询问完后会把新添加的边删除. 思路:树上LCA 题目跟201 ...

  4. Mysql存储引擎之TokuDB以及它的数据结构Fractal tree(分形树)

    在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...

  5. 分形树Fractal tree介绍——具体如何结合TokuDB还没有太懂,先记住其和LSM都是一样的适合写密集

    在目前的Mysql数据库中,使用最广泛的是innodb存储引擎.innodb确实是个很不错的存储引擎,就连高性能Mysql里都说了,如果不是有什么很特别的要求,innodb就是最好的选择.当然,这偏文 ...

  6. Servlet3.0学习总结(二)——使用注解标注过滤器(Filter)

    Servlet3.0提供@WebFilter注解将一个实现了javax.servlet.Filter接口的类定义为过滤器,这样我们在web应用中使用过滤器时,也不再需要在web.xml文件中配置过滤器 ...

  7. MySQL 高性能存储引擎:TokuDB初探

    在安装MariaDB的时候了解到代替InnoDB的TokuDB,看简介非常的棒,这里对ToduDB做一个初步的整理,使用后再做更多的分享. 什么是TokuDB? 在MySQL最流行的支持全事务的引擎为 ...

  8. MySQL-TokuDB:MySQL 高性能存储引擎:TokuDB

    ylbtech-MySQL-TokuDB:MySQL 高性能存储引擎:TokuDB 1.返回顶部 1. 在安装MariaDB的时候了解到代替InnoDB的TokuDB,看简介非常的棒,这里对ToduD ...

  9. Codeforces 556D Restructuring Company

    传送门 D. Restructuring Company time limit per test 2 seconds memory limit per test 256 megabytes input ...

随机推荐

  1. redis 4.x及以上的未授权访问

    00x01 环境搭建 选择在kali中复现 选择了redis5.0.5版本 1.下载并安装: $ wget http://download.redis.io/releases/redis-5.0.5. ...

  2. 静态路由、RIP、SOPF、VLAN间的路由

    常用命令: clear ip router * --清楚全部路由 show ip route --显示路由表 show ip inter b--显示接口信息 show ip protocols  -- ...

  3. Socket之UDP

    相对于TCP/IP来说,UDP更像是发快递和写信,不需要判断和对方是否连通就可以发送,而TCP/IP必须确认连通之后才可以发送,这样UDP通讯其实不能严格按照TCP/IP的说法区分服务器和客户端,对于 ...

  4. python3相关

    with用法 with A as B: 语句 调用( A返回的类) 的__enter__方法 将该方法返回值赋予B, 执行完with语句块后, 调用类的__exit__方法

  5. vjudge A^B Mod C 然后,10.6最。。。的 快速幂!!!

    链接:https://vjudge.net/contest/331993#problem/D 给出3个正整数A B C,求A^B Mod C. 例如,3 5 8,3^5 Mod 8 = 3. Inpu ...

  6. 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(5.2)-- Asynchronous Event Request command

    5.2 异步事件请求命令 异步事件用于当状态.错误.健康信息这些事件发生时通知主机软件.为了使能这个controller报告的异步事件,主机软件需要提交一个或多个异步事件请求命令到controller ...

  7. [CF546C] Soldier and Cards - 模拟

    两个人玩牌,首先两个人都拿出自己手牌的最上面的进行拼点,两张拼点牌将都给拼点赢得人,这两张牌放入手牌的顺序是:先放对方的牌再放自己的.若最后有一个人没有手牌了,那么他就输了,求输出拼点的次数和赢得人的 ...

  8. [CF269B] Greenhouse Effect - dp

    给出 N 个植物,每个植物都属于一个品种,共计 m 个品种,分落在不同的位置上(在一个数轴上,而且数轴是无限长度的),保证读入的位置是按照升序读入的. 现在我们可以进行一个操作:取任意一个位置上的植物 ...

  9. AntDesign(React)学习-6 Menu展示数据

    1.官方文档请查看https://ant.design/components/menu-cn/antPro自带的菜单功能很强大,但是太复杂了,感觉大部分功能都用不上,下面实现一个简单从后台动态获取菜单 ...

  10. Servlet与idea

    1.idea会为每一个Tomcat部署的项目,独立建一份配置文件. 配置文件所在位置 怎么部署的?使用的第三种部署方式(查看虚拟目录) docBase部署项目存放的路径 项目目录和Tomcat部署目录 ...