• 楼房重建


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

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

    啊啊啊,(某次考试)调了一年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;
    }
    
    
  • 相关阅读:
    JDom写入XML例子
    hdu 2549
    hdu 1328
    hdu 1334
    hdu 2547
    hdu 2374
    hdu 2550
    hdu 1335
    hdu 2548
    hdu 1722
  • 原文地址:https://www.cnblogs.com/akoasm/p/9419399.html
Copyright © 2020-2023  润新知