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