题目链接: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. 基础的表ADT -数据结构(C语言实现)

    读数据结构与算法分析 表的概述 形如A1,A2,A3... 操作合集 PrintList MakeEmpty Find Insert Delete 表的简单数组实现 分析: PrintList和Fin ...

  2. Machine Learning笔记整理 ------ (二)训练集与测试集的划分

    在实际应用中,一般会选择将数据集划分为训练集(training set).验证集(validation set)和测试集(testing set).其中,训练集用于训练模型,验证集用于调参.算法选择等 ...

  3. day-14 回归中的相关系数和决定系数概念及Python实现

    衡量一个回归模型常用的两个参数:皮尔逊相关系数和R平方 一.皮尔逊相关系数 在统计学中,皮尔逊相关系数( Pearson correlation coefficient),又称皮尔逊积矩相关系数(Pe ...

  4. leetcode个人题解——#19 Remove Nth Node From End of List

    思路:设置两个指针,其中第二个指针比第一个延迟n个元素,这样,当第二个指针遍历到指针尾部时,对第一个指针进行删除操作. 当然,这题要注意一些边界值,比如输入[1,2] n=2时如果按照思路走会指向未分 ...

  5. Mybatis ResultMap(2)

    SQL 映射XML 文件是所有sql语句放置的地方.需要定义一个workspace,一般定义为对应的接口类的路径.写好SQL语句映射文件后,需要在MyBAtis配置文件mappers标签中引用,例如: ...

  6. C++与C#数据类型对应关系总结

    https://blog.csdn.net/u010159842/article/details/51720458 添加: 1.c++参数含有&,c#也需要用ref关键字. 2.在c++中声明 ...

  7. OSG学习:使用已有回调示例

    回调的类型有很多种,一般很容易就想到的是UpdateCallBack,或者EventCallBack,回调的意思就是说,你可以规定在某件事情发生时启动一个函数,这个函数可能做一些事情.这个函数就叫做回 ...

  8. PokeCats开发者日志(十)

      现在是PokeCats游戏开发的第三十三天的中午,收到了中国版权保护中心软件登记部发来的受理通知书.   上易版权看一眼,貌似离拿证不远了.   想一想还有点小激动呢!

  9. nginx 设置默认虚拟 host

    nginx 设置默认虚拟 host listren 80 default_server

  10. 【linux】- nohup 和 &

    &的意思是在后台运行, 什么意思呢? 意思是说,当你在执行 ./a.out & 的时候,即使你用ctrl C,那么a.out照样运行(因为对SIGINT信号免疫).但是要注意,如果你直 ...