题目: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 ;
}

最新文章

  1. 记安装EP时在指定BCP账户信息时提示AOS无法访问的解决方法
  2. SVG简介
  3. Ionic学习笔记三 Gulp在ionic中的使用
  4. NOIp Graph 1002 瞎眼记
  5. MVC &ndash; 4.mvc初体验(1)
  6. LightOJ1068 Investigation(数位DP)
  7. Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA
  8. LeetCode——Pascal&amp;#39;s Triangle
  9. python-冒泡排序,升序、降序
  10. J2EE进阶(八)Hibernate与延迟加载机制探究
  11. Robot Framework源码解析(2) - 执行测试的入口点
  12. python之str字符串
  13. vue生命周期学习(watch跟computed)
  14. 如果你的ie内核浏览器总是缓冲数据的话
  15. 获取cookie后,使用cookie进行接下来的自动化操作
  16. Oracle 未能加载文件或程序集Oracle.DataAccess
  17. Django的session学习
  18. [线段树]picture
  19. hdu-1033(格式)
  20. mysql数据库切分

热门文章

  1. h5调用手机照相机
  2. Python+Selenium ----unittest单元测试框架
  3. idea主要设置大纲图
  4. MySQL windows集群(转)
  5. 使用 Kingfisher 处理网络图片的读取与缓存
  6. 一步一步教你在 Android 里创建自己的账号系统(一)
  7. hive编程入门课程(加精)
  8. Java多态特性:重载和覆写的比較
  9. 1367: [Baltic2004]sequence
  10. java编程之JDBC