楼房重建

题意:维护斜率看到的楼房。

思路:线段树维护一个斜率。

啊啊啊,(某次考试)调了一年OTZ.

#include<bits/stdc++.h>
using namespace std;
const int maxn = 100010;

inline int read(){
    int q=0,f=1;char ch=getchar();
    while(!isdigit(ch)){
        if(ch=='-') f=-1;ch=getchar();
    }
    while(isdigit(ch)){
        q=q*10+ch-'0';ch=getchar();
    }
    return q*f;
}

int n,m;
int x,y;
struct node{
    int cnt;
    double val;
}t[maxn<<2];
inline int query(int l,int r,int now,double val){
    if(l == r) return t[now].val > val;
    int mid = (l + r) >> 1;
    if(t[now << 1].val <= val){
        return query(mid+1,r,now<<1|1,val);
    }
    else{
        return t[now].cnt - t[now<<1].cnt + query(l,mid,now<<1,val);
    }
}
inline void modify(int l,int r,int now,int p,double val){
    if(l == r){
        t[now].cnt = 1;
        t[now].val = val;
        return;
    }
    int mid = (l + r) >> 1;
    if(p <= mid){
        modify(l,mid,now<<1,p,val);
    }
    else modify(mid+1,r,now<<1|1,p,val);
    t[now].val = max(t[now<<1].val,t[now<<1|1].val);
    t[now].cnt = t[now<<1].cnt + query(mid+1,r,now<<1|1,t[now<<1].val);
}

int main(){
    n = read(),m = read();
    for(int i = 1;i <= m; ++i){
        x = read(),y = read();
        modify(1,n,1,x,(double)(y * 1.0 / x));
        printf("%d\n",t[1].cnt);
    }
    return 0;
}

原文地址:https://www.cnblogs.com/akoasm/p/9419399.html