题目链接:http://codeforces.com/gym/101350/problems

给定n个墙,每个墙有一个高度,要支持动态修改墙的高度和查询这个“容器”能盛多少水。

(队友)观察发现,能盛的水的体积就等于这个容器的“凸包”的体积减去墙的体积。所以要做的就是动态的维护凸包。

由于只有墙上升的操作,所以只需要用一个区间覆盖区间求和的线段树维护每个位置的凸包上界就可以了。

维护凸包的关键在于最大值的位置,具体见代码。

#include<bits/stdc++.h>
using namespace std;
#define lson (i<<1)
#define rson (i<<1|1) const int maxn=;
long long tree[maxn<<];
int n;
int val[maxn];
int lz[maxn];
int len[maxn]; void push_up(int i)
{
tree[i]=tree[lson]+tree[rson];
} void push_down(int i)
{
if (!lz[i]) return;
lz[lson]=lz[i];
lz[rson]=lz[i];
tree[lson]=1ll*lz[i]*len[lson];
tree[rson]=1ll*lz[i]*len[rson];
lz[i]=;
} void build(int l,int r,int i=)
{
lz[i]=;
if (l==r)
{
tree[i]=val[l];
len[i]=;
}
else
{
int mid=(l+r)/;
build(l,mid,lson);
build(mid+,r,rson);
push_up(i);
len[i]=len[lson]+len[rson];
}
} void setval(int l,int r,int x,int nowl,int nowr,int i=)
{
if (l==nowl&&r==nowr)
{
lz[i]=x;
tree[i]=1ll*x*len[i];
}
else
{
push_down(i);
int mid=(nowl+nowr)/;
if (r<=mid) setval(l,r,x,nowl,mid,lson);
else if (l>mid) setval(l,r,x,mid+,r,rson);
else
{
setval(l,mid,x,nowl,mid,lson);
setval(mid+,r,x,mid+,nowr,rson);
}
push_up(i);
}
} long long query(int l,int r,int nowl,int nowr,int i=)
{
if (lz[i]) return 1ll*(r-l+)*lz[i];
if (l==nowl&&r==nowr) return tree[i];
else
{
int mid=(nowl+nowr)/;
if (r<=mid) return query(l,r,nowl,mid,lson);
else if (l>mid) return query(l,r,mid+,nowr,rson);
else return query(l,mid,nowl,mid,lson)+query(mid+,r,mid+,nowr,rson);
}
} int a[maxn]; int main()
{
int T;
scanf("%d",&T);
while (T--)
{
int n,q;
scanf("%d%d",&n,&q);
for (int i=;i<=n;i++) scanf("%d",&a[i]);
long long sum=;
for (int i=;i<=n;i++) sum+=a[i];
int ma=-,maj=-;
for (int i=;i<=n;i++) if (a[i]>ma) ma=a[i],maj=i;
int nowma=-;
for (int i=;i<=maj;i++)
{
nowma=max(nowma,a[i]);
val[i]=nowma;
}
nowma=-;
for (int i=n;i>=maj;i--)
{
nowma=max(nowma,a[i]);
val[i]=nowma;
}
build(,n);
while (q--)
{
char op[];
scanf("%s",op);
if (op[]=='P')
{
printf("%I64d\n",tree[]-sum);
}
else
{
int id,h;
scanf("%d%d",&id,&h);
sum+=h;
a[id]+=h;
if (query(id,id,,n)<a[id])
{
if (id==maj)
{
setval(id,id,a[id],,n);
}
else if (id<maj)
{
if (a[id]<=a[maj]) setval(id,maj-,a[id],,n);
else
{
setval(id+,maj,a[maj],,n);
setval(id,id,a[id],,n);
maj=id;
}
}
else
{
if (a[id]<=a[maj]) setval(maj+,id,a[id],,n);
else
{
setval(maj,id-,a[maj],,n);
setval(id,id,a[id],,n);
maj=id;
}
}
}
}
}
}
return ;
}

[codeforces/gym/101350/L]维护“凸包”的更多相关文章

  1. codeforces Gym 100187L L. Ministry of Truth 水题

    L. Ministry of Truth Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://codeforces.com/gym/100187/p ...

  2. 【Codeforces Gym 100725K】Key Insertion

    Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...

  3. Codeforces Gym 101190M Mole Tunnels - 费用流

    题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...

  4. 【CF932F】Escape Through Leaf 启发式合并set维护凸包

    [CF932F]Escape Through Leaf 题意:给你一棵n个点的树,每个点有树形ai和bi,如果x是y的祖先,则你可以从x花费$a_x\times b_y$的费用走到y(费用可以为负). ...

  5. Codeforces gym 101343 J.Husam and the Broken Present 2【状压dp】

     2017 JUST Programming Contest 2.0 题目链接:Codeforces gym 101343 J.Husam and the Broken Present 2 J. Hu ...

  6. 【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包

    题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < ...

  7. 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包

    题目描述 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 输入 第一行输入一个整数n, ...

  8. 【bzoj5089】最大连续子段和 分块+单调栈维护凸包

    题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A  l  r  x :将 [l,r] 区间内的所有数加上 x : Q  l  r : 询问 [l,r] 区间的最大连续子段和. 其中,一 ...

  9. codeforces gym 100553I

    codeforces gym 100553I solution 令a[i]表示位置i的船的编号 研究可以发现,应是从中间开始,往两边跳.... 于是就是一个点往两边的最长下降子序列之和减一 魔改树状数 ...

随机推荐

  1. python 终极篇 --- django 视图系统

    Django的View(视图) 一个视图函数(类),简称视图,是一个简单的Python 函数(类),它接受Web请求并且返回Web响应. 响应可以是一张网页的HTML内容,一个重定向,一个404错误, ...

  2. 搜索二维矩阵 II

    描述 写出一个高效的算法来搜索m×n矩阵中的值,返回这个值出现的次数. 这个矩阵具有以下特性: 每行中的整数从左到右是排序的. 每一列的整数从上到下是排序的. 在每一行或每一列中没有重复的整数. 样例 ...

  3. 《Effective C++》读书笔记 被你忽略的关于构造析构赋值

    如果程序员没有定义,那么编译器会默认隐式为你创建一个copy构造函数,一个copy赋值操作符,一个析构函数.另外如果你没有声明任何构造函数,编译器会为你声明一个default构造函数. 但是只有当这些 ...

  4. UVa -1584 Circular Sequence 解题报告 - C语言

    1.题目大意 输入长度为n$(2\le n\le 100)$的环状DNA串,找出该DNA串字典序最小的最小表示. 2.思路 这题特别简单,一一对比不同位置开始的字符串的字典序,更新result. 3. ...

  5. BZOJ 3166 HEOI2013 ALO 可持久化trie+st表

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=3166(洛谷上也有) 题意概述: 给出一个序列,对于一个区间,其权值为区间中的次大值亦或区 ...

  6. 正确使用memset

    今天做了一道素数打表的题我在使用一个数组记录是否为素数的时候使用了memset,将数组里面的数都清为1,代表是素数,不是素数,就改成0,我在判断这一个数是否为素数是依据也是是0还是1,结果一直存在问题 ...

  7. Alpha发布文案加美工展示

    目录 团队简介 项目进展 组内分工 队员总结 后期计划 一.团队简介 二.项目进展 从选题发布到今天的Alpha发布,我们团队经历了许许多多的磨难.我们最终设计了如下的功能:首页.班级.个人.更多.打 ...

  8. TCP系列36—窗口管理&流控—10、linux下的异常报文系列接收

    在这篇文章中我们看一下server端在接收到异常数据系列时的处理,主要目的是通过wireshark示例对这些异常数据系列的处理有一个直观的认识,感兴趣的自行阅读相关代码和协议,这里不再进行详细介绍 在 ...

  9. 移动端的picker参考vux

    参考vux移动端的ui组件,做了一个picker,测试在微信,uc主流浏览器能够正常工作.而在华为浏览器根本不能使用.而测试了vux的原有picker组件,发现在华为自带浏览器中,效果依然能够实现. ...

  10. 关于c++中public & private方法调用问题

    class IDNoIdentifier { public: IDNoIdentifier(); ~IDNoIdentifier(); typedef vector<cv::Rect> C ...