求一个伪LIS
维护斜率
求一个伪的LIS
就是从右到左上升的长度
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<iomanip>
using namespace std;
#define lc (p<<1)
#define rc (p<<1|1)
const int N=2e5+100;
const double eps=1e-15;
bool cmp(double sum){
if(fabs(sum)<eps)return 0;
else return sum>0?1:0;
}
struct Segment_Tree{
struct Node{
double maxSloop;
int sum;
}T[N<<2];
inline void Build(int p,int l,int r){
if(l==r){
T[p].maxSloop=0.0;
T[p].sum=0;
return;
}
int mid=(l+r)/2;
Build(lc,l,mid );
Build(rc,mid+1,r);
}
inline int Calc(int p,int l,int r,double height){
if(l==r){
return cmp(T[p].maxSloop-height)==1;
}
int mid=(l+r)/2;
if(cmp(T[lc].maxSloop-height)==1)return Calc(lc,l,mid,height)+T[p].sum-T[lc].sum;
else return Calc(rc,mid+1,r,height);
}
inline void Update(int p,int l,int r,int pos,double Sloop){
if(l==r){
T[p].maxSloop=Sloop;
T[p].sum=1;
return;
}
int mid=(l+r)/2;
if(pos<=mid)Update(lc,l,mid,pos,Sloop);
else Update(rc,mid+1,r,pos,Sloop);
T[p].maxSloop=max(T[lc].maxSloop,T[rc].maxSloop);
T[p].sum=T[lc].sum+Calc(rc,mid+1,r,T[lc].maxSloop);
}
}Tree;
int n,m;
int main(){
// freopen("test.in","r",stdin);
scanf("%d%d",&n,&m);
Tree.Build(1,1,n);
for(int i=1;i<=m;i++){
double x,y;
scanf("%lf%lf",&x,&y);
double Sloop=(y*1.0)/(x*1.0);
Tree.Update(1,1,n,(int)x,Sloop);
cout<<Tree.T[1].sum<<'\n';
}
}