线段树维护单调栈

单点修改,维护元素个数。 O ( n log ⁡ 2 n ) O(n\log^2 n) O(nlog2n)

如果只是插入元素,那么二分修改即可一个log。

#include<bits/stdc++.h>
#define ll long long
using namespace std;
double Max[400010];
int sum[400010];
inline int read()
{
    char c=getchar();int x=0,flag=1;
    while(!isdigit(c)){if(c=='-') flag=-1;c=getchar();}
    while(isdigit(c)) x=x*10+c-'0',c=getchar();
    return x*flag;
}
int query(int root,int l,int r,double k)
{
    if(l==r) return Max[root]>k;
    if(Max[root]<=k) return 0;
    int mid=l+r>>1;
    if(Max[root<<1]<=k) return query(root<<1|1,mid+1,r,k);
    else return query(root<<1,l,mid,k)+sum[root]-sum[root<<1];
}
void update(int root,int l,int r,int x,double k)
{
    if(l==r)
    {
        sum[root]=1;
        Max[root]=k;
        return;
    }
    int mid=l+r>>1;
    if(x<=mid) update(root<<1,l,mid,x,k);
    else update(root<<1|1,mid+1,r,x,k);
    Max[root]=max(Max[root<<1],Max[root<<1|1]);
    sum[root]=sum[root<<1]+query(root<<1|1,mid+1,r,Max[root<<1]);
}
int main()
{
    int n=read(),m=read();
    for(int i=1;i<=m;i++)
    {
        int x=read(),y=read();
        update(1,1,n,x,1.0*y/x);
        cout<<sum[1]<<'\n';
    }
    return 0;
}

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值