bzoj2957: 楼房重建

来源:互联网 发布:软件英语怎么说 编辑:程序博客网 时间:2024/06/09 16:06

容易想到把楼房高度转化为斜率,然后就是求x1,x2,x3...使x1<x2<x3...,考虑用线段树维护区间Ans与Max,时间复杂度O(nlog^2n)。

#include<iostream>#include<cstdio>#define N 100005using 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;}


0 0