容易想到把楼房高度转化为斜率,然后就是求x1,x2,x3...使x1<x2<x3...,考虑用线段树维护区间Ans与Max,时间复杂度O(nlog^2n)。
#include<iostream>
#include<cstdio>
#define N 100005
using namespace std;
int n,m,x,y,see[N*4];
double Max[N*4];
int Get(int k,int l,int r,double x)
{
if (l==r) return Max[k]>x;
int mid=(l+r)>>1,L=k<<1,R=L|1;
if (Max[L]<=x) return Get(R,mid+1,r,x);
else return see[k]-see[L]+Get(L,l,mid,x);
}
void mdy(int k,int l,int r,int x,double y)
{
if (l==r){Max[k]=y;see[k]=1;return;}
int mid=(l+r)>>1,L=k<<1,R=L|1;
if (x<=mid) mdy(L,l,mid,x,y);
else mdy(R,mid+1,r,x,y);
Max[k]=max(Max[L],Max[R]);
see[k]=see[L]+Get(R,mid+1,r,Max[L]);
}
int main()
{
scanf("%d%d",&n,&m);
for (;m--;)
{
scanf("%d%d",&x,&y);
mdy(1,1,n,x,(double)y/x);
printf("%d\n",see[1]);
}
return 0;
}