和Leo一起做爱线段树的好孩子CTT2012楼房重建

版权声明:LeoJAM Presents https://blog.csdn.net/fcb_x/article/details/82055820

求一个伪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';
	}
}

猜你喜欢

转载自blog.csdn.net/fcb_x/article/details/82055820