• [洛谷2月月月赛]富金森林公园


    题意:给定n个点的高度,支持修改和求高度大等于给定的值的连续的段数量。n<=100000

    题解:段数=大等于高度的数量-相邻两个数的较小值大等于高度的数量。线段树或者树状数组

    复杂度nlogn

    #include<iostream>
    #include<cstdio>
    #include<algorithm>
    #define N 524288
    using namespace std;
    int read()
    {
        int x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0'; ch=getchar();}
        return x*f;
    }  
    
    int T1[N*2+5],T2[N*2+5];
    struct ques
    {
        int op,x,y;
    }c[200005];
    
    int n,m,cnt=0;
    int s[200005];
    int l[500005];
    
    int query(int*T,int l,int r)
    {
    //    cout<<"query"<<l<<" "<<r<<endl;
        int sum=0;
        for(l+=N-1,r+=N+1;l^r^1;l>>=1,r>>=1)
        {
            if(~l&1) sum+=T[l+1];
            if( r&1) sum+=T[r-1];    
        }
        return sum;
    }
    
    void renew(int*T,int x,int ad)
    {
        T[x+=N]+=ad;
        for(x>>=1;x;x>>=1)
           T[x]=T[x<<1]+T[(x<<1)+1];
    }
    
    int main()
    {
        n=read();m=read();
        for(int i=1;i<=n;i++)s[i]=l[i]=read();
        for(int i=1;i<=m;i++)
        {
            c[i].op=read();c[i].x=read();
            if(c[i].op==2) l[i+n]=c[i].y=read();
            else l[i+n]=c[i].x;
        }
        sort(l+1,l+n+m+1);
        for(int i=1;i<=n+m;i++)
           if(l[i]!=l[i-1]) l[++cnt]=l[i];
        for(int i=1;i<=n;i++)
        {
            s[i]=lower_bound(l+1,l+cnt+1,s[i])-l;
            renew(T1,s[i],1);
        }
        for(int i=1;i<=n;i++)
            renew(T2,min(s[i],s[i-1]),1);    
        for(int i=1;i<=m;i++)
        {
            if(c[i].op==1)
            {
                c[i].x=lower_bound(l+1,l+cnt+1,c[i].x)-l;
                printf("%d
    ",query(T1,c[i].x,cnt)-query(T2,c[i].x,cnt));
            }
            else 
            {
                c[i].y=lower_bound(l+1,l+cnt+1,c[i].y)-l;
                if(c[i].x!=1) renew(T2,min(s[c[i].x],s[c[i].x-1]),-1);
                if(c[i].x!=n) renew(T2,min(s[c[i].x],s[c[i].x+1]),-1);
                renew(T1,s[c[i].x],-1);s[c[i].x]=c[i].y;
                renew(T1,c[i].y,1);
                if(c[i].x!=1) renew(T2,min(s[c[i].x],s[c[i].x-1]),1);
                if(c[i].x!=n) renew(T2,min(s[c[i].x],s[c[i].x+1]),1);
            }
        }
        return 0;
    }

    提答题乱搞大概50分,34题都不会

  • 相关阅读:
    java线程
    windows Server 安装
    nginx正则反向代理
    crontab定时任务启动脚本失败
    数据结构
    异常概念
    shell日期遍历复制文件
    多态和抽象
    图1 列出连通集
    PTA 代码注意事项
  • 原文地址:https://www.cnblogs.com/FallDream/p/luogu2.html
Copyright © 2020-2023  润新知