线段树维护单调栈

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

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

#include
#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<

你可能感兴趣的:(精髓总结/算法解析)