[codeforces/gym/101350/L]维护“凸包”
题目链接: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]维护“凸包”的更多相关文章
- 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 ...
- 【Codeforces Gym 100725K】Key Insertion
Codeforces Gym 100725K 题意:给定一个初始全0的序列,然后给\(n\)个查询,每一次调用\(Insert(L_i,i)\),其中\(Insert(L,K)\)表示在第L位插入K, ...
- Codeforces Gym 101190M Mole Tunnels - 费用流
题目传送门 传送门 题目大意 $m$只鼹鼠有$n$个巢穴,$n - 1$条长度为$1$的通道将它们连通且第$i(i > 1)$个巢穴与第$\left\lfloor \frac{i}{2}\rig ...
- 【CF932F】Escape Through Leaf 启发式合并set维护凸包
[CF932F]Escape Through Leaf 题意:给你一棵n个点的树,每个点有树形ai和bi,如果x是y的祖先,则你可以从x花费$a_x\times b_y$的费用走到y(费用可以为负). ...
- 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 ...
- 【bzoj3533】[Sdoi2014]向量集 线段树+STL-vector维护凸包
题目描述 维护一个向量集合,在线支持以下操作:"A x y (|x|,|y| < =10^8)":加入向量(x,y);"Q x y l r (|x|,|y| < ...
- 【bzoj4311】向量 线段树对时间分治+STL-vector维护凸包
题目描述 你要维护一个向量集合,支持以下操作: 1.插入一个向量(x,y) 2.删除插入的第i个向量 3.查询当前集合与(x,y)点积的最大值是多少.如果当前是空集输出0 输入 第一行输入一个整数n, ...
- 【bzoj5089】最大连续子段和 分块+单调栈维护凸包
题目描述 给出一个长度为 n 的序列,要求支持如下两种操作: A l r x :将 [l,r] 区间内的所有数加上 x : Q l r : 询问 [l,r] 区间的最大连续子段和. 其中,一 ...
- codeforces gym 100553I
codeforces gym 100553I solution 令a[i]表示位置i的船的编号 研究可以发现,应是从中间开始,往两边跳.... 于是就是一个点往两边的最长下降子序列之和减一 魔改树状数 ...
随机推荐
- lintcode 二叉树后序遍历
/** * Definition of TreeNode: * class TreeNode { * public: * int val; * TreeNode *left, *right; * Tr ...
- 返回json数组的GET接口
Action() { web_reg_find("Search=Body", "SaveCount=find_cnt", "Text=code\&qu ...
- 查找 二叉树中 k1 到 k2区间的节点
vector<int> res; int key1, key2; void traverse(TreeNode * root){//采用前序遍历 if(root == NULL) retu ...
- LeetCode - 167. Two Sum II - Input array is sorted - O(n) - ( C++ ) - 解题报告
1.题目大意 Given an array of integers that is already sorted in ascending order, find two numbers such t ...
- leetcode个人题解——#5 Container with most water
class Solution { public: string longestPalindrome(string s) { int length = s.length(); ) return s; ; ...
- POJ 3675 Telescope(简单多边形和圆的面积交)
Description Updog is watching a plane object with a telescope. The field of vision in the telescope ...
- 《软件工程实践》第五次作业-WordCount进阶需求 (结对第二次)
在文章开头给出结对同学的博客链接.本作业博客的链接.你所Fork的同名仓库的Github项目地址 本作业博客链接 github pair c 031602136魏璐炜博客 031602139徐明盛博客 ...
- [zt]手把手教你写对拍程序(PASCAL)
谁适合看这篇文章? ACMERS,OIERS或其它参加算法竞赛或需要算法的人 对操作系统并不太熟悉的人 不会写对拍的人 在网上找不到一个特别详细的对拍样例的人 不嫌弃我写的太低幼的人 前言 在NOIP ...
- bwapp之xss(blog)
存储型XSS,持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方,加入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行.这种XSS比较危险,容易造 ...
- Android基础------高级ul:消息对话框
前言:Android消息对话框提示笔记,刚刚接触Android 1.经典模式 //列表对话框 //经典模式 public void listdialog_01(View view){ final St ...