bzoj 2957 楼房重建 (线段树+思路)

Posted kls123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了bzoj 2957 楼房重建 (线段树+思路)相关的知识,希望对你有一定的参考价值。

链接: https://www.lydsy.com/JudgeOnline/problem.php?id=2957

思路:

用分块可以很简单的过掉,但是这道题也可以用线段树写。

分类讨论左区间最大值对右区间取值的影响,这样每次都只计算左右区间其中一个,复杂度就降成了logn.

 

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define mid int m = (l + r) >> 1

const int M = 1e5 + 10;
double mx[M<<2];
int sum[M<<2];
int query(double c,int l,int r,int rt){
    mid;
    if(l == r) return mx[rt] > c;
    if(mx[rt] <= c) return 0;
    if(mx[rt<<1] <= c) return query(c,rson);
    else return sum[rt] - sum[rt<<1] + query(c,lson);
}

void update(int p,double c,int l,int r,int rt){
    if(l == r){
        sum[rt] = 1;
        mx[rt] = c;
        return ;
    }
    mid;
    if(p <= m) update(p,c,lson);
    else update(p,c,rson);
    mx[rt] = max(mx[rt<<1],mx[rt<<1|1]);
    sum[rt] = sum[rt<<1] + query(mx[rt<<1],rson);
}

int main()
{
    int n,m,x,y;
    scanf("%d%d",&n,&m);
    while(m--){
        scanf("%d%d",&x,&y);
        double c = (double)y/x;
        update(x,c,1,n,1);
        printf("%d
",sum[1]);
    }
}

 

以上是关于bzoj 2957 楼房重建 (线段树+思路)的主要内容,如果未能解决你的问题,请参考以下文章

bzoj2957 楼房重建——线段树

BZOJ 2957 2957: 楼房重建 (线段树)

bzoj2957楼房重建——线段树

bzoj2957 楼房重建(线段树)

bzoj 2957: 楼房重建 线段树

[bzoj2957][楼房重建] (线段树)