zoukankan      html  css  js  c++  java
  • FOJ2022车站 线段树区间合并

    http://acm.fzu.edu.cn/problem.php?pid=2022

    刚开始MLE,用map对应,果断爆内存了,然后改用去重,离散化, lowbound查找元素位置,速度还不错,不过pushup写也是醉了,一遍遍错,最后发现

    if(o[rt].left==INF||o[rt].right==INF||o[rt].left==o[rt].right)l=INF;这一句第三个判断必须加,发现这样可以避免那种只由一个点往上更新的错误,也是非常的伤感。。。。。

    /*96655 's source code for D
    Memory: 30072 KB        Time: 265 MS
    Language: GNU C++        Result: Accepted
    */
    #include<cstdio>
    #include<algorithm>
    #include<iostream>
    #include<cstring>
    #include<vector>
    #include<stack>
    #include<cmath>
    #include<queue>
    #include<map>
    using namespace std;
    const int maxn=500000+10;
    const int INF=1e9+7;
    struct asd
    {
        int x;
        char c;
    } q[maxn];
    bool vis[maxn];
    int a[maxn];
    struct node
    {
        int left,right,v;
    } o[maxn<<2];
    void pushup(int rt)
    {
        o[rt].left=min(o[rt*2].left,o[rt*2+1].left);
        if(o[rt*2+1].right!=INF) o[rt].right=o[rt*2+1].right;
        else   o[rt].right=o[rt*2].right;
        int l=fabs(o[rt*2].right-o[rt*2+1].left);
        if(o[rt].left==INF||o[rt].right==INF||o[rt].left==o[rt].right)l=INF;
        o[rt].v=min(min(o[rt*2].v,o[rt*2+1].v),l);
    }
    void build(int rt,int l,int r)
    {
        if(l==r)
        {
            o[rt].left=o[rt].right=o[rt].v=INF;
            return;
        }
        int m=(l+r)>>1;
        build(rt*2,l,m);
        build(rt*2+1,m+1,r);
        pushup(rt);
    }
    void change(int rt,int l,int r,int pos,int p)
    {
        if(l==r)
        {
            if(p)o[rt].left=o[rt].right=a[l-1];
            else o[rt].left=o[rt].right=INF;
            return;
        }
        int m=(l+r)>>1;
        if(pos<=m)change(rt*2,l,m,pos,p);
        else change(rt*2+1,m+1,r,pos,p);
        pushup(rt);
    }
    int main()
    {
        int T;
        char s[5];
        while(~scanf("%d",&T))
        {
            int cnt=1,sum=0,k=0;
            for(int i=1; i<=T; ++i)
            {
                scanf("%s",s);
                q[i].c=s[0];
                if(s[0]=='m')continue;
                scanf("%d",&q[i].x);
                a[k++]=q[i].x;
            }
            sort(a,a+k);
            for(int i=1; i<k; i++)
                if(a[i]!=a[i-1])a[cnt++]=a[i];
            build(1,1,cnt);
            memset(vis,0,sizeof(vis));
            for(int i=1; i<=T; i++)
            {
                if(q[i].c=='a')
                {
                    int pos=lower_bound(a,a+cnt,q[i].x)-a;
                    pos++;
                    if(vis[pos])continue;
                    vis[pos]=1;
                    ++sum;
                    change(1,1,cnt,pos,1);
                }
                else if(q[i].c=='d')
                {
                    int pos=lower_bound(a,a+cnt,q[i].x)-a;
                    pos++;
                    if(!vis[pos])continue;
                    vis[pos]=0;
                    --sum;
                    change(1,1,cnt,pos,0);
                }
                else
                {
                    if(sum<2)printf("0
    ");
                    else printf("%d
    ",o[1].v);
                }
            }
        }
        return 0;
    }
    View Code

    唯一值得欣慰的是速度还不错。。。。QAQ

  • 相关阅读:
    XAMPP安装和配置
    Myeclipse下使用Maven搭建spring boot2.0项目
    activemq学习总结 (转)Java消息队列--ActiveMq 实战
    websocket学习总结
    Redis学习总结
    (转)使用OpenGL显示图像(七)Android OpenGLES2.0——纹理贴图之显示图片
    当网卡收到的包的目的地址是主机上另一个网卡的地址.arp总结
    当网卡收到一个包的目的地址是本主机其他接口的IP时.2
    网络设置中设置失败
    当网卡收到一个包的目的地址不是自己的地址时
  • 原文地址:https://www.cnblogs.com/shuguangzw/p/4937543.html
Copyright © 2011-2022 走看看