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开始). 线段树每个点记录自己区间的 ...
随机推荐
- Maven_项目管理工具
Maven 一.Maven是apache下的一个开源项目,是纯java开发,并且只是用来管理java项目的 二.Maven的好处: 0.节省空间:对jar包做了统一管理 依赖管理,项目里无需放jar包 ...
- http协议组成(请求状态码)
http请求由:请求行:消息报头:请求正文组成 //请求行 Request URL: http://172.32.4.33:8080/operation/v2/autoServer/queryAuto ...
- 完善压缩处理类(支持主流的图像类型(jpg、png、gif)
<?php /* * 图像压缩 */ class Thumb { //成员属性 private $file; //原图文件 private $thumb_path; //压缩文本件保存的地址 / ...
- css 菱形写法
<!DOCTYPE html><html> <head> <meta charset="UTF-8"> <title>& ...
- mysql悲观锁与乐观锁
简介 数据库管理系统(DBMS)中的并发控制的任务是确保在多个事务同时存取数据库中同一数据时不破坏事务的隔离性和统一性以及数据库的统一性. 用途 乐观锁和悲观锁是并发控制主要采用的技术手段.无论是悲观 ...
- Deepin15.7 更改软件的jdk
最近更新了系统,发现smartsvn.smartgit.Dbeaver都无法打开了,上网googlel一下,发现是java9的问题,需要把软件的java版本更改一下就可以了 先上jdk的位置 一.sm ...
- HNU暑假训练第一场C.Ninja Map
一.题目大意 Intersections of Crossing Path City are aligned to a grid. There are N east-west streets whic ...
- 20145202 《Java程序设计》第四周学习总结
继承:打破了封装性 extends 1.提高了代码的复用性. 2.让类与类之间产生了关系,有了这个关系,才有了多态的特性. 3.必须是类与类之间有所属类关系才可以继承. 4.java只支持单继承不支持 ...
- 顺序查找&二分查找&索引查找
1.查找技术的分类.如下图: 2.什么是顺序查找呢?(无序表) 顺序查找的原理很简单,就是遍历整个列表,逐个进行记录的关键字与给定值比较,若某个记录的关键字和给定值相等,则查找成功,找到所查的记录.如 ...
- js 请求异常重连或断线后联网重连机制(ajax)
转到到 https://blog.csdn.net/mengtoumingren/article/details/80296788