楼房重建
题意:维护斜率看到的楼房。
思路:线段树维护一个斜率。
啊啊啊,(某次考试)调了一年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;
}

 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号