P3130 [USACO15DEC]计数haybalesCounting Haybales
P3130 [USACO15DEC]计数haybalesCounting Haybales
1)给定一段连续的田地,给每一个田地都增加一些新的草包。
2)给定一段连续的田地,找出草包最少的田地有多少草包。
3)给定一段连续的田地,统计一共有多少草包。
错误日志: \(pushdown\) 时记录懒标记用了 \(int\) , 下次(在没有把握的情况下)应全部替换
Solution
线段树, 懒标记, 靠前练手
Code
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#include<climits>
#define LL long long
using namespace std;
LL RD(){
LL out = 0,flag = 1;char c = getchar();
while(c < '0' || c >'9'){if(c == '-')flag = -1;c = getchar();}
while(c >= '0' && c <= '9'){out = out * 10 + c - '0';c = getchar();}
return flag * out;
}
const LL maxn = 400019;
LL num, na;
LL v[maxn];
#define lid (id << 1)
#define rid (id << 1) | 1
struct seg_tree{
LL l, r;
LL min, sum, lazy;
}tree[maxn << 2];
void pushup(LL id){
tree[id].sum = tree[lid].sum + tree[rid].sum;
tree[id].min = min(tree[lid].min, tree[rid].min);
}
void build(LL id, LL l, LL r){
tree[id].l = l, tree[id].r = r;
if(l == r){
tree[id].min = tree[id].sum = v[l];
return ;
}
LL mid = (l + r) >> 1;
build(lid, l, mid), build(rid, mid + 1, r);
pushup(id);
}
void pushdown(LL id){
if(tree[id].lazy != 0){
LL val = tree[id].lazy;
tree[lid].sum += val * (tree[lid].r - tree[lid].l + 1);
tree[rid].sum += val * (tree[rid].r - tree[rid].l + 1);
tree[lid].min += val;
tree[rid].min += val;
tree[lid].lazy += val;
tree[rid].lazy += val;
tree[id].lazy = 0;
}
}
void update(LL id, LL val, LL l, LL r){
pushdown(id);
if(tree[id].l == l && tree[id].r == r){
tree[id].lazy += val;
tree[id].sum += val * (tree[id].r - tree[id].l + 1);
tree[id].min += val;
return ;
}
LL mid = (tree[id].l + tree[id].r) >> 1;
if(mid < l)update(rid, val, l, r);
else if(mid >= r)update(lid, val, l, r);
else update(lid, val, l, mid), update(rid, val, mid + 1, r);
pushup(id);
}
LL get_sum(LL id, LL l, LL r){
pushdown(id);
if(tree[id].l == l && tree[id].r == r){
return tree[id].sum;
}
LL mid = (tree[id].l + tree[id].r) >> 1;
if(mid < l)return get_sum(rid, l, r);
else if(mid >= r)return get_sum(lid, l, r);
else return get_sum(lid, l, mid) + get_sum(rid, mid + 1, r);
}
LL get_min(LL id, LL l, LL r){
pushdown(id);
if(tree[id].l == l && tree[id].r == r){
return tree[id].min;
}
LL mid = (tree[id].l + tree[id].r) >> 1;
if(mid < l)return get_min(rid, l, r);
else if(mid >= r)return get_min(lid, l, r);
else return min(get_min(lid, l, mid), get_min(rid, mid + 1, r));
}
int main(){
num = RD(), na = RD();
for(LL i = 1;i <= num;i++)v[i] = RD();
build(1, 1, num);
char cmd;
while(na--){
cin>>cmd;
LL l = RD(), r = RD();
if(cmd == 'M')printf("%lld\n", get_min(1, l, r));
else if(cmd == 'S')printf("%lld\n", get_sum(1, l, r));
else{
LL val = RD();
update(1, val, l, r);
}
}
return 0;
}
P3130 [USACO15DEC]计数haybalesCounting Haybales的更多相关文章
- 洛谷 P3130 [USACO15DEC]计数haybalesCounting Haybales
P3130 [USACO15DEC]计数haybalesCounting Haybales 题目描述 Farmer John is trying to hire contractors to help ...
- 洛谷P3130 haybalesCounting Haybale P 题解
题目 [USACO15DEC]haybalesCounting Haybale P 题解 最近刚刚自学了线段树这个数据结构,恰巧做到了这道线段树的模板题.其实也没有什么好多说的,接触过线段树的大犇肯定 ...
- 计数排序(counting-sort)——算法导论(9)
1. 比较排序算法的下界 (1) 比较排序 到目前为止,我们已经介绍了几种能在O(nlgn)时间内排序n个数的算法:归并排序和堆排序达到了最坏情况下的上界:快速排序在平均情况下达到该上界. ...
- Objective-C内存管理之引用计数
初学者在学习Objective-c的时候,很容易在内存管理这一部分陷入混乱状态,很大一部分原因是没有弄清楚引用计数的原理,搞不明白对象的引用数量,这样就当然无法彻底释放对象的内存了,苹果官方文档在内存 ...
- 最小生成树计数 bzoj 1016
最小生成树计数 (1s 128M) award [问题描述] 现在给出了一个简单无向加权图.你不满足于求出这个图的最小生成树,而希望知道这个图中有多少个不同的最小生成树.(如果两颗最小生成树中至少有一 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- [LeetCode] Count and Say 计数和读法
The count-and-say sequence is the sequence of integers beginning as follows:1, 11, 21, 1211, 111221, ...
- C++ 引用计数技术及智能指针的简单实现
一直以来都对智能指针一知半解,看C++Primer中也讲的不够清晰明白(大概是我功力不够吧).最近花了点时间认真看了智能指针,特地来写这篇文章. 1.智能指针是什么 简单来说,智能指针是一个类,它对普 ...
- css-列表或标题的多级计数
利用css实现多级计数,比如1/1.1/1.1.1这种层层嵌套的计数,主要利用到counter-reset/counter-increment/counter/content/:before. 一.标 ...
随机推荐
- OO第二阶段作业总结
第五次作业: 设计策略: 本次作业设计的基本思路是按照指导书所给的推荐方法来完成的,即共用对象为队列盘,线程有电梯.调度器.以及扫描器,扫描器将控制台输入的有效指令加入到队列盘中,调度 ...
- js弹出框 -搜索
警告框alert() alert是警告框,只有一个按钮“确定”无返回值,警告框经常用于确保用户可以得到某些信息.当警告框出现后,用户需要点击确定按钮才能继续进行操作.语法:alert("文本 ...
- Intellij IDEA中file size exceeds configured limit解决
把Hadoop源码导入IDEA中后,其中有个ClientNamenodeProtocolProtos文件代码高达82997行,IDEA直接就不把它当java类看了,报file size exceeds ...
- 《构建之法》第8,9,10章读后感&sprint1个人总结
第8章 这一章主要介绍需求分析.具体说明了软件需求的类型.利益相关者,获取用户需求分析的常用方法与步骤.竞争性需求分析的框架NABCD,四象限方法以及项目计划和估计的技术.需求分析是决定一个软件的使用 ...
- [PPT] PPT 录制视频功能.
1. 需要PPT 里面增加进截图, 发现还不如 直接插入视频合理 本来想了一种方式是 使用 screen to gif 的工具 生成gif 来处理. 后来 发现ppt 里面自带一个 屏幕录制功能. 2 ...
- 自己用过的web软件tools软件以及玩过的游戏
三年大学世界 最经常用的web网站估计就是淘宝了 最经常使用的工具软件也就是 Microsoft office,而最经常玩的游戏就是英雄联盟了一款pvp对战游戏 淘宝自不必说 可以称为国内最大 ...
- javascript获取当前日期和时间
){ ){ _time = year+"-"+month+"-"+date+" "+hour+":"+minu+&quo ...
- L2 L3 L4
第二层交换机,是根据第二层数据链路层的MAC地址和通过站表选择路由来完成端到端的数据交换的.因为站表的建立与维护是由交换机自动完成,而路由器又是属于第三层设备,其寻址过程是根据IP地址寻址和通过路由表 ...
- C# QR二维码DEMO
QR二维码 二维码的一种 相关类库 ThoughtWorks.QRCode 第三方类库 DEMO功能 Encode 生成二维码图片 Encoding 编码 Correction Level 等级 Ve ...
- 过滤器将获取到的内容注入到servlet的request中
过滤器将获取到的内容注入到servlet的request中