题目链接: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控制流语句——while 语句

    while 语句 Python 中 while 语句能够让你在条件为真的前提下重复执行某块语句. while 语句是 循环(Looping) 语句的一种.while 语句同样可以拥有 else 子句作 ...

  2. vuex -- vue的状态管理模式

    Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式.它采用集中式存储管理应用的所有组件的状态,并以相应的规则保证状态以一种可预测的方式发生变化. 状态管理模式.集中式存储管理 一听就很高大 ...

  3. 关于TensorFlow的GPU设置

    摘自:https://blog.csdn.net/byron123456sfsfsfa/article/details/79811286 1.  在使用GPU版的TensorFlow跑程序的时候,如果 ...

  4. 数据库性能优化之SQL优化

    网上有关SQL优化的方案有很多,但多是杂乱无章.近日闲暇抽空整理了一下,方便大家以后的查阅,若发现其中有什么问题和不全,欢迎大家在下面纠正和补充: 1. 对于SQL语句的性能优化,主要体现在对于查询语 ...

  5. java得到当前时间

    SimpleDateFormat timeformat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); java.util.Date ...

  6. java 基础 --集合--012

    1, 数组与集合 A:长度不同 数组的长度固定,集合的长度可变 B:内容不同 数组里存储的是同一种类型的元素,而集合可以存储不同类型的元素 C:元素的数据类型问题 数组可以存储基本数据类型,也可以存储 ...

  7. 【转】关于增量链接(incremental linking)

    增量链接(Incremental Linking)这个词语在使用Visual C++时经常会遇到(其实不只是VS系列,其它链接器也有这个特性), 就比如经常遇到的:上一个增量链接没有生成它, 正在执行 ...

  8. Chrome Extensions API & options

    Chrome Extensions API options https://developer.chrome.com/extensions https://developer.chrome.com/e ...

  9. [C/C++] 友元函数和友元类

    A---友元函数: class Data{ public: ... friend int f(int &m);//友元函数 ... } 友元函数是可以直接访问类的私有成员的非成员函数.它是定义 ...

  10. [剑指Offer] 44.翻转单词顺序列

    题目描述 牛客最近来了一个新员工Fish,每天早晨总是会拿着一本英文杂志,写些句子在本子上.同事Cat对Fish写的内容颇感兴趣,有一天他向Fish借来翻看,但却读不懂它的意思.例如,“student ...