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开始). 线段树每个点记录自己区间的 ...
随机推荐
- 【软件笔记】 ◆笔记·I◆ 各类冷门函数细解
[软件笔记·I] 各类冷门函数细解 ■题外话■ 总觉得作为一个志向远大的 coder (٩(◕‿◕。)۶),我觉得单单只会做题是不够的所以我开始尝试自己编写软件!初入道的我并不知道C++其实并不太适合 ...
- Python 对象(type/object/class) 作用域 一等函数 (慕课--Python高级,IO并发 第二章)
在python中一共有两种作用域:全局作用域和函数作用域全局作用域:在全局都有效,全局作用域在程序执行时创建,在程序执行结束时销毁:所有函数以外的区域都是全局作用域:在全局作用域中定义的变量,都属于全 ...
- TouTiao开源项目 分析笔记9 实现一个问答主页面
1.根据API返回创建几个基础的Bean 1.1.WendaArticleDataBean类 API返回的数据如下: /** * cell_type : 36 * extra : {"wen ...
- 抽象类的作用之一:sdk 传递你需要的参数
抽象类可以干什么?抽象类可以让别人必须做一件事情,比如实现一个方法. 那它有什么作用呢? 我开始也不知道啊,后来慢慢的知道了,在开发中,我知道了它是干什么的,怎么用的.比如你要写一个sdk给别人用.但 ...
- Category的真相
Objective-C 中的 Category 就是对设计模式中装饰模式的一种具体实现.它的主要作用是在不改变原有类的前提下,动态地给这个类添加一些方法. 使用场景 根据苹果官方文档对 Categor ...
- 《Cracking the Coding Interview》——第11章:排序和搜索——题目7
2014-03-21 22:05 题目:给你N个盒子堆成一座塔,要求下面盒子的长和宽都要严格大于上面的.问最多能堆多少个盒子? 解法1:O(n^2)的动态规划解决.其实是最长递增子序列问题,所以也可以 ...
- 19、AngularJs知识点总结 part-1
1.AngularJs AngularJs是一款JavaScript开源库,由Google维护,用来协助单一页面应用程序: AngularJs的目标是通过MVC模式增强基于浏览器的应用,使开发和测试变 ...
- JFinal Template Engine 使用
官方文档:JFinal Template Engine 文档
- Java进制间的转换
最近学习了Java间的进制转换,记录下自己的学习心得,希望可以帮到前来查看的朋友们,如果有不懂的地方可以在下方评论留言,我们一起学习进步,只有自己足够强大才能弥补不足,多学习, 任意进制到十进制的转换 ...
- UTXO是什么?
以易于理解的方式解释了比特币交易中的"UTXO" UTXO 2017年11月1日 让我们看看当你发一点硬币时会发生什么. 比特币交易通过UTXO执行.通过在比特硬币的所有交易中新生 ...