[题目链接]

https://www.lydsy.com/JudgeOnline/problem.php?id=4392

[算法]

线段树

时间复杂度 : O(MlogN)

[代码]

#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010
typedef long long LL; int n , m;
LL a[MAXN]; struct SegmentTree
{
struct Node
{
int l , r;
LL sum , val;
LL tag;
} Tree[MAXN << ];
inline void build(int index , int l , int r)
{
Tree[index].l = l;
Tree[index].r = r;
Tree[index].tag = ;
if (l == r)
{
Tree[index].sum = Tree[index].val = a[l];
return;
}
int mid = (l + r) >> ;
build(index << , l , mid);
build(index << | , mid + , r);
update(index);
}
inline void update(int index)
{
Tree[index].sum = Tree[index << ].sum + Tree[index << | ].sum;
Tree[index].val = min(Tree[index << ].val , Tree[index << | ].val);
}
inline void pushdown(int index)
{
int l = Tree[index].l , r = Tree[index].r;
int mid = (l + r) >> ;
Tree[index << ].sum += Tree[index].tag * (mid - l + );
Tree[index << | ].sum += Tree[index].tag * (r - mid);
Tree[index << ].val += Tree[index].tag;
Tree[index << | ].val += Tree[index].tag;
Tree[index << ].tag += Tree[index].tag;
Tree[index << | ].tag += Tree[index].tag;
Tree[index].tag = ;
}
inline void modify(int index , int l , int r , LL value)
{
if (Tree[index].l == l && Tree[index].r == r)
{
Tree[index].sum += (r - l + ) * value;
Tree[index].val += value;
Tree[index].tag += value;
return;
}
pushdown(index);
int mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= r) modify(index << , l , r , value);
else if (mid + <= l) modify(index << | , l , r , value);
else
{
modify(index << , l , mid , value);
modify(index << | , mid + , r , value);
}
update(index);
}
inline LL query_sum(int index , int l , int r)
{
if (Tree[index].l == l && Tree[index].r == r) return Tree[index].sum;
pushdown(index);
int mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= r) return query_sum(index << , l , r);
else if (mid + <= l) return query_sum(index << | , l , r);
else return query_sum(index << , l , mid) + query_sum(index << | , mid + , r);
}
inline LL query_min(int index , int l , int r)
{
if (Tree[index].l == l && Tree[index].r == r) return Tree[index].val;
pushdown(index);
int mid = (Tree[index].l + Tree[index].r) >> ;
if (mid >= r) return query_min(index << , l , r);
else if (mid + <= l) return query_min(index << | , l , r);
else return min(query_min(index << , l , mid) , query_min(index << | , mid + , r));
}
} T; template <typename T> inline void chkmax(T &x , T y) { x = max(x , y); }
template <typename T> inline void chkmin(T &x , T y) { x = min(x , y); }
template <typename T> inline void read(T &x)
{
T f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) if (c == '-') f = -f;
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
} int main()
{ read(n); read(m);
for (int i = ; i <= n; i++) read(a[i]);
T.build( , , n);
while (m--)
{
char op[];
scanf("%s",op);
if (op[] == 'P')
{
int l , r;
LL x;
read(l); read(r); read(x);
T.modify( , l , r , x);
}
if (op[] == 'S')
{
int l , r;
read(l); read(r);
printf("%lld\n" , T.query_sum( , l ,r));
}
if (op[] == 'M')
{
int l , r;
read(l); read(r);
printf("%lld\n", T.query_min( , l , r));
}
} return ;
}

[Usaco2015 DEC] Counting Haybales的更多相关文章

  1. bzoj 4747: [Usaco2016 Dec]Counting Haybales

    23333,在扒了一天题解之后发现我竟然还能秒题,虽然这是个pj的sb题... (排个序,然后upper_bound和lower_bound一用就行了(是不是有O(1)的查询方法啊??貌似要离散啊,一 ...

  2. [Usaco2016 Dec]Counting Haybales

    原题链接https://www.lydsy.com/JudgeOnline/problem.php?id=4747 先将原数组排序,然后二分查找即可.时间复杂度\(O((N+Q)logN)\). #i ...

  3. bzoj 4397: [Usaco2015 dec]Breed Counting -- 前缀和

    4397: [Usaco2015 dec]Breed Counting Time Limit: 10 Sec  Memory Limit: 128 MB Description Farmer John ...

  4. bzoj4397【Usaco2015 Dec】Breed Counting

    4397: [Usaco2015 dec]Breed Counting Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 29  Solved: 25 ...

  5. bzoj4397[Usaco2015 dec]Breed Counting*

    bzoj4397[Usaco2015 dec]Breed Counting 题意: 给定一个长度为N的序列,每个位置上的数只可能是1,2,3中的一种.有Q次询问,每次给定两个数a,b,请分别输出区间[ ...

  6. BZOJ 4390: [Usaco2015 dec]Max Flow

    4390: [Usaco2015 dec]Max Flow Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 177  Solved: 113[Submi ...

  7. Counting Haybales

    Counting Haybales 题目描述 Farmer John is trying to hire contractors to help rearrange his farm, but so ...

  8. 【BZOJ4391】[Usaco2015 dec]High Card Low Card(贪心)

    [BZOJ4391][Usaco2015 dec]High Card Low Card(贪心) 题面 BZOJ 题解 预处理前缀后缀的结果,中间找个地方合并就好了. #include<iostr ...

  9. [Usaco2015 dec]Max Flow 树上差分

    [Usaco2015 dec]Max Flow Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 353  Solved: 236[Submit][Sta ...

随机推荐

  1. [luoguP2618] 数字工程(DP)

    传送门 离线处理... 先线性筛一遍. 直接预处理出所有答案. 注意要用push,用乘法,常数小. #include <cstdio> #include <cstring> # ...

  2. 【二分+交互】codeforces B. Glad to see you!

    codeforces.com/contest/809/problem/B 只需要找到2个被选中的,首先,注意到将区间二等分时左侧区间为[l,mid],右侧区间为[mid+1,r],dui(mid,mi ...

  3. 几道hash题

    1: UVa 10887 - Concatenation of Languages map 可以做 ,但是输入实在恶心,有空串之类的HASH模板: int Hash(char *s){   int s ...

  4. vue学习001 --环境搭建

    系统 : win cmd: cmder 链接:https://cmder.net/ 1.安装node.js 链接地址: http://cdn.npm.taobao.org/dist/node/v10. ...

  5. Mac BOOK PRO U盘安装windows7、8及8.1

    http://v.youku.com/v_show/id_XMTI1NjgzMzU0NA==.html http://jingyan.baidu.com/article/1709ad80b3d2f44 ...

  6. Excel小tips - 如何实现多列成绩统一排名

    本文参考:http://mp.weixin.qq.com/s/XR49hyG9Cods7rOcsM-tRg 如果有以下数据文件,需要进行成绩排名. 第一步:先在成绩列后边添加一列,用来显示名次.如下: ...

  7. 从ASP.NET Core 3.0 preview 特性,了解CLR的Garbage Collection

    前言 在阅读这篇文章:Announcing Net Core 3 Preview3的时候,我看到了这样一个特性: Docker and cgroup memory Limits We conclude ...

  8. 分析PMT changed for the ROM:it must be downloaded.升级失败。

    应用场景描写叙述: 同样项目不同版本号(不同分支),使用Smart Phone Flash Tool工具交叉升级,出现PMT changed for the ROM;it must be downlo ...

  9. Mockito的简单使用方法演示样例

    Mockito是一个流行的Mocking框架.它使用起来简单,学习成本非常低.并且具有非常简洁的API,測试代码的可读性非常高.因此它十分受欢迎,用 户群越来越多.非常多的开源的软件也选择了Mocki ...

  10. 选带傅里叶变换(zoom-fft)

    选带傅里叶变换的原理大家能够看书.大致的步骤为 移频 (将选带的中心频率移动到零频) 数字低通滤波器  (防止频率混叠) 又一次採样  (将採样的数据再次间隔採样,间隔的数据取决于分析的带宽,就是放大 ...