题目

[USACO15DEC]haybalesCounting Haybale P

题解

最近刚刚自学了线段树这个数据结构,恰巧做到了这道线段树的模板题。其实也没有什么好多说的,接触过线段树的大犇肯定觉得很简单。这道题注意的是修改区间的值时用到了lazy思想,如果只是用朴素的修改法则会超时。

果然,用朴素的方法更新值果然TLE了。

于是,我使用了lazy数组,这样可以尽可能地减少不必要的修改(如果有不理解的小伙伴可以上网搜索线段树lazy的含义与用法),最终终于AK了。

代码

这是TLE的代码(请勿学习)

#include<iostream>
using namespace std;
int n, m;
typedef long long ll;
#define MAX 200001
ll sum[MAX << 2];
int mm[MAX << 2];
int a[MAX];
char c;
int le, ri, p; inline void pushup(int rt)
{
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
mm[rt] = min(mm[rt << 1], mm[rt << 1 | 1]);
} void build(int l, int r, int cur)
{
if (l == r)
{
sum[cur] = a[l];
mm[cur] = a[l];
return;
}
int mid = (l + r)>>1;
build(l, mid, cur << 1);
build(mid + 1, r, cur << 1 | 1);
pushup(cur);
} ll Sum(int L, int R, int l, int r, int cur)
{
if (l >= L && r <= R)
return sum[cur];
int mid = (l + r) >> 1;
ll res = 0;
if (mid >= L)
res += Sum(L, R, l, mid, cur << 1);
if (mid < R)
res += Sum(L, R, mid + 1, r, cur << 1 | 1);
return res;
} ll Min(int L, int R, int l, int r, int cur)
{
if (l>=L&&r<=R)
return mm[cur];
int mid = (l + r) >> 1;
if (mid >= R)
return Min(L, R, l, mid, cur << 1);
else if (mid < L)
return Min(L, R, mid + 1, r, cur << 1 | 1);
return min(Min(L, R, l, mid, cur << 1), Min(L, R, mid + 1, r, cur << 1 | 1));
} void update(int L, int R, int l, int r, int cur, int z)
{
if (l == r)
{
sum[cur] += z;
mm[cur] += z;
return;
}
int mid = (l + r) >> 1;
if (mid >= L)
update(L, R, l, mid, cur << 1, z);
if (mid < R)
update(L, R, mid + 1, r, cur << 1 | 1, z);
pushup(cur);
} int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
build(1, n, 1);
for (int i = 0; i < m; i++)
{
cin >> c;
if (c == 'M')
{
cin >> le >> ri;
cout << Min(le, ri, 1, n, 1) << '\n';
}
else if (c == 'S')
{
cin >> le >> ri;
cout<<Sum(le, ri, 1, n, 1)<<'\n';
}
else
{
cin >> le >> ri >> p;
update(le, ri, 1, n, 1, p);
}
}
return 0;
}

接下来是AC的(现学现码)

#include<iostream>
using namespace std;
int n, m;
typedef long long ll;
#define MAX 200001
ll sum[MAX << 2];
int mm[MAX << 2];
ll lazy[MAX << 2];
int a[MAX];
char c;
int le, ri, p; inline void pushup(int rt)
{
sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
mm[rt] = min(mm[rt << 1], mm[rt << 1 | 1]);
} inline void pushdown(int rt, int l, int r)
{
lazy[rt << 1] += lazy[rt], lazy[rt << 1 | 1] += lazy[rt];
int mid = (l + r) / 2;
sum[rt << 1] += lazy[rt] * (mid - l + 1);
sum[rt << 1 | 1] += lazy[rt] * (r - mid);
mm[rt << 1] += lazy[rt];
mm[rt << 1 | 1] += lazy[rt];
lazy[rt] = 0;
} void build(int l, int r, int cur)
{
if (l == r)
{
sum[cur] = a[l];
mm[cur] = a[l];
return;
}
int mid = (l + r)>>1;
build(l, mid, cur << 1);
build(mid + 1, r, cur << 1 | 1);
pushup(cur);
} ll Sum(int L, int R, int l, int r, int cur)
{
if (l >= L && r <= R)
return sum[cur];
if (lazy[cur])
pushdown(cur, l, r);
int mid = (l + r) >> 1;
ll res = 0;
if (mid >= L)
res += Sum(L, R, l, mid, cur << 1);
if (mid < R)
res += Sum(L, R, mid + 1, r, cur << 1 | 1);
return res;
} ll Min(int L, int R, int l, int r, int cur)
{
if (l>=L&&r<=R)
return mm[cur];
if (lazy[cur])
pushdown(cur, l, r);
int mid = (l + r) >> 1;
if (mid >= R)
return Min(L, R, l, mid, cur << 1);
else if (mid < L)
return Min(L, R, mid + 1, r, cur << 1 | 1);
return min(Min(L, R, l, mid, cur << 1), Min(L, R, mid + 1, r, cur << 1 | 1));
} void update(int L, int R, int l, int r, int cur, int z)
{
if (l >= L&&r <= R)
{
sum[cur] += (ll)z * (r - l + 1);
mm[cur] += z;
lazy[cur] += z;
return;
}
if (lazy[cur])
pushdown(cur, l, r);
int mid = (l + r) >> 1;
if (mid >= L)
update(L, R, l, mid, cur << 1, z);
if (mid < R)
update(L, R, mid + 1, r, cur << 1 | 1, z);
pushup(cur);
} int main()
{
ios::sync_with_stdio(false);
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a[i];
build(1, n, 1);
for (int i = 0; i < m; i++)
{
cin >> c;
if (c == 'M')
{
cin >> le >> ri;
cout << Min(le, ri, 1, n, 1) << '\n';
}
else if (c == 'S')
{
cin >> le >> ri;
cout<<Sum(le, ri, 1, n, 1)<<'\n';
}
else
{
cin >> le >> ri >> p;
update(le, ri, 1, n, 1, p);
}
}
return 0;
}

感觉自己还是太菜了。

洛谷P3130 haybalesCounting Haybale P 题解的更多相关文章

  1. 洛谷P1783 海滩防御 分析+题解代码

    洛谷P1783 海滩防御 分析+题解代码 题目描述: WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和 ...

  2. 洛谷P4047 [JSOI2010]部落划分题解

    洛谷P4047 [JSOI2010]部落划分题解 题目描述 聪聪研究发现,荒岛野人总是过着群居的生活,但是,并不是整个荒岛上的所有野人都属于同一个部落,野人们总是拉帮结派形成属于自己的部落,不同的部落 ...

  3. 洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈)

    洛谷P1155 双栈排序题解(图论模型转换+二分图染色+栈) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1311990 原题地址:洛谷P1155 双栈排序 ...

  4. 洛谷10月月赛II题解

    [咻咻咻] (https://www.luogu.org/contestnew/show/11616) 令人窒息的洛谷月赛,即将参加NOIp的我竟然只会一道题(也可以说一道也不会),最终145的我只能 ...

  5. [洛谷P1823]音乐会的等待 题解(单调栈)

    [洛谷P1823]音乐会的等待 Description N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任意两个人A和B,如果他们是相邻或他们之间没 ...

  6. BZOJ2527 & 洛谷3527:[Poi2011]Meteors——题解

    +++++++++++++++++++++++++++++++++++++++++++ +本文作者:luyouqi233. + +欢迎访问我的博客:http://www.cnblogs.com/luy ...

  7. 洛谷 p1516 青蛙的约会 题解

    dalao们真是太强了,吊打我无名蒟蒻 我连题解都看不懂,在此篇题解中,我尽量用语言描述,不用公式推导(dalao喜欢看公式的话绕道,这篇题解留给像我一样弱的) 进入正题 如果不会扩展欧里几德的话请先 ...

  8. 洛谷p2370yyy2015c01的U盘题解

    没什么特殊的想法 就是看自己很久没有更新关于题解类的文章了而已 (其实这是我好久之前做的, 只是把它从洛谷博客搬到了这里而已) 题目 首先分析题目要二分 他长成这个亚子太二分了 所以就要二分 最好是先 ...

  9. 2019.06.17课件:[洛谷P1310]表达式的值 题解

    P1310 表达式的值 题目描述 给你一个带括号的布尔表达式,其中+表示或操作|,*表示与操作&,先算*再算+.但是待操作的数字(布尔值)不输入. 求能使最终整个式子的值为0的方案数. 题外话 ...

随机推荐

  1. 构建前端第12篇之---在Vue中对组件,变量,函数的全局引入

    张燕涛写于2020-01-16 星期two 本篇还是源于import和export的使用,昨天看es6入门 和MDN文档,大体上用法了解了,但今天看ElementUI源码的时候,看到 //src/in ...

  2. 大数据学习(10)—— Hive进阶

    前面提到了Hive的知识点非常零散,我不知道该怎么把这些知识点分类,跟SQL关系没那么大的就放在这一篇吧. Hive Serde 参考Hive Serde Serde是啥 Serde是序列化和反序列化 ...

  3. oracle(enquences & latches )lock (oracle 锁大全)

    资料来自官方文档: https://docs.oracle.com/database/121/CNCPT/consist.htm#CNCPT1333 https://docs.oracle.com/d ...

  4. Nat Comm | 中科院动物所张勇团队合作揭示动物中DNA转座子介导基因重复的机制

    1950年Barbara Mclintock 首次在玉米中发现转座子(TEs),并由此获得诺贝尔奖.尽管长期被认为是垃圾DNA,但现在TEs被广泛认可是宿主基因组演化的重要推动力.它们可引起包含基因重 ...

  5. 清晰易懂的RxJava入门实践

    导入 我相信大家肯定对ReactiveX 和 RxJava 都不陌生,因为现在只要是和技术相关的网站,博客都会随处见到介绍ReactiveX和RxJava的文章. ReactiveX Reactive ...

  6. 基于SpringBoot的在线问卷调查管理系统

    注意:该项目只展示部分功能,如需了解,评论区咨询即可. 1.开发环境 开发语言:Java 后台框架:SpringBoot 前端框架:vue 数据库:MySQL 设计模式:MVC 架构:B/S 源码类型 ...

  7. 让Dev支持C++11特性

    如果你使用的是 Dev-C++ ,忘记了在设置中包含 -std=c++11是无法让Dev支持C++11特性的,导致一些C++11 中的好用的函数可能会产⽣生编译⽆无法通过的情况. 这时候你有两个方法 ...

  8. 在Django中使用Channels功能

    前言:最近后台写游戏更新版本功能,简单就是前端发送更新请求,后端需要对很多台服务器进行更新和各种操作,本来想着实现不难,后来发现因为后端需要执行很长时间,前端返回报错,后端会执行完毕,但是前端先断开了 ...

  9. SQL注入:基本查询原理

    SQL注入概述 sql注入不需要精通sql的各种命令,只需要了解几个命令并会使用即可. SQL注入:一种针对于数据库的攻击 现在的web网站都需要数据库的支持. SQL部分重要内容: 库:databa ...

  10. 4、二进制安装K8s 之 部署kube-controller-manager

    二进制安装K8s 之 部署kube-controller-manager 1.创建配置文件 cat > /data/k8s/config/kube-controller-manager.conf ...