bzoj2957:楼房重建
题意:http://www.lydsy.com/JudgeOnline/problem.php?id=2957
sol :首先考虑转化问题,即给你一个斜率序列,让你动态维护单调栈
考虑线段树,令get(x,r)表示以r为初值在节点x时会增加多少个数
递归处理,get(x,r)=get(lson[x],r)+get(rson[x],max(mx[lson[x]],r))
然而这样复杂度是爆炸的.....考虑预处理get(rson[x],mx[lson[x]])
这样的话每次查询答案分为以下情况
mx[lson[x]]>=r,这样的话右边已经预处理好了,递归左边即可
mx[lson[x]]<r,这样的话左边的贡献为0,递归右边即可
那么我们只需维护get(rson[x],mx[lson[x]])即可
对于每次将位置pos修改为val,仅会对其右侧产生影响,分为以下情况
若val<=mx[lson[x]],则对get(rson[x],mx[lson[x]])无影响
若val>mx[lson[x]],那么递归进右边处理
最终复杂度O(n*log^2)
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
using namespace std;
const int Mx=;
int n,m,l[Mx],r[Mx],lson[Mx],rson[Mx],ans[Mx];
double maxn[Mx]; void build(int x,int L,int R)
{
l[x]=L,r[x]=R;lson[x]=x*,rson[x]=x*+;
if(L==R) return ;
int mid=(L+R)/;
build(lson[x],L,mid);
build(rson[x],mid+,R);
} int cal(int x,double val)
{
int L=l[x],R=r[x];
if(L==R) return maxn[x]>val;
if(maxn[lson[x]]<=val) return cal(rson[x],val);
return ans[x]-ans[lson[x]]+cal(lson[x],val);
} void change(int x,int pos,double c)
{
int L=l[x],R=r[x],mid=(L+R)/;
if(L==R) { ans[x]=,maxn[x]=c; return ; }
if(pos<=mid) change(lson[x],pos,c);
else change(rson[x],pos,c);
maxn[x]=max(maxn[lson[x]],maxn[rson[x]]);
ans[x]=ans[lson[x]]+cal(rson[x],maxn[lson[x]]);
} int main()
{
scanf("%d%d",&n,&m);
build(,,n);
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
change(,x,(double) y/x);
printf("%d\n",ans[]);
}
return ;
}
bzoj2957:楼房重建的更多相关文章
- BZOJ2957: 楼房重建(线段树&LIS)
2957: 楼房重建 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 3727 Solved: 1793[Submit][Status][Discus ...
- Bzoj2957 楼房重建
Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 1516 Solved: 723[Submit][Status][Discuss] Descripti ...
- [bzoj2957][楼房重建] (线段树)
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- 【数据结构】bzoj2957楼房重建
Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些 ...
- 【分块】bzoj2957 楼房重建
http://www.cnblogs.com/wmrv587/p/3843681.html ORZ 分块大爷.思路很神奇也很清晰. 把 块内最值 和 块内有序 两种良好的性质结合起来,非常棒地解决了这 ...
- 【经典问题】bzoj2957: 楼房重建
经典问题:动态维护上升子序列长度 进阶问题:[经典问题]#176. 栈 Description 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无 ...
- BZOJ2957 楼房重建 【线段树】
题目 小A的楼房外有一大片施工工地,工地上有N栋待建的楼房.每天,这片工地上的房子拆了又建.建了又拆.他经常无聊地看着窗外发呆,数自己能够看到多少栋房子. 为了简化问题,我们考虑这些事件发生在一个二维 ...
- bzoj2957 楼房重建——线段树
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树维护两个值:cnt 能看到的最多楼房数: mx 最大斜率数: 对于一段区间,从左 ...
- BZOJ2957: 楼房重建(分块)
题意 题目链接 Sol 自己YY出了一个\(n \sqrt{n} \log n\)的辣鸡做法没想到还能过.. 可以直接对序列分块,我们记第\(i\)个位置的值为\(a[i] = \frac{H_i}{ ...
- bzoj2957楼房重建
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957 线段树.每个点记录斜率,要一个单增的序列长度(从1开始). 线段树每个点记录自己区间的 ...
随机推荐
- Zeppelin interperter 模式设置总结图解2
该配置是在zeppelin的Interpreter的后台配置文件:conf/Interpreter.json spark Interpreter的模块定义那里.特别感谢开发团队组长大神的提示,深入挖掘 ...
- Lucene简单总结
Lucene API Document Document:文档对象,是一条原始数据 文档编号 文档内容 1 谷歌地图之父跳槽FaceBook 2 谷歌地图之父加盟FaceBook 3 谷歌地图创始人拉 ...
- PHP审计(一)
一.php中常见的危险函数和审计要点 危险函数(功能过于强大) 参数是否外部可控,有没有正确的过滤. PHP获取外界传入参数是通过下面几个全局函数的形式,所以审计参数传入经常要和下面几个变量打交 ...
- 9.2python操作redis
Redis redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合).zset(sorte ...
- 001.我的第一个Java程序
第一步安装JDK 第二步设置PATH路径 设置Windows的PATH 路径 方法一:直接设置添加PATH C:\Program Files\Java\jdk1.8.0_92\bin 方法二: 先增加 ...
- 洛谷P1331 海战
海战 题目链接 这还是一道联通块的题,只是需要判断是否存在以下四种情况: o. .o oo oo oo oo o. .o 如果存在就是Bad placement. 要注意标记以下,不然会出现多次输出B ...
- Python 定义及使用结构体
Python中没有专门定义结构体的方法,但可以使用class标记定义类来代替结构体,其成员可以在构造函数__init__中定义,具体方法如下. class seqNode: def __init__( ...
- 剑指Offer - 九度1371 - 最小的K个数
剑指Offer - 九度1371 - 最小的K个数2013-11-23 15:45 题目描述: 输入n个整数,找出其中最小的K个数.例如输入4,5,1,6,2,7,3,8这8个数字,则最小的4个数字是 ...
- 《Cracking the Coding Interview》——第11章:排序和搜索——题目7
2014-03-21 22:05 题目:给你N个盒子堆成一座塔,要求下面盒子的长和宽都要严格大于上面的.问最多能堆多少个盒子? 解法1:O(n^2)的动态规划解决.其实是最长递增子序列问题,所以也可以 ...
- js点击重置按钮重置表单
<html><head><script type="text/javascript">function formReset(){document ...