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. 一.标 ...
随机推荐
- java判断字符串编码
是 public static String getEncoding(String str){ String encoding = "UTF-8"; try { if (str.e ...
- 20172321『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结
20172321『Java程序设计』课程 结对编程练习_四则运算第二周阶段总结 结对伙伴 学号 :20172324 姓名 :曾程 伙伴第一周博客地址: 对结对伙伴的评价:一个很优秀的同学,在这次项目中 ...
- 团队冲刺--Seven
昨天: 司宇航:测试功能版块,优化功能版块. 马佳慧:优化界面 . 王金萱:合并程序. 季方: 合并程序. 今天: 司宇航:优化功能版块. 马佳慧:优化界面 . 王金萱:优化界面. 季方: 完善功 ...
- eclipse 中使用git
1.安装egit插件,在新版的eclipse中已经集成了这个插件,省了不少时间, 旧版的eclipse可以在help->install new software中点击add,写入名称,网址具体如 ...
- NABCD模型分析
1.N——need需求 目前,学习英语是所有学生会面临的问题.提高词汇量对学习英语是十分必要的,尤其是对大学生来说对手机的使用特别频繁,我们提高英语词汇量也应该把手机更好的利用起来,利用自己对手机的使 ...
- System 类的使用
/*System 系统类 主要用于获取系统的属性数据.System类常用的方法: arraycopy(Object src, int srcPos, Object dest, int destPos, ...
- java的小学生四则运算
import java.awt.*; import java.awt.event.*; import java.io.FileNotFoundException; import java.io.IOE ...
- Java实现小学四则运算练习
Github项目地址:https://github.com/feser-xuan/Arithmetic.git 1.需求分析 软件基本功能要求如下: 程序可接收一个输入参数n,然后随机产生n道加减乘 ...
- 使用testng多线程来测试成交编号重复的问题
1.首先编写一个测试用的 function CREATE OR REPLACE FUNCTION getDealmainNo_test(dealdate IN varchar2, productcod ...
- ecplise maven springmvc工程搭建
转载自:https://www.cnblogs.com/crazybirds/p/4643497.html 内网上网代理配置: 第一步:新建maven项目,选择Maven Project,如图1. ...