bzoj2957楼房重建——线段树
2024-08-24 13:11:13
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2957
线段树维护原点到楼顶的斜率,可以知道答案就是从原点开始斜率递增的个数;
记录一个mx数组表示这一段上最大的斜率,二分,分类讨论,递归求解;
而且如果要取rs的长度,不是直接取tr[rs],而是总长度减去tr[ls],因为不能从右边一段的起点开始……
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int const MAXN=;
int n,m,tr[MAXN<<];
double xl[MAXN],mx[MAXN<<];
int find(int x,int l,int r,double w)
{
if(l==r)return xl[l]>w;
int ls=(x<<),rs=(x<<|);
int mid=((l+r)>>);
if(mx[ls]>w)return tr[x]-tr[ls]+find(ls,l,mid,w);
return find(rs,mid+,r,w);
}
void pushup(int x,int l,int r)
{
int mid=((l+r)>>);
int ls=(x<<),rs=(x<<|);
if(mx[ls]>=mx[rs])tr[x]=tr[ls],mx[x]=mx[ls];
else if(mx[ls]<xl[mid+])tr[x]=tr[ls]+tr[rs],mx[x]=mx[rs];
else
{
tr[x]=tr[ls]+find(rs,mid+,r,mx[ls]);
mx[x]=mx[rs];
}
}
void add(int nw,int L,int R,int l,int r,double w)
{
if(l==r)
{
tr[nw]=;mx[nw]=w;//!!!注意别把nw写成l
return;
}
int mid=((l+r)>>);
if(mid>=L)add(nw<<,L,R,l,mid,w);
if(mid<R)add(nw<<|,L,R,mid+,r,w);
pushup(nw,l,r);
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x;i<=m;i++)
{
double y;
scanf("%d%lf",&x,&y);
xl[x]=y/x;
add(,x,x,,n,xl[x]);
printf("%d\n",tr[]);
}
return ;
}
最新文章
- 记安装EP时在指定BCP账户信息时提示AOS无法访问的解决方法
- SVG简介
- Ionic学习笔记三 Gulp在ionic中的使用
- NOIp Graph 1002 瞎眼记
- MVC &ndash; 4.mvc初体验(1)
- LightOJ1068 Investigation(数位DP)
- Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA
- LeetCode——Pascal&;#39;s Triangle
- python-冒泡排序,升序、降序
- J2EE进阶(八)Hibernate与延迟加载机制探究
- Robot Framework源码解析(2) - 执行测试的入口点
- python之str字符串
- vue生命周期学习(watch跟computed)
- 如果你的ie内核浏览器总是缓冲数据的话
- 获取cookie后,使用cookie进行接下来的自动化操作
- Oracle 未能加载文件或程序集Oracle.DataAccess
- Django的session学习
- [线段树]picture
- hdu-1033(格式)
- mysql数据库切分