P4198 楼房重建

题面

https://www.luogu.org/problem/P4198

题解

复制代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+50;
int n,m;
double a[N];
struct node{
  double mx;
  int len;
} tt[4*N];
void pushup1(int x){
  tt[x].mx=max(tt[x<<1].mx,tt[x<<1|1].mx);
}
int pushup2(double lx,int x,int l,int r){
  if (tt[x].mx<=lx) return 0;
  if (a[l]>lx) return tt[x].len;
  if (l==r) return a[l]>lx;
  int s1=x<<1,s2=x<<1|1;
  int mid=l+r>>1;
  if (tt[s1].mx<=lx) return pushup2(lx,s2,mid+1,r);
  else return pushup2(lx,s1,l,mid)+tt[x].len-tt[s1].len;
}

void chan(int x,int l,int r,int to,int c){
  if (l==r && l==to) {
    tt[x].mx=(double)c/to;
    tt[x].len=1;
    return;
  }
  int mid=l+r>>1;
  if (to<=mid) chan(x<<1,l,mid,to,c); else if (to>mid) chan(x<<1|1,mid+1,r,to,c);
  pushup1(x);
  tt[x].len=tt[x<<1].len+pushup2(tt[x<<1].mx,x<<1|1,mid+1,r);
}

int main(){
  scanf("%d %d",&n,&m);
  int x,y;
  for (int i=1;i<=m;i++) {
    scanf("%d %d",&x,&y);
    a[x]=(double)y/x;
    chan(1,1,n,x,y);
    printf("%d\n",tt[1].len);
  }
  return 0;
}
复制代码

 

posted @   HellPix  阅读(96)  评论(0编辑  收藏  举报
编辑推荐:
· Java 中堆内存和栈内存上的数据分布和特点
· 开发中对象命名的一点思考
· .NET Core内存结构体系(Windows环境)底层原理浅谈
· C# 深度学习:对抗生成网络(GAN)训练头像生成模型
· .NET 适配 HarmonyOS 进展
阅读排行:
· 本地部署 DeepSeek:小白也能轻松搞定!
· 如何给本地部署的DeepSeek投喂数据,让他更懂你
· 从 Windows Forms 到微服务的经验教训
· 李飞飞的50美金比肩DeepSeek把CEO忽悠瘸了,倒霉的却是程序员
· 超详细,DeepSeek 接入PyCharm实现AI编程!(支持本地部署DeepSeek及官方Dee
点击右上角即可分享
微信分享提示