【BZOJ2957】楼房重建(线段树)
2018-03-13 15:14
351 查看
【BZOJ2957】楼房重建(线段树)
题面
BZOJ题解
对于整个区间维护最大斜率以及只考虑这个区间的答案考虑如何向上合并。
首先左半段的答案是一定存在的
所以,现在的问题就是右半段能够贡献的答案
如果右半段的最大斜率小于左半段的最大斜率,则不存在贡献
否则,如果右半段分为右左和右右两段
如果右左的最大值大于了左半段的斜率,直接加上右右段的贡献
然后递归除了右左段
否则,直接递归处理右右段
直接说有点说不清,这题需要自己好好思考一下
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #include<set> #include<map> #include<vector> #include<queue> using namespace std; #define ll long long #define RG register #define MAX 120000 #define lson (now<<1) #define rson (now<<1|1) inline int read() { RG int x=0,t=1;RG char ch=getchar(); while((ch<'0'||ch>'9')&&ch!='-')ch=getchar(); if(ch=='-')t=-1,ch=getchar(); while(ch<='9'&&ch>='0')x=x*10+ch-48,ch=getchar(); return x*t; } int n,m; struct Node { double mk; int s; }t[MAX<<2]; int Query(int now,int l,int r,double K) { if(t[now].mk<=K)return 0; if(l==r)return 1; int mid=(l+r)>>1; if(t[lson].mk>=K)return Query(lson,l,mid,K)+t[now].s-t[lson].s; else return Query(rson,mid+1,r,K); } void Modify(int now,int l,int r,int p,int w) { if(l==r) { t[now].mk=1.0*w/p; t[now].s=1; return; } int mid=(l+r)>>1; if(p<=mid)Modify(lson,l,mid,p,w); else Modify(rson,mid+1,r,p,w); t[now].mk=max(t[lson].mk,t[rson].mk); t[now].s=t[lson].s+Query(rson,mid+1,r,t[lson].mk); } int main() { n=read();m=read(); while(m--) { int x=read(),y=read(); Modify(1,1,n,x,y); printf("%d\n",t[1].s); } return 0; }
相关文章推荐
- [bzoj2957][线段树]楼房重建
- BZOJ 2957 楼房重建(线段树)(思路)
- BZOJ 2957 楼房重建 [分块][线段树]
- [BZOJ2957]楼房重建(线段树)
- BZOJ 2957 楼房重建(线段树)(思路)
- [bzoj2957]楼房重建 线段树
- BZOJ2957 楼房重建 【线段树】
- [线段树 最长上升序列] BZOJ 2957 楼房重建
- bzoj2957: 楼房重建【线段树】
- BZOJ 2957 楼房重建(线段树)(思路)
- 中国国家队清华集训 2012-2013 第一天 BZOJ 2957 楼房重建 线段树题解
- 【线段树】BZOJ2957 楼房重建
- [BZOJ 2957] 楼房重建 线段树/分块(两种做法)
- BZOJ 2957 楼房重建(线段树)(思路)
- BZOJ 2957: 楼房重建 [线段树 信息合并]
- [BZOJ2957]楼房重建-线段树
- BZOJ 2957 楼房重建(线段树)(思路)
- Bzoj 2957: 楼房重建(线段树)
- BZOJ 2957 楼房重建(线段树)(思路)
- [bzoj2957][楼房重建] (线段树)