P4198 楼房重建(RE:题解再改造!!)
码
#include<bits/stdc++.h>
#define MAXN 2000010
using namespace std;
int n,m;
int x[MAXN],y[MAXN],ans[MAXN];
double K[MAXN];
int query(int p,int l,int r,double maxn){
if(K[p]<=maxn) return 0;
if(l==r) return K[p]>maxn;
else if(K[p*2]<=maxn) return query(p*2+1,((l+r)>>1)+1,r,maxn);
return query(p*2,l,(l+r)>>1,maxn)+ans[p]-ans[p*2];
}
void Change(int p,int l,int r,int limit,double v){
if(l==limit&&limit==r){
ans[p]=1,K[p]=v;
return ;
}
int mid=(l+r)>>1;
if(limit<=mid) Change(p*2,l,mid,limit,v);
else Change(p*2+1,mid+1,r,limit,v);
K[p]=max(K[p*2],K[p*2+1]);
ans[p]=ans[p*2]+query(p*2+1,mid+1,r,K[p*2]);
}
int main(){
ios::sync_with_stdio(0);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x[i]>>y[i];
Change(1,1,n,x[i],(double)y[i]/x[