题目

[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. JS_点击事件_弹出窗口_自动消失

    <!doctype html> <html> <head> <meta charset="utf-8"/> <title> ...

  2. php-socket通信演示

    client: error_reporting(E_ALL); set_time_limit(0); echo "<h2>TCP/IP Connection</h2> ...

  3. 关于zend guard loard 扩展

    官网http://www.zend.com/en/products/loader/downloads#Linux 安装安装在READ.ME中 修改的php.ini是apache那边的 保存,重启下就行 ...

  4. Java8 Lambda表达式(二)

    目录 一.Java8 内置的四大核心函数式接口 1. 消费型接口 Consumer 2. 供给型接口 Supplier 3. 函数型接口 Function 4.断言型接口 Predicate 二.方法 ...

  5. K8S为什么要弃用Docker?Dockershim将移除

    一.背景由于最近知道了 K8s 新版本(v1.20)确定弃用 Docker 的消息,为了明确是否会对现有系统架构产生响,所以对涉及到的相关技术进行了一定的梳理(索性的是对现有的系统架构基本无影响:&g ...

  6. Sqlserver 关于varchar(max) 笔记

    看SQL server的版本,SQLserver2005以上 的nvarchar(max) 可以存放2G的内容,所以要是 SQL2005以上的nvarchar(max)足够你用的了.用nvarchar ...

  7. 用VirtualBox搭建虚拟局域网

    用 Oracle VM VirtualBox 安装虚拟机,我在Windows 7上安装了ubuntu 11.10和xubuntu12.04两个虚拟机: 将这两个虚拟机的"网络"属性 ...

  8. jd-gui或jad反编译工具bug

    文件1:A.class------------2020-09-01日版本 文件2:A.class------------2020-09-02日版本,代码内容有变动. bug出现条件:文件1或文件2同目 ...

  9. Shell-04-流程控制

    if语句 1 单分支 2 双分支 示例 3 多分支 for语句 语法 for 变量名 in 取值表; do 语句 done 1 {...} 2 $@ 将位置参数当作独立的字符串来处理 3 $* 所有的 ...

  10. Windows Go 开发环境下载、安装并配置

    前言 对于我们Windows用户而言,Go提供两种环境安装方式(源码安装除外): 1.MSI安装(MSI文件是Windows Installer的数据包,它实际上是一个数据库,包含安装一种产品所需要的 ...