• BZOJ 1058 报表统计


    基本思路正确。注意两点:

    1.MIN_SORT_GAP不用以第二个set实现。这个答案一定是单调的。

    2.lower_bound巨慢巨慢巨慢巨慢巨慢巨慢巨慢用lower_bound和set是10s与1h的区别。

      能不用尽量不用。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<set>
    #define maxn 1000500
    #define inf 1000000007
    using namespace std;
    int n,m,a[maxn],b[maxn],last[maxn],tot,nxt[maxn],pre[maxn],x,y,mn=inf;
    multiset <int> s1,s3;
    multiset <int> ::iterator it1,it2,it3;
    char s[10];
    int read()
    {
        char ch;int data=0,f=1;
        while (ch<'0' || ch>'9')
        {
            if (ch=='-') f=-1;
            ch=getchar();
        }
        while (ch>='0' && ch<='9')
        {
            data=data*10+ch-'0';
            ch=getchar();
        }
        return data*f;
    }
    void add1()
    {
        nxt[tot]=nxt[last[x]];pre[tot]=last[x];
        pre[nxt[last[x]]]=tot;nxt[last[x]]=tot;last[x]=tot;
        if (nxt[tot]!=-1)
        {
            it1=s1.find(abs(a[nxt[tot]]-a[pre[tot]]));
            s1.erase(it1);
            s1.insert(abs(a[nxt[tot]]-a[tot]));
        }
        s1.insert(abs(a[pre[tot]]-a[tot]));
    }
    void add2()
    {
        s3.insert(a[tot]);it1=s3.find(a[tot]);
        if (it1!=s3.begin())
        {
            it1--;
            mn=min(mn,a[tot]-*it1);
            it1++;
        }
        it1++;
        if (it1!=s3.end()) mn=min(mn,*it1-a[tot]);
    }
    int main()
    {
        n=read();m=read();tot=n;
        for (int i=1;i<=n;i++)
        {
            a[i]=read();b[i]=a[i];s3.insert(a[i]);
            last[i]=i;nxt[i]=i+1;pre[i]=i-1;
        }
        pre[1]=nxt[n]=-1;
        for (int i=1;i<=n-1;i++) s1.insert(abs(a[i+1]-a[i]));
        for (it1=s3.begin();it1!=s3.end();it1++)
        {
            if (it1!=s3.begin()) mn=min(mn,*it1-*it2);
            it2=it1;
        }
        for (int i=1;i<=m;i++)
        {
            scanf("%s",s);
            if (s[0]=='I')
            {
                scanf("%d%d",&x,&y);a[++tot]=y;
                add1();
                add2();
            }
            else if (s[4]=='S') printf("%d
    ",mn);
            else printf("%d
    ",*s1.begin());
        }
        return 0;
    }
  • 相关阅读:
    HDU 1102 Constructing Roads
    HDU 1285 确定比赛名次。
    最小生成树 HDU 各种畅通工程的题,prim和kru的模板题
    HDU Jungle Roads 1301 最小生成树、
    并查集小结(转)
    HDU hdu 2094 产生冠军 拓扑排序 判定环
    模运算(转)
    拓扑排序(主要是确定环和加法) HDU 2647 Reward
    HDU 1372 Knight Moves 简单BFS
    用计算机模型浅析人与人之间沟通方式 (一)如何谈话
  • 原文地址:https://www.cnblogs.com/ziliuziliu/p/6349449.html
Copyright © 2020-2023  润新知